Graphing SQL Server wait stats on Prometheus and Grafana

Mis en avant

Wait stats are essential performance metrics for diagnosing SQL Server Performance problems. Related metrics can be monitored from different DMVs including sys.dm_os_wait_stats and sys.dm_db_wait_stats (Azure).

As you probably know, there are 2 categories of DMVs in SQL Server: Point in time versus cumulative and DMVs mentioned previously are in the second category. It means data in these DMVs are accumulative and incremented every time wait events occur. Values reset only when SQL Server restarts or when you intentionally run DBCC SQLPERF command. Baselining these metric values require taking snapshots to compare day-to-day activity or maybe simply trends for a given timeline. Paul Randal kindly provided a TSQL script for trend analysis in a specified time range in this blog post. The interesting part of this script is the focus of most relevant wait types and corresponding statistics. This is basically the kind of scripts I used for many years when I performed SQL Server audits at customer shops but today working as database administrator for a company, I can rely on our observability stack that includes Telegraf / Prometheus and Grafana to do the job.

Lire la suite

FinOps with Azure Cost management and Azure Log Analytics

Mis en avant

In a previous blog post, I surfaced Azure monitor capabilities for extending observability of Azure SQL databases. We managed to correlate different metrics and SQL logs to identify new execution patterns against our Azure SQL DB, and we finally go through a new compute tier model that fits better with our new context. In this blog post, I would like to share some new experiences about combining Azure cost analysis and Azure log analytics to spot “abnormal” trend and to fix it.

Lire la suite

Creating dynamic Grafana dashboard for SQL Server

Mis en avant

A couple of months ago I wrote about “Why we moved SQL Server monitoring to Prometheus and Grafana”. I talked about the creation of two dashboards. The first one is blackbox monitoring-oriented and aims to spot in (near) real-time resource pressure / saturation issues with self-explained gauges, numbers and colors indicating healthy (green) or unhealthy resources (orange / red). We also include availability group synchronization health metric in the dashboard. We will focus on it in this write-up.

Lire la suite

Extending SQL Server monitoring with Raspberry PI and Lametric

Mis en avant

First blog of this new year 2021 and I will start with a fancy and How-To Geek topic

In my last blog post, I discussed about monitoring and how it should help to address quickly a situation that is going degrading. Alerts are probably the first way to raise your attention and, in my case, they are often in the form of emails in a dedicated folder. That remains a good thing, at least if you’re not focusing too long in other daily tasks or projects. In work office, I know I would probably better focus on new alerts but as I said previously, telework changed definitely the game.

Lire la suite

Why we moved SQL Server monitoring on Prometheus and Grafana

Mis en avant

During this year, I spent a part of my job on understanding the processes and concepts around monitoring in my company. The DevOps mindset mainly drove the idea to move our SQL Server monitoring to the existing Prometheus and Grafana infrastructure. Obviously, there were some technical decisions behind the scene, but the most important part of this write-up is dedicated to explaining other and likely most important reasons of this decision.

Lire la suite

Interesting use case of using dummy columnstore indexes and temp tables

Mis en avant

Columnstore indexes are a very nice feature and well-suited for analytics queries. Using them for our datawarehouse helped to accelerate some big ETL processing and to reduce resource footprint such as CPU, IO and memory as well. In addition, SQL Server 2016 takes columnstore index to a new level and allows a fully updateable non-clustered columnstore index on a rowstore table making possible operational and analytics workloads. Non-clustered columnstore index are a different beast to manage with OLTP workload and we got both good and bad experiences on it. In this blog post, let’s talk about good effects and an interesting case where we use them for reducing CPU consumption of a big reporting query.

Lire la suite

Building a more robust and efficient statistic maintenance with large tables

Mis en avant

In a past, I went to different ways for improving update statistic maintenance in different shops according to their context, requirement and constraints as well as the SQL Server version used at this moment. All are important inputs for creating a good maintenance strategy which can be very simple with execution of sp_updatestats or specialized scripts to focus on some tables.

Lire la suite

Curious case of locking scenario with SQL Server audits

Mis en avant

In high mission-critical environments, ensuring high level of availability is a prerequisite and usually IT department addresses required SLAs (the famous 9’s) with high available architecture solutions. As stated by Wikipedia: availability measurement is subject to some degree of interpretation. Thus, IT department generally focus on uptime metric whereas for other departments availability is often related to application response time or tied to slowness / unresponsiveness complains. The latter is about application throughput and database locks may contribute to reduce it. This is something we are constantly monitoring in addition of the uptime in my company.

Lire la suite

SQL Server index rebuid online and blocking scenario

Mis en avant

A couple of months ago, I experienced a problem about index rebuild online operation on SQL Server. In short, the operation was supposed to be online and to never block concurrent queries. But in fact, it was not the case (or to be more precise, it was partially the case) and to make the scenario more complex, we experienced different behaviors regarding the context. Let’s start the story with the initial context: in my company, we usually go through continuous deployment including SQL modification scripts and because we usually rely on daily pipeline, we must ensure related SQL operations are not too disruptive to avoid impacting the user experience.

Lire la suite

Monitoring Azure SQL Databases with Azure Monitor and Automation

Mis en avant

Supervising Cloud Infrastructure is an important aspect of Cloud administration and Azure SQL Databases are no exception. This is something we are continuously improving at my company.

On-prem, DBAs often rely on well-established products but with Cloud-based architectures, often implemented through DevOps projects and developers, monitoring should be been redefined and include some new topics as:

Lire la suite

AAD user creation on behalf AAD Service Principal with Azure SQL DB

Mis en avant

An interesting improvement was announced by the SQL AAD team on Monday 27th July 2020 and concerns the support for Azure AD user creation on behalf of Azure AD Applications for Azure SQL as mentioned to this Microsoft blog post.

Lire la suite

Dealing with SQL Server on Linux on WSL2

Mis en avant

This is a blog post I intended to write sometime ago … about using SQL Server on Linux on WSL2. For whom already installed it on Windows 10, version 2004, you are already aware it doesn’t come with the support of systemd. Indeed, although it does exist in the file system, systemd is not running. If you intend to use directly SQL Server on WSL2, you need to read this carefully, because installation and management relies precisely on systemd!

Lire la suite

Universal usage of NVARCHAR type and performance impact

Mis en avant

A couple of weeks, I read an article from Brent Ozar about using NVARCHAR as a universal parameter. It was a good reminder and from my experience, I confirm this habit has never been a good idea. Although it depends on the context, chances are you will almost find an exception that proves the rule.

Lire la suite

dbachecks and AlwaysOn availability group checks

Mis en avant

When I started my DBA position in my new company, I was looking for a tool that was able to check periodically the SQL Server database environments for several reasons. First, as DBA one of my main concern is about maintaining and keeping the different mssql environments well-configured against an initial standard. It is also worth noting I’m not the only person to interact with databases and anyone in my team, which is member of sysadmin server role as well, is able to change any server-level configuration settings at any moment. In this case, chances are that having environments shifting from our initial standard over the time and my team and I need to keep confident by checking periodically the current mssql environment configurations, be alerting if configuration drifts exist and obviously fix it as faster as possible.

Lire la suite

SQL Server on Linux and new FUA support for XFS filesystem

Mis en avant

I wrote a (dbi services) blog post concerning Linux and SQL Server IO behavior changes before and after SQL Server 2017 CU6. Now, I was looking forward seeing some new improvements with Force Unit Access (FUA) that was implemented with Linux XFS enhancements since the Linux Kernel 4.18.

Lire la suite

Database maintenance thoughts with Azure SQL databases

Mis en avant

As DBA, your priority is to ensure your data are consistent, safely backed up and you get steady performance of your database. In on-prem environments, these tasks are generally performed through scheduled jobs including backups, check integrity and index / statistics maintenance tasks.

But moving databases to the cloud in Azure (and others) tells a different story. Indeed, even if the same concern and tasks remain, some of them are under the responsibility of the Cloud provider and some other ones not. If you’re working with Azure SQL databases – like me – some questions raise very quickly on this topic and it was my motivation to write this write-up. I would like to share with you some new experiences by digging into the different maintenance items. If you have a different story to tell, please feel free to comment and to share your own experience!

Lire la suite

Availability Group 2017 Direct seeding and updated default path policy

Mis en avant

A couple of days ago, I ran into an issue when adding a new database in direct seeding mode that led me to reconsider refreshing my skills on this feature. Going through the AG database wizard for adding database, I faced the following error message …

Lire la suite

Mitigating Scalar UDF’s procedural code performance with SQL 2019 and Scalar UDF Inlining capabilities

Mis en avant

A couple of days ago, I read the write-up of my former colleague @FranckPachot about refactoring procedural code to SQL. This is recurrent subject in the database world and I was interested in transposing this article to SQL Server because it was about refactoring a Scalar-Valued function to a SQL view. The latter one is a great alternative when it comes performance but something new was shipped with SQL Server 2019 and could address (or at least could mitigate) this recurrent scenario.

Lire la suite

SQL DB Azure, performance scaling thoughts

Mis en avant

Let’s continue with Azure stories and performance scaling …

155 - 0 - banner

A couple of weeks ago, we studied opportunities to replace existing clustered indexes (CI) with columnstore indexes (CCI) for some facts. To cut the story short and to focus on the right topic of this write-up, we prepared a creation script for specific CCIs based on the Niko’s technique variation (no MAXDOP = 1 meaning we enable parallelism) in order to get a better segment alignment.

Lire la suite

Configuring Integrated Windows Authentication with SSRS and SQL DB Azure

Mis en avant

Today let’s talk about Cloud and Azure. My new job gives me now the opportunity to work in a hybrid environment with some components hosted in a cloud including SQL Azure Databases. To get straight to the point, PaaS databases are different beasts and I my confirm DBA role is shifting to another dimension. The focus is more on providing higher value in the architecture design and tuning because resources are a big concern, at least in a different order of magnitude, because they are now treated as operational expenses (OpEx). Entering now in a World of code as infrastructure, provisioning such service has become an easy game and can be automated through Cloud provider APIs and specialized tools. My colleagues already did a lot of good jobs on this topic.

Lire la suite

Collaborative way and tooling to debug SQL Server blocked processes scenarios

Mis en avant

A quick blog post to show how helpful an extended event and few other tools can be to help fixing orphan transactions in a real use case scenario. I often gave training with customers about SQL Server performance and tools, but I noticed how difficult it can be to explain the importance of a tool if you only explain theory without any illustration with a real customer case.
Well, let’s start my own story that began a couple of days ago with an SQL alert to indicate a blocking scenario issue. Looking at our SQL dashboard (below), we were able to confirm quickly we are running into an annoying issue and it would be getting worse over if we do nothing.

Lire la suite

SQL Server service broker and curious duplicate messages case

Mis en avant

One of my last write-up to finish the year 2019. A couple of days ago, I ran into an interesting issue concerning a service broker architecture. Let’s introduce quickly the context: this is a start-based architecture with one target and more than 80 initiators as shown below:

Lire la suite

Introducing SQL Server with Portworx and storage orchestration

Mis en avant

Stateful applications like databases need special considerations on K8s world. This is because data persistence is important and we need also something at the storage layer communicating with the container orchestrator to take advantage of its scheduling capabilities. For Stateful applications, StatefulSet may be only part of the solution because it primary focuses on the Pod availability and we have to rely on the application capabilities for data replication stuff. But StatefulSet doesn’t address that of the underlying storage at all. At the moment of this write-up, StatefulSet-based solutions for SQL Server such availability groups are not supported yet on production.

Lire la suite

SQL Server sur Docker et réseau bridge

Mis en avant

Continuous sur la série des billets à propos de SQL Server sur Docker. Il y a quelques jours, j’étais chez un client qui avait déjà implémenté SQL Server 2017 sur Linux dans des containers. Ce fût évidemment une journée très enrichissante avec beaucoup de retour d’expérience et de feedbacks de sa part. Nous avons beaucoup discuté de scénarii d’architectures.

Le point intéressant ici est que j’ai pu comparer le scénario en place avec celui d’un autre client qui avait implémenté depuis un moment mais d’une façon toute à fait différente.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Recherche d’index et IO résiduels

Mis en avant

Ce billet fait suite au précédent à propos des recherches d’index et les pièges associés. J’ai pu rencontrer un autre cas intéressant mais ce n’est pas tellement la nature du problème qui m’a décidé à écrire mais plutôt les différentes façons qu’il existe de l’appréhender.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server sur Docker Swarm

Mis en avant

SQL Server 2017 est disponible sur de multiples plateformes: Windows, Linux et Docker. La dernière plateforme fournit des fonctionnalités de containerisation avec setup rapide et sans prérequis spécifiques avant d’exécuter des bases de données SQL Server qui sont probablement la clé du succès pour les développeurs.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server sur Linux et journalisation

Mis en avant

Dans un monde Windows, SQL Server journalise les informations dans le journal des erreurs SQL et dans le journal d’application Windows. Les deux systèmes horodatent automatiquement les événements. Contrairement au journal des erreurs SQL Server, le journal d’événements Windows fournit une image plus globale des événements passés sur le système d’exploitation. Ainsi en fonction des erreurs rencontrées, l’analyse d’un tel journal – que ce soit depuis l’observateur d’éléments Windows ou via le cmdlet PowerShell Get-EventLog – peut être bénéfique pour comprendre si celles-ci sont uniquement liées à SQL Server ou s’il existe une corrélation avec des erreurs provenant du système d’exploitation.

Mais qu’en est-il de SQL Server sur Linux? Evidemment, nous pouvons bénéficier des mêmes technologies de journalisation. Comme sur Windows, SQL Server journalise l’information dans le journal des erreurs SQL Server localisé dans le répertoire /var/opt/mssql/log and dans les différents journaux Linux prévus à cet effet.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Déplacer des tables en ligne vers des groupes de fichiers avec contraintes et LOB

Mis en avant

Commençons cette semaine en revenant sur une discussion intéressante que j’ai eu avec un de mes clients pour déplacer plusieurs tables vers différents groupes de fichiers. Certaines d’entre elles contenaient des données LOB. Ajoutons à cela une contrainte supplémentaire du client: déplacer tout ce petit monde en ligne pour éviter d’impacter la disponibilité des données durant le processus de migration. Les tables concernées possèdaient des contraintes de schéma comme une clé primaire et des clés étrangères ainsi que des index non cluster. Finalement quelque chose de plutôt classique avec lequel nous pouvons avoir à faire tous les jours chez les clients.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Expérimentation d’une mise à jour de statistiques sur une grosse table par des voies détournées

Mis en avant

Ceci est mon premier blog de l’année 2018 et depuis un moment d’ailleurs. En effet, l’année dernière j’ai mis toute mon énergie à réajuster mes connaissances Linux avec la nouvelle stratégie Open Source de Microsoft. Mais en même temps, j’ai réalisé un certain nombre de tâches intéressantes chez certains clients et en voici une pour commencer cette nouvelle année. Dans ce billet, j’aimerai souligner une approche particulière (selon moi) pour optimiser une mise à jour de statistiques pour une grosse table.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Saturday Toulouse 2017: SQL Server sur Linux – les slides

Mis en avant

#SQLSatToulouse a été un bon cru. Premierèment, je voudrais remercier chaleureusement l’équipe organisatrice (@Guss et @Fredg_31) ainsi que les sponsors et participants (sans qui ce qui ce genre d’événement ne serait pas possible).

blog-124-sqlonlinuxsqlsattoulouse-e1505723769237

Comme promis, vous trouverez les slides de ma session « Introduction to SQL Server on Linux for DBAs« . Définitivement un bon moment de partage.

Merci à tous!

David Barbarin
MVP & MCM SQL Server

SQL Server sur Linux: Introduction à DBFS

Mis en avant

Il y a quelques mois, Microsoft annonçait 2 outils en lignes de commandes supplémentaires pour SQL Server avec notamment mssql-scripter et DBFS. Le dernier a tout particulièrement attiré mon attention car il expose les données en temps réels depuis les fameuses DMVs sur un pseudo système de fichiers virtuel à la façon Linux procfs.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

24 HOP French edition 2017 – Les vidéos de session sont disponibles

Mis en avant

La seconde édition française des 24HOP est terminée et il y a eu de très bonnes sessions avec des sujets variées (SQL Server 2017 nouvelles fonctionnalitées, Azure, PowerBI, Haute disponibilité, Linux, Hyper-convergence, Modélisation …).

24hopsqlinuxha

Si vous n’avez pas pu participé à cet événement, vous avez encore la possibilité de regarder les vidéos des sessions. De mon côté c’était l’occasion de partager avec vous les dernières nouveautés SQL Server haute disponibilité sur Linux.

David Barbarin
MVP & MCM SQL Server

SQL Server 2017 – Haute disponibilité et Resumable Online Index

Mis en avant

Assurer la disponibilité des données est une part importante dans le design d’une architecture haute disponibilité. Les fonctionnalités AlwaysOn (FCIs et AGs) permettent de solutionner certains aspects du problème mais nous pouvons aussi utiliser les fonctionnalités online pour maximiser cette disponibilité. En effet, pour certaines charges de travail critique, les opérations offline durant les phases de maintenance ne sont souvent pas permises et peuvent compromettre le système tout entier.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Prochaine édition des 24 HOP 2017 francophone

Mis en avant

La prochaine édition du 24 Hours of PASS 2017 edition francophone se déroulera les 29-30 juin prochain.

Pour rappel le format est simple: 24 webinars gratuits répartis sur 2 jours de 07:00 à 18h00 GMT et en Français. La seule obligation: s’inscrire aux sessions auxquelles vous assisterez. Cela vous permettra également de récupérer l’enregistrement vidéo si vous voulez la visionner à nouveau par la suite.

Cette année il y en aura encore pour tous les goûts. Du monitoring, de la performance, de l’Azure, de la BI, du BigData et machine learning, de la modélisation, de la haute disponibilité, de l’open source et des nouveautés concernant la prochaine version de SQL Server!

Pour ma part j’aurai le privilège de présenter une session concernant les nouvelles possibilités en terme de haute disponibilité avec SQL Server dans un monde mixte (Windows et Linux) et un monde “full Linux”.

24HOP-Website-Banner-French-e1496143231714

Au plaisir de vous y retrouver!

David Barbarin
MVP & MCM SQL Server

SQL Server 2017 – Linux et scénarios log shipping

Mis en avant

Dans ce billet, nous aborderons la fonctionnalité logshipping disponible depuis SQL Server CTP 2.0. Précisons d’abord que c’est une fonctionnalité HA OS-agnostic et qu’il est possible de créer sa propre solution custom même sous Linux (via des jobs cron par exemple). Mais il s’agit ici de parler de la solution out-of-the-box disponible maintenant sous Linux …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2017 – groups de disponibilités et architectures read-scale

Mis en avant

Comme vous le savez sans doute Microsoft a annoncé durant le dernier Data Amp le prochain nom officiel de SQL Server qui sera SQL Server 2017 (sans grand surprise pour être honnête).

Dans mon premier billet, j’avais écrit au sujet du support des groupes de disponibilités étendu sur Linux. Actuellement nous en sommes à la CTP 1.3. Pour rappel, lors des précédentes CTP, les listeners n’étaient pas vraiment utilisables d’une part car non persistent durant les bascules et d’autre part parce qu’ils ne fournissaient pas encore le support de redirection transparente. Avec la nouvelle CTP 2.0, nous pouvons maintenant remarqué du nouveau dans ce domaine …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server sur Linux et expérimentation d’architecture flexible

Mis en avant

Dans ce billet abordons une installation dite optimisée de SQL Server sur un système de fichier Linux. Ceci est probablement une des premières étapes qui vient à l’esprit d’un administrateur de bases de données. Actuellement une installation basique de SQL Server peut être résumée à l’utilisation d’une commande yum et de laisser l’installeur de SQL Server placer automatiquement ses fichiers sur le système de fichier. Mais dans un environnement de production réel, l’histoire est tout à fait différente et nous suivons habituellement les bonnes pratiques SQL Server en la matière. En réalité il existe déjà un certain nombre de bonnes pratiques en la matière mais pour un environnement Windows uniquement. Mais qu’en est-il pour une installation sur Linux?

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Speaker aux prochains SQLNexus 2017 Copenhage

Mis en avant

Le 2 main prochain, j’aurai l’opportunité de présenter une session sur les groupes de disponibilités 2016 au prochain SQLNexus à Copenhage (du 1 au 3 mai). Si le temps me le permet j’ajouterai un petit bonus concernant la prochaine version de SQL Server (SQL vNext de son nom actuel).

SQL_Nexus2017_1200x627px_linkedIn_post_template_test-e1488544302625

C’est aussi une excellente occasion d’assister à d’autres sessions données par des speakers de renommée internationale comme David Klee, Edwin M Sarmiento, Wolfgang Strasser et Uwe Ricken pour en nommer quelques uns ..

Rendez-vous là-bas!

Introduction des groupes de disponibilités sur Linux

Mis en avant

Il y a quelques semaines, Microsoft a sorti la CTP 1.3 de SQL Server vNext incluant des fonctionnalités dont une qui m’intéressait particulièrement à savoir le support des groupes de disponibilités sur Linux! C’est certainement une bonne nouvelle parce qu’il est question de nouvelles façons de concevoir la haute disponibilité dans le paysage SQL Server. Il y a également beaucoup d’autres améliorations que nous étudierons au fil du temps mais dans ce premier blog, je vous propose de regarder les nouvelles options de configuration AlwaysOn.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Cluster à basculement SQL Server sur Linux and synchronisation des uids/gids entre les noeuds

Mis en avant

Dans un précédent billet, je discutais de SQL Server sur Linux et la haute disponibilité. Au cours de mes tests, j’ai utilisé un serveur NFS pour le partage des ressources disques entre mes nœuds de cluster comme spécifié dans la documentation Microsoft. Il y a quelques jours, j’ai décidé d’ajouter un quatrième noeud (LINUX04) à mon infrastructure de cluster et je m’attendais à réaliser ce travail facilement mais il n’en a pas été ainsi. En effet j’ai du faire face à un problème que je n’avais jamais eu auparavant sur cette infrastructure.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server AlwaysOn – Groupes de disponibilités distribués, lecture seule et round-robin

Mis en avant

L’écriture de ce billet vient initialement d’une discussion concernant les capacités en lecture des réplicas secondaires dans un contexte de groupe de disponibilité distribué. Au départ, les groupes de disponibilité distribués sont conçus pour traiter les scénarios D/R et certains types de scénarios de migration. J’ai d’ailleurs déjà discuté d’un scénario de migration possible ici. Cependant, nous pouvons également tirer parti de l’utilisation de réplicas secondaires en lecture seule dans les scénarios de reporting …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Présentation de la haute disponibilité et scénario multi sous-réseau avec SQL Server sur Linux

Mis en avant

Dans mon premier blog concernant SQL Server sur Linux, j’ai présenté la nouvelle fonctionnalité de haute disponibilité qui concerne uniquement SQL Server et les instances de cluster à basculement jusqu’à présent. Durant cette phase de découverte, j’ai eu la chance d’avoir le support de Mihaela Blendea (@MihaelaBlendea) de chez Microsoft pour clarifier certains nouveaux aspects d’architecture. Premièrement, je voudrais la remercier car c’est toujours un plaisir d’avoir une certaine disponibilité de la part de Microsoft dans ce cas.

Mais après avoir finalisé cette installation, j’étais déjà intéressé de réaliser cette opération mais dans des scénarios plus complexes comme les instances à basculements multi sous-réseaux que j’ai pu voir chez certains clients.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Présentation de la haute disponibilité SQL Server sous Linux

Mis en avant

Il y a quelques mois, j’ai effectué ma première installation de SQL Server sur Linux. A cette occasion, j’ai écrit un billet sur le sujet. Avec cette nouvelle année 2017, il est maintenant temps d’aborder la haute disponibilité SQL Server sur Linux. Utiliser des instances standalone conviendront parfaitement pour la plupart des scénarios mais j’imagine que l’utilisation de la haute disponibilité avec les environnements critiques reste obligatoire. Actuellement il est possible d’utiliser les instances SQL Server à basculement (FCI) avec une couche cluster basée sur Red Hat et son add-on basé sur PaceMaker.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Gérer le nouvel état de quarantaine du cluster 2016 avec les groupes de disponibilités

Mis en avant

J’étais en train de jouer avec mon environnement de lab incluant une infrastructure haute disponibilité sous Windows Server 2016 et SQL Server 2016. Au cours d’une de mes simulations de panne d’un des nœuds du cluster, j’ai pu remarqué qu’il n’était pas possible de remettre immédiatement en ligne le nœud concerné avec les moyens conventionnels.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

MS Cloud Summit Paris 2017

Mis en avant

Une nouvelle année commence et 2017 devrait être un bon cru dans le domaine de la base donnée notamment en prédiction des effets d’annonces faites par Microsoft cette fin d’année 2016. En effet, il a été notamment été question de la prochaine vNext de SQL Server qui sera porté sous Linux ainsi que des nouvelles fonctionnalités prometteuses. A l’habitude, nous essaierons de couvrir les différents sujets au cours cette année. N’hésitez pas à revenir de temps en temps jetez un coup d’œil sur d’éventuels nouveaux posts!

Mais avant de parler de la prochaine version de SQL Server, attardons nous à la version courante – SQL Server 2016 – qui offre d’ores et déjà des améliorations et nouvelles possibilités intéressantes dans plusieurs domaines qu’il s’agisse de la performance, la haute disponibilité, la sécurité et bien d’autres. Par ailleurs, une autre nouvelle importante qui intéressera la plupart de nos clients est la sortie récente du SP1 de SQL Server 2016 et qui permet une homogénéisation de la surface des fonctionnalités entre les différentes éditions. Il sera notamment possible d’utiliser la compression, le partitionnement ou les index columnstore avec une édition standard par exemple. Je ne suis pas devin mais je pense ne pas me tromper en disant que cette année je verrais pousser quelques infrastructures 2016 dans les écosystèmes de nos clients!

En tout cas, pour commencer du bon pied avec cette nouvelle version de SQL Server, un événement francophone à inscrire absolument dans vos agendas est le MS Cloud Summit qui se déroulera à Paris à partir 23 janvier prochain. Cet événement se veut beaucoup plus large que les journées SQL Server que vous connaissez certainement déjà. Le MS Cloud Summit, c’est 600 participants attendus, 7 tracks avec 72 sessions autour du cloud, des scénarios hybrides et on-premises.  Pour ma part, je serai présent avec dbi services et j’aurai le plaisir de vous présenter les nouveautés dont vous bénéficierez en termes de haute disponibilité et plan de récupération avec le couple gagnant Windows 2016 et SQL Server 2016.

MS Cloud Summit

Au plaisir de vous y retrouver. D’ici là je vous souhaite une très bonne année 2017 !

David Barbarin
MVP & MCM SQL Server

Migrer une infrastructure AlwaysOn existante vers SQL Server 2016

Mis en avant

Avez-vous déjà des plans pour migrer une infrastructure de groupes de disponibilités 2012 vers Windows Server 2016 et SQL Server 2016? Dans un billet précédent, j’ai abordé un scénario de migration cross-clusters mais c’est fois le scénario n’est plus le même parce qu’il s’agit d’effectuer la migration sur place. Une question qui probablement vous concernera cette nouvelle année et si l’on regarde de plus près les améliorations livrées avec ces nouvelles versions, vous ne serez pas déçu.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016: Groupes de disponibilités et réplicas en cascade

Mis en avant

Durant le dernier MVP Summit, nous avons eu des discussions intéressantes sur les groupes de disponibilités avec l’équipe Microsoft SQL Server et je me suis souvenu que quelqu’un avait demandé la possibilité de pouvoir gérer des scénarios similaires à Oracle et les destinataires en cascade. La bonne nouvelle en réalité c’est que ce type de scénario est déjà envisageable avec les groupes de disponibilités distribuées version 2016. Rien de bien confidentiel ici donc :) Par exemple, prenons le cas où d’une architecture composée d’un grand nombre de réplicas en lecture seule qui supporte la charge en lecture seule des applications de Reporting.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Première installation de SQL Server sur Linux Red Hat 7.2

Mis en avant

Les premières annonces de Microsoft sur la sortie d’une version sous Linux sont prometteuses. Bien entendu nous sommes loin d’une version finale et la liste des fonctionnalités non supportées sera probablement un bon indicateur de la maturité du produit avec le temps. Comme beaucoup de gens je suppose, je n’ai pas attendu longtemps pour tenter une première installation sur Linux. Le processus d’installation semble bien documenté et ca sera l’occasion de partager mes premières impressions.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Groupes de disponibilités AlwaysOn and problème de statistique sur les secondaires

Mis en avant

Je voudrais partager avec vous un problème intéressant de statistiques que vous pouvez rencontrer avec les réplicas en lecture seule dans une infrastructure de groupe de disponibilités. Pour ceux qui les utilisent pour des besoins de Reporting, continuez la lecture de ce billet car il s’agit d’un problème de comportement de mise à jour de statistiques sur ceux-ci pouvant impliquer un problème d’estimation de cardinalités pouvant avoir de graves conséquences sur les performances de vos requêtes.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016: Groupes de disponibilités distribués et migration cross cluster

Mis en avant

Comment migrer un environnement de groupes de disponibilités d’un cluster à un autre? Ce scénario n’est pas commun et requiert une bonne préparation. La façon d’effectuer la migration dépend bien entendu des tâches à réaliser. En effet, il existe beaucoup de scénarios possibles selon l’architecture en place ainsi que les contraintes spécifiques liées au client en terme de d’indisponibilité par exemple. Parmi tous ces scénarios, il existe un processus appelé « migration cross cluster » qui implique la migration de l’infrastructure AlwaysOn entre 2 cluster différents. Dans ce billet, je voudrais porter une attention particulière à ce type de scénario et les améliorations existantes dans ce domaine avec SQL Server 2016.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 SP1 and fonctionnalités entreprises disponibles!

Mis en avant

Avec la sortie du SP1 de SQL Server 2016, vous aurez probablement remarqué que l’édition standard bénéficiera de nouvelles fonctionnalités précédemment disponibles uniquement qu’avec une édition entreprise. Il est question notamment des fonctionnalités concernant la performance, le Data Warehousing et la sécurité. Eh oui, ceci n’est pas une blague mais bien la réalité et ceci donnera une bonne raison aux clients de migrer vers SQL Server 2016!

sql2016sp1-e1479317371443

Bien entendu nous pouvons nous attendre à quelques limitations en terme de scalabilité pour les fonctionnalités telles que les tables In-Memory ou les index columnstore mais c’est déjà un bon point de départ. Microsoft semble vouloir adopter une approche plus consistante sur la disponibilité de ces fonctionnalités aux travers des différentes éditions telle qu’elle l’applique déjà sur Azure où le choix de l’édition se fait plus en fonction des ressources que des fonctionnalités.

Bonne installation!

Utiliser SQL Server sur n’importe quelle plateforme

Mis en avant

Utiliser SQL Server sur n’importe quelle plateforme n’est plus un rêve. Microsoft a annoncé la première release CTP1 de sa prochaine version sur Linux aujourd’hui!

sqlserverlinux

SQL Server multiplateforme ca veut dire un support sur Windows, Mac (via Docker), sur une machine physique ou virtuelle et sur Docker!

Le téléchargement c’est par ici.

David Barbarin
MVP & MCM SQL Server

Partitionnement: Lorsqu’un mouvement de données n’est pas réalisée comme attendue

Mis en avant

Dans ce billet, il est question d’un cas de partitionnement intéressant avec un comportement curieux de mouvement de données (du moins à première vue). J’étais chez mon client qui utilise de manière intensive le partitionnement pour diverses raisons incluant l’archivage et la facilité de gestion. Il y a quelques jours, nous avons décidé de tester un script fraîchement développé qui prendra en charge l’archivage des partitions sur un environnement de qualité.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016: TRUNCATE PARTITIONS et scénarios Sliding Window

Mis en avant

Il y a quelques temps, j’ai eu à gérer un scénario de partitionnement incluant une gestion sliding Window pour principalement des besoins d’archivage. Concernant le contexte client, j’ai utilisé des scripts de gestion automatique composée d’une étape de suppression de la partition la plus ancienne. Dans ce contexte précis, les données au delà de 2 ans peuvent être supprimées et généralement dans ce cas, j’utilise une méthode consistant à supprimer les données en les déplaçant depuis la partition la plus ancienne vers une table de staging. Ensuite je les supprime en utilisant la commande TRUNCATE. Finalement, nous pouvons à ce moment précis fusionner en tout sécurité les données de la partition la plus ancienne en évitant un quelconque mouvement de données. Au premier coup d’œil, le processus semble complexe mais jusqu’à la version 2014, il n’y avait pas de meilleur choix pour minimiser l’enregistrement des opérations dans le journal.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Lorsqu’une recherche d’index n’est pas forcément adéquate

Mis en avant

N’avez-vous jamais considéré une recherche d’index comme un problème? Laissez moi vous raconter une histoire avec un de mes clients avec un contexte simple: une requête spécifique qui n’était pas dans les valeurs acceptables de performance exigées (environ 200ms de temps d’exécution moyen). Le plan d’exécution associé de la requête était similaire à ce que vous pouvez voir ici

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Les 24 heures du PASS (24HOP) – édition francophone

Mis en avant

24hour_pass

Cette année a eu lieu la première édition francophone des 24h du PASS (les 20 et 21 septembre 2016). L’idée était plutôt simple: proposer une série de 24 webinaires gratuits de 10h jusqu’à 22h (heure française) pendant 2 jours. C’était l’occasion de recevoir et d’échanger les dernières informations autour de l’administration et du développement des bases de données, des nouvelles tendances côté Business Intelligence et du Cloud.

Pour ma part, c’est avec plaisir que j’ai eu l’occasion d’échanger avec vous autour de 2 sujets: tempdb et bonnes pratiques ainsi que des columnstore et leur implication dans les nouvelles tendances d’architecture BI avec Thoi Dung TSP Microsoft Switzerland.

C’est encore l’occasion de remercier les sponsors et Isabelle sans qui ce type d’événement n’aurait certainement pas eu lieu.

Les slides et démos devraient arriver sous peu!

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : Les groupes de disponibilités basiques peuvent aussi correspondre à vos besoins HA

Mis en avant

Dans ce billet, attardons nous un moment sur les groupes disponibilités 2016 en édition standard. J’ai eu quelques questions clients sur l’existence de limitations concernant cette édition and c’est une bonne occasion de les revoir ici. Premièrement, ces limitations ont été documenté par Microsoft dans la BOL et de mon côté, j’avais déjà écrit un billet à ce sujet au moment des versions CTP. Entre temps, certains changements sont apparus et sont maintenant inclus dans la version finale RTM.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server AlwaysOn: amélioration de diagnostique avec les nouveaux services packs – Part II

Mis en avant

Dans mon précédent blog, j’ai abordé une première partie des améliorations livrés avec les SP2 (SQL2014) et SP3 (SQL2012). Dans ce billet, je parlais des améliorations concernant la détection et le diagnostique de latence de réplication de groupes de disponibilités. Pour rappel, la latence de réplication entre différents réplicas peut être surveiller de différentes manières jusqu’à présent.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server AlwaysOn: nouveaux services packs et nouvelles techniques de diagnostiques – Part I

Mis en avant

Comme vous le savez déjà certainement tous, le service pack 2 de SQL Server 2014 est sorti il y a quelques temps et propose d’intéressantes améliorations qui concerne les groupes de disponibilités AlwaysOn. En fait les mêmes améliorations sont inclus dans le SP3 de SQL Server 2012. Parmi toutes les corrections et les améliorations, je voudrais me concentrer sur ceux décrits dans les KB3173156 et KB3112363. Dans ce premier billet, il sera question uniquement de celui qui concerne le fameux lease timeout qui fait parti du modèle de santé AlwaysOn

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 AlwaysOn: direct seeding et sauvegardes

Mis en avant

Comme promis dans mon blog précédent, nous allons parler maintenant de direct seeding et des sauvegardes. Nous avons trouvé une valeur intéressante d’état courant (LIMIT_CONCURRENT_BACKUPS) depuis un événement étendu nommé hadr_automatic_seeding_state_transition. Comme expliqué la dernière fois, cette valeur parle d’elle même et c’est pourquoi nous allons essayer d’effectuer une sauvegarde concurrente lorsque la base de données est concernée par une session de seeding active.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 AlwaysOn: Direct seeding et performance

Mis en avant

Ce billet fait suite à celui-ci concernant l’introduction de direct seeding avec SQL Server 2016. Pour rappel, j’avais quelques doutes concernant l’utilisation de direct seeding avec les bases de données volumineuses parce que le flux de données n’était pas compressée par défaut mais c’était sans me rappeler des améliorations de performances décrites dans la BOL. Je me suis également rappelé d’en avoir parlé il y a quelques mois maintenant dans ce billet.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Saturday 510 – Locks, latches et spinlocks – Les slides

Mis en avant

Cette année les gens ont encore répondu présent au SQLSaturday à Paris qui devenu incontournable pour ceux qui aiment échanger autour de la donnée avec les produits Microsoft. Par ailleurs, le temps a plutôt été au rendez-vous cette année et la vue depuis le 40ème étage de la tour Montparnasse est toujours aussi impressionnante.

Pour ma part, j’ai eu le plaisir d’animer une session en fin de journée sur la concurrence d’accès mais vu depuis SQL Server avec 3 principaux mécanismes utilisés comme les locks, latches et spinlocks.

> Lire la suite

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 AlwaysOn: groupes de disponibilités distribués

Mis en avant

Cette fois, nous allons parler des groupes de disponibilités distribués. Que sont ils exactement? Pour faire court, on pourrait le définir par un groupe de groupes de disponibilités. Ca sonne bien non? Mais dans quels contextes pourrions nous avoir besoin d’une telle architecture? Premièrement disons que les groupes de disponibilités distribués fonctionneront au dessus de 2 groupes de disponibilités distincts qui résident eux mêmes sur 2 cluster à basculements distincts avec le propre gestion du quorum et de votes …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 AlwaysOn: Ajout de bases de données avec direct seeding

Mis en avant

Dans ce billet, je voudrais vous parler de 2 nouvelles fonctionnalités arrivées avec SQL Server 2016 et les groupes de disponibilités. La première concerne direct seeding (honnêtement je n’ai pas trouvé de traduction pertinente ici) et la deuxième concerne les groupes de disponibilités distribués (DAG). Je parlerais de la deuxième dans un autre billet …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server AlwaysOn: Est-ce que ma base de données est prête à basculer?

Mis en avant

Dans ce billet, je voudrais juste clarifier certaines valeurs dans la colonne is_failover_ready de la DMV sys.dm_hadr_database_replica_cluster_states. Il y a quelques jours, j’ai eu une discussion intéressante avec un de mes clients qui m’expliquait qu’il n’était vraiment sûr de l’état d’un de ses groupes de disponibilités après avoir eu quelques soucis …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Windows Failover Cluster: Introduction à la notion de paxos tag

Mis en avant

Il y a quelques jours, mon collègue Nathan Courtine et moi étions en charge d’une nouvelle implémentation d’une infrastructure AlwaysOn à base de groupes de disponibilités. Une des étapes importantes dans notre approche consiste à éprouver l’architecture en place face à différents simulation de problème qui pourraient potentiellement survenir. Notre matrice de test inclus un scénario de récupération suite à un désastre avec redémarrage en mode quorum forcé.

Redémarrer un cluster à basculement dans un tel mode implique l’exécution de routines internes sur la base de données interne d’un cluster. Cette dernière utilise notamment un algorithme nommé Paxos pour garantir que les changements survenus sur un nœud soient répliqués de manière atomique sur le reste de membres de la topologie. Qu’est que Paxos exactement? Pour être honnête, j’avais déjà certains enregistrements dans le journal du cluster évoquant ce sujet et je n’avais jamais vraiment pris le temps de regarder plus précisément à quoi cela correspondait …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Exécution de procédures stockées peuvent échouer avec les index columnstore non cluster

Mis en avant

Dans ce billet, je voudrais parler d’une autre situation un peu étrange au premier coup d’œil avec les index columnstore non cluster. Précisions que je suis dans le même contexte que dans ce billet précédant. Pour rappel, il était question de profiter des index columnstore après avoir installé SQL Server 2012 chez un de mes clients. Comme démontré dans le précédant billet, ce type d’implémentation peut engendrer d’autres problématiques and c’est ce que je voudrais vous montrer ici …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Switch partition et inconsistance de métadonnées

Mis en avant

Dans ce billet, je voudrais partager un bien étrange problème auquel j’ai été confronté lors d’une implémentation de partition en mode sliding Windows avec SQL Server 2014 SP1.
Pour situer rapidement le contexte, l’idée était de pouvoir stocker pendant 2 ans les enregistrements d’audit de plusieurs instances SQL Server dans une table d’archive globale. Les données au delà de 2 ans devaient être supprimées. Sur la base d’une première implémentation, nous avons estimé une taille globale de 800GB par année …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Columnstore index rebuild cannot start

Mis en avant

Il y a quelques semaines,j’étais en charge de migrer une infrastructure Datawarehouse sur une version plus récente de SQL Server (passage de 2005 à 2012). Après discussion avec le client nous avons décidé de profiter des nouvelles fonctionnalités offertes par 2012 et en particulier des index columnstore qui pouvaient potentiellement améliorer les performances de Reporting dans le contexte présent …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Renouvellement MVP et prochain événement SQLSaturday à Paris

Mis en avant

1er avril 2016, renouvellement MVP Data Plateform effectué (et pas de poisson d’avril). Une bonne nouvelle pour moi et un grand merci à Microsoft et à la communauté SQL Server.

L’histoire continue donc et je voudrais partager avec vous les prochaines sessions que j’aurais l’occasion d’animer à ce prochain événement qui se déroulera les 25 et 26 avril 2016.

> Lire la suite (anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 RC3: le framework 3.5 n’est plus requis pendant l’installation

Mis en avant

Comme vous le savez certainement tous, la dernière release candidate de SQL Server 2016 (RC3) est sortie il y a quelques jours. Vous pouvez trouver l’annonce ici. Comme d’habitude, après avoir téléchargé et installer les binaires depuis mon abonnement MSDN, j’ai installé en premier lieu la couche du système d’exploitation (Windows Server 2016 TP4) en utilisant mon jeu de scripts automatisés. Je suis sûr que vous êtes convaincu qu’une automatisation de certaines étapes d’installation permet d’éviter de gagner du temps pour des tâches répétitives mais quelques fois nous pouvons perdre l’attention sur quelques détails intéressants.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Windows Server 2016: Présentation de Storage Spaces Direct

Mis en avant

N’avez-vous jamais entendu parlé de la fonctionnalité Storage Spaces introduit avec Windows Server 2012? C’est une fonctionnalité de stockage intéressante qui permet d’utiliser des fonctionnalités de stockage comme la virtualisation, les RAID, provisionnement thin ou thick, volumes de cluster partagés (CSV), réparation de fichiers etc … Windows Server 2012 R2 a également introduit quelques améliorations comme le tiering de stockage, write-back caching, déduplication, le support de parité pour les clusters à basculement, la prise en charge des enclosures de disques (JBOD) … un ensemble de fonctionnalités de stockage d’entreprise et nous sommes loin des premiers niveaux de RAID logiciels avec Windows 2003!

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Windows Server 2016: présentation de la fonctionnalité stretch cluster

Mis en avant

Continuons avec une nouvelle fonctionnalité de haute disponibilité fournit avec la prochaine version de Windows. Dans mon blog précédent, j’ai abordé une autre nouvelle fonctionnalité « Site Awareness » qui fournit une configuration plus flexible des priorités de basculement de ressources de cluster ainsi que qu’une gestion plus granulaire des seuils de hearbeat en introduisant le concept de site. Cette fois nous parlons de stretch cluster. Qu’Est-ce que cela? He bien introduisons tout d’abord le concept par quelques expériences clients pour lesquels nous avons introduit la notion de haute disponibilité via les cluster à basculement Windows.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016: nouveaux paramètres de bases de données partie II

Mis en avant

Dans ce billet, continuons avec d’autres options de niveau bases de données livrées avec SQL Server 2016 RC0. Nous commencerons avec la première de mes options préférées: configuration du NAXDOP pour une base de données individuelle! J’espère vraiment que les applications comme SharePoint qui exigent une limitation du maxdop à 1 au niveau de l’instance exploiteront ce nouveau type d’option à l’avenir.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016: nouveaux paramètres de bases de données

Mis en avant

Est-ce que vous vous souvenez des nouvelles capacités livrées avec la release CTP2 de SQL Server 2016 à propos de la base de données tempdb? Je discutais notamment des traces flags 1117 et 1118 devenus inutiles pour tempdb car depuis 2016 ceux-ci sont appliqués de manière implicite et automatique.

D’autres news sont arrivées entre temps avec la RC0 avec d’autres paramètres de niveau bases de données tels que AUTOGROW_SINGLE_FILE / AUTOGROW_ALL_FILES ainsi que MIXED_PAGE_ALLOCATION sont apparus et vont respectivement remplacer les traces flag 1117 et 1118 mais dans le cadre d’une base de données utilisateur en particulier. Ceci est une vraie bonne nouvelle car nous allons pouvoir bénéficier désormais d’une configuration beaucoup granulaire par rapport à une charge de travail s’exécutant pour une ou plusieurs bases de données cibles.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : nonclustered columnstore index et aggregate pushdown

Mis en avant

Avez-vous manqué cette nouvelle fonctionnalité nommée aggregate pushdown incluse avec les index columnstore? Je me souviens, pour ma part, d’en avoir entendu parlé la première fois en lisant le blog de Niko Neugebauer ici qui couvre déjà bien le sujet (principe, avantages et inconvénients)

Pourquoi écrire un nouveau billet ici? Eh bien tout simplement parce que depuis le billet de blog de Niko, cette fonctionnalité a été améliorée and je voulais l’éprouver avec un scénario client réel (mais simplifié ici). Par ailleurs, il est vrai que je n’ai pas mentionné cette fonctionnalité lors de ma dernière présentation aux dernières journées SQL server concernant les technologies In-Memory 2016 et l’analyse opérationnelle avec Frédéric Pichaut (Ingénieur support Microsoft) and c’était l’occasion de me rattraper dans billet

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Chute de l’espérance de vie d’une page mais ne paniquez pas tout de suite!

Mis en avant

Il y a quelques semaines de cela, j’ai eu une discussion intéressante avec un de mes clients a propos de la surveillance du fameux page life expectancy (ou PLE). Il me demandait si cela était une bonne pratique de surveiller sa valeur parce qu’il avait remarqué une grosse chute de ce dernier en dessous des recommandations en vigueur et ceci durant la nuit ou quelques fois pendant la journée. En plus, il craignait d’être déranger la nuit à cause de tâche de maintenance qui s’exécuterait sans impact sur l’activité business à ce moment là.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Changement une partition existante … pas si facile que cela

Mis en avant

Cette fois, parlons d’un cas client intéressant avec une table partitionnée de 100 GB sous SQL Server 2014. Dans ce contexte, le partitionnement avait pour objectif de sauvegarder de l’espace disque (données d’archives compressées), aider à réduire les temps de maintenance ainsi et les ressources consommées (utilisation des opérations d’index et de statistiques à la partition). Par la même occasion, cela aidera à améliorer les performances de requête sur la table concernée qui se concentre uniquement que sur les commandes récentes des clients.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server AlwaysOn: Lorsqu’un listener devient le cluster et vis versa

Mis en avant

Parlons cette fois d’une histoire plutôt fun et qui concerne une problématique intéressante à laquelle j’ai eu à faire face il y a quelques mois chez un de mes clients. A la base, le problème concernait uniquement la création d’un listener de groupe de disponibilité mais après avoir tenté de supprimer le groupe de disponibilité, mon client s’est aperçu rapidement que cette suppression ne pouvait plus se faire et encore plus étrange, il s’est aper4u que le nom réseau virtuel (VNN) associé au listener correspondait maintenant à l’objet d’ordinateur virtuel du cluster (VCO) lui même!

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

NOLOCK n’est définitivement pas ce que vous croyez

Mis en avant

Pour ceux qui croient encore qu’utiliser le hint nolock se prémunit contre tout verrou, lisez la suite de ce billet. J’avais déjà écrit un billet précédent sur le sujet il y a 3 ans environ, lorsque j’étais chez un client et que nous avions eu une discussion intéressante sur ce type de hint placé dans les requêtes de Reporting. Cette fois, j’ai pu expérimenté chez un autre client, une problématique de verrouillage intéressante en utilisant ce même hint.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Dilemme entre les filtres dynamiques et les requêtes « kitchen sink »

Mis en avant

Etre confronté aux filtres dynamiques est un scénario assez courant avec les applications de gestion ou les ERP. En effet, les utilisateurs voudraient avoir la flexibilité de filtrer and de trier leur données business comme ils veulent afin d’être le plus efficace possible. cibler et opérer rapidement sur les bonnes données est en phase avec les exigences de performances quotidiennes. Du moins c’est ce que j’ai pu noter chez différents clients.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server AlwaysOn: le registre est également important pour les groupes de disponibilités

Mis en avant

Il y a quelques mois, nous avons eu à faire à un problème étrange avec un de mes collègues Nathan Courtine chez un de nos clients. Celui-ci concernait un groupe de disponibilité et plus précisément la couche cluster. Je ne dirais jamais assez que les groupes de disponibilités sont dépendants des clusters à basculement et qu’avoir une bonne compréhension des mécanismes internes peut aider au diagnostique.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Windows failover cluster 2016 : nouvelle fonctionnalité – site awarness

Mis en avant

Après mes 2 premiers blogs concernant les fonctionnalités cloud witness et domainless dependencies livrées avec Windows Server 2016, il est maintenant temps de parler d’une autre fonctionnalité : site awarness que nous pourrons utiliser avec nos environnements SQL Server FCIs ou groupes de disponibilités

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Groupes de disponibilités : paramètre session timeout

Mis en avant

N’avez-vous jamais souffert de problèmes de timeout avec les groupes de disponibilités? Si vous jetez un coup d’œil aux différents paramètres dans ce domaine, vous en trouverez une certaine quantité. En effet, il y a des paramètres pour le groupe lui même, les réplicas and pour le cluster également.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Groupes de disponibilités : réplicas en lecture et impact sur le stockage

Mis en avant

Est-ce que les capacités en lecture seule des groupes de disponibilités ont un impact sur les performances des bases de données? La réponse rapide est oui mais regardons pourquoi dans ce blog post. Premièrement, lorsque l’on veut utiliser les réplicas secondaires en lecture seule, nous activons implicitement le niveau d’isolation de transaction SNAPSHOT quel que soit le niveau d’isolation configuré initialement ou les hints dans les requêtes.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 – groupes de disponibilités et gMSAs

Mis en avant

Ce billet ne concernera probablement pas les clients qui soit n’ont pas de règles de changement de mot de passe pour les comptes de services ou qui n’utilisent pas l’authentification Kerberos. Mais je suis sûr que le nombre de ces clients a diminué durant ces 10 dernières années. C’est en tout cas ce que j’ai pu remarquer chez différents clients.

Mais avant de commencer avec les groupes de services managés laissez moi introduire le concept de compte managé. Pourquoi les utiliser à la place des comptes de services traditionnels? Je pense que les administrateurs systèmes peuvent imaginer l’importance de ce type de compte …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Journées SQL Server 2015: Operational Analytics avec SQL Server 2016

Mis en avant

blog 69 - JSS 2015 bandeau

Pour ceux qui n’ont pas pu assister aux JSS2015, vous trouverez les vidéos de certaines sessions:

> Operational Analytics avec SQL Server 2016 (que j’ai eu la chance d’animer avec Frédéric Pichaut)

> La liste des vidéos JSS2015 (du moins celles qui ont pu être filmées)

J’en profite pour vous souhaitez un joyeux Noël 2015 !

David Barbarin
MVP & MCM SQL Server

Journées SQL Server 2015 à Paris – 30 novembre et 1er décembre

Mis en avant

blog 69 - JSS 2015 bandeau

Les journées SQL Server se dérouleront dans un mois à Paris dans les locaux de Microsoft. L’agenda n’a été qu’en partie dévoilé mais c’est avec plaisir que je peux dores et déjà vous annoncer que dbi services sera de la partie cette année encore en tant que speaker et sponsor de l’événement.

Pour ma part j’aurai le plaisir de vous y retrouver une fois de plus autour d’une session In-memory 2016 avec notamment les index columnstore et leur introduction dans l’analyse opérationnelle avec SQL Server 2016.

Deux de mes autres collègues (Stéphane et Nathan) vous présenteront quelques nouveautés autour de SQL Server 2016 en matière de sécurité, de données temporelles et Azure avec les “stretch databases” un peu plus tôt dans la journée.

blog 69 - JSS 2015

Rendez vous aux JSS!

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 groupes de disponibilités AlwaysOn et performance

Mis en avant

Lors du dernier SQL Saturday à Paris, j’ai eu la chance de co-animer une session sur les nouveautés SQL Server 2016 et notamment les groupes de disponibilités. J’avais mentionné à cette occasion des améliorations certaines du débit au niveau de la couche transport sans pour autant donner de détails et c’est un peu l’idée de ce billet.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : le Query Store

Mis en avant

Probablement l’une des fonctionnalités les plus intéressantes avec SQL Server 2016, le query store (ou magasin de requêtes) va compléter la trousse à outils de performance du DBA. Fondamentalement, le query store va récupérer les requêtes, leur plans d’exécutions ainsi que les statistiques d’exécutions. Il semble que ce soit l’outil idéal pour détecter la régression de requêtes.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Envie de faire un benchmark de votre stockage? Il est temps de passer à diskspd

Mis en avant

Comme vous le savez certainement, SQLIO est officiellement dépréciée depuis quelques mois. Pour ma part, j’ai eu l’occasion (peut être la dernière) d’utiliser SQLIO pour un projet client dans le but d’effectuer un benchmark de son stockage et préparer une installation AlwaysOn et groupes de disponibilité. Il est maintenant temps de passer au prochain outil prévu à cet effet: DiskSpd.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 CTP 2.4 : nouvelles améliorations concernant tempdb

Mis en avant

La CTP 2.4 est sortie récemment. Durant mes premières investigations, j’avais noté les nouvelles possibilités de l’installeur à configurer la base de données tempdb. Cependant certaines limitations étaient encore présentes. Cette nouvelle CTP semble avoir corrigée le tir.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : groupes de disponibilités AlwaysOn sans contrainte de domaine

Mis en avant

Etes vous au courant des nouvelles fonctionnalités de la prochaine version de Windows? Actuellement nous sommes en TP3 et durant mes investigations, j’ai été heureux de voir les nouvelles fonctionnalités de cluster.

En lisant cet article Microsoft, nous pouvons voir:

Workgroup Clusters: Clusters with nodes which are member servers / workgroup (not domain joined)

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server groupes de disponibilités AlwaysOn: réplicas secondaires en lecture seule et reconstruction d’un index hors ligne vs en ligne

Mis en avant

Il y a quelques semaines, j’ai participé à une discussion sur le forum développez.com concernant SQL Server AlwaysOn et les groupes de disponibilités, les stratégies d’indexation et l’impact sur les réplicas en lecture seule, Durant la discussion, un membre du forum affirmait que reconstruire un index en ligne avait moins d’impact sur un réplica secondaire en lecture seule qu’une ré-indexation hors ligne. J’avoue n’avoir pas être forcément d’accord avec cela mais est-ce la vérité? Vérifions le dans ce billet.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : groupes de disponibilité et nouveau rôle ssis_monitor pour le catalogue SSIS

Mis en avant

Durant mes tests sur les fonctionnalités AlwaysOn 2016, j’ai écrit un premier article sur le nouveau support AlwaysOn pour SSISDB,
Pour rappel, pour ceux qui ont eu à faire au catalogue SSIS dans la version précédente, des étapes supplémentaires étaient nécessaires pour être AlwaysOn compliant. Heureusement la nouvelle version de catalogue va rendre ce travail plus facile pour les DBA.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server groupes de disponibilités AlwaysOn et pool de travail hadr

Mis en avant

Lors de mes missions sur SQL Server AlwaysOn et les groupes de disponibilités, les clients me demandent souvent s’il existe des bonnes pratiques et recommandations sur le nombre maximum de bases de données dans un groupe de disponibilité. En réalité, pour répondre à cette question, nous devons garder à l’esprit la relation qu’il y a entre les bases de données et le pool de threads de travail dans ce type d’architecture.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Jointure, transitivité et simplification de requête

Mis en avant

Au cours d’une discussion hier avec un de mes amis « oraclien » nous avons débattu sur les différents comportements d’optimisation entre Oracle et SQL Server sur un cas bien précis. Vous pouvez lire son billet ici et trouver un script pour reproduire le problème par vous même. J’ai donc décidé d’écrire un billet à mon tour parce que cette discussion avait introduit des concepts intéressants que je voulais approfondir côté SQL Server.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server et groupes de disponibilités AlwaysOn: comment isoler le trafic de réplication?

Mis en avant

Il y a quelques jours, j’étais impliqué dans un projet d’implémentation d’une infrastructure de groupes de disponibilités AlwaysOn 2014. Au cours de ce projet, mon client voulait isoler le trafic de réplication du réseau publique. L’idée était de garantir un meilleur contrôle de la bande passante du réseau ainsi qu’une latence minimale en cas de trafic réseau applicatif important ou de sauvegardes.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

sp_cursor_fetch et performance

Mis en avant

Il y a quelques semaines lors d’un audit, mon client me parlait de problèmes de performances identifiés uniquement sur la phase de login de son application. Après des échanges divers entre le client et l’éditeur de logiciel, nous avons constaté que le problème ne se produisait pas lorsque l’application et l’instance SQL Server étaient installées sur le même serveur (moins d’une seconde avec la configuration de l’éditeur contre 10 secondes avec celle du client). A vrai dire, mon client ne possédait pas tout à fait la même configuration qui comprenait un serveur applicatif et un serveur de bases de données distant. Imaginez la déception du client lorsqu’il s’est aperçu que sa configuration matérielle était de loin plus puissante que celle de l’éditeur de logiciel pour ces tests avec un même volume données.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server groupes de disponibilités AlwaysOn et abonnements SSRS

Mis en avant

Il y a quelques jours, j’ai eu l’occasion de travailler sur une infrastructure incluant des groupes de disponibilités AlwaysOn 2014 et un rapport de serveur Reporting Services en mode natif et en scale-out. Gérer Reporting Services dans une infrastructure AlwaysOn n’est pas toujours une tâche facile et cela dépend notamment des fonctionnalités utilisées dans SSRS. Ceci est particulièrement vrai lorsque des planifications et abonnements sont en jeu.

> Pour la lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

N’utilisez pas les paramètres par défaut AUTOGROW!

Mis en avant

Au cours de mes audits clients, j’ai souvent vu les paramètres d’expansion de fichiers par défaut sur les bases de données utilisateurs et comme vous le savez ceci n’est pas forcément une bonne pratique. Laissez moi vous raconter une histoire drôle vécue qui concerne une situation extrême avec un fichier journal et ses paramètres par défaut.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Index cluster columnstore et gestion de la mémoire

Mis en avant

Il ya quelques semaines, j’ai eu l’occasion de donner une session sur la fonction d’index cluster columnstore (CCI) lors de notre événement In-Memory dédié aux technologies Microsoft SQL Server, Oracle et SAP HANA. Au cours de notre session, j’ai expliqué les améliorations apportées par Microsoft sur SQL Server 2014, avec l’introduction du nouvel index cluster columnstore (CCI).

Le CCI comprend une nouvelle structure qui permet des opérations de mise à jour: le fameux deltastore. En effet, les opérations d’insertion vont directement dans ce magasin. La suppression de données est purement logique et va être également répertorié dans une partie du deltastore appelée deleted bitmap. Enfin la mise à jour de données va se transformer en 2 opérations élémentaires INSERT et DELETE. En réalité, j’étais très intéressé de savoir comment s’articulait ces deux structures spécifiques (deltastore et columnstore) et comment SQL Server gérait la mémoire la mémoire dans ces différents scénarios. Ce blog est simplement le résultat de mes études et concerne probablement ceux qui aiment regarder sous le capot de SQL Server. Pour être tout à fait honnête, l’idée m’est venue lorsque je discutais avec un de mes amis « Oraclien » et qui me posaient des questions intéressantes sur la gestion du CCI.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : groupes de disponibilité AlwaysOn et nouveau support pour le catalogue SSIS

Mis en avant

Il y a quelques semaines de cela, je participais à un projet d’infrastructure SSIS avec SQL Server 2014. Comme vous le savez, l’architecture SSIS a fondamentalement changé depuis SQL Server 2012 et a conduit à une nouvelle façon d’administrer cette fonctionnalité par les administrateurs de bases de données. Ceci est particulièrement vrai lorsque nous devons prendre en compte une architecture AlwaysOn avec le nouveau catalogue de SSISDB depuis SQL Server 2014 ..

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : groupes de disponibilités AlwaysOn et support des index columnstore sur les secondaires

Mis en avant

Après avoir fait le tour des quelques améliorations du côté de la fonction d’index columnstore, j’ai été étonné de voir la section suivante

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : groupes de disponibilités AlwaysOn et équilibrage de charge

Mis en avant

Dans cet billet, je parlerai des réplicas secondaires en lecture seule et le nouveau support d’équilibrage de charge qui sera fourni par SQL Server 2016.

Avec SQL Server 2014, il y avait déjà eu quelques améliorations sur la disponibilité des secondaires en lecture seule (lorsque le réplica primaire tombait). Cependant, la redirection en lecture seule vers un secondaire restait basique, car elle ne concernait que le premier réplica qui était configuré dans la liste de priorité. A moins d’utiliser un outil tiers dans cas, il n’était pas envisageable de maximiser l’utilisation des ressources disponibles depuis les secondaires. Heureusement, la prochaine version de SQL Server va changer la donne en introduisant des capacités d’équilibrage de charge natives.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : groupes de disponibilités AlwaysOn et amélioration du basculement automatique

Mis en avant

Cette fois, nous allons parler de la possibilité d’inscrire un 3ème réplica pour le basculement automatique. Cela implique bien sûr de configurer la réplication synchrone entre 2 paires de réplicas et cela certainement au prix d’une dégradation de la performance globale. Mais il semble que dans ce domaine nous pouvons nous attendre à avoir également quelques améliorations. Peut-être une autre étude à venir …

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016 : groupes de disponibilité Alwayson et support potentiel en édition standard

Mis en avant

Dans mon premier blog sur les groupes de disponibilité avec SQL Server 2016, j’ai pu parler rapidement d’une nouvelle option intéressante: DB_FAILOVER. Dans ce billet, je vais continuer avec une autre potentielle bonne nouvelle (à ce stade rien n’est encore confirmé): le support des groupes de disponibilité en édition standard. Cela semble être en effet une grande nouvelle car cela permettra d’accroître le champ d’action des groupes de disponibilités vers de nouveaux clients potentiels. Cependant gardons à l’esprit que nous parlons de l’édition standard et que l’on peut s’attendre à quelques limitations.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016: groupes de disponibilités AlwayOn et nouvelle option DB_FAILOVER

Mis en avant

Continuons la découverte de SQL Server 2016, avec l’un de mes sujets favoris: les groupes de disponibilité AlwaysOn. Il y a eu effectivement encore eu quelques améliorations.

Tout d’abord, introduisons cette nouvelle option en se souvenant du comportement des groupes de disponibilité avec les versions précédentes de SQL Server. Une idée fausse qui existe encore est qu’un groupe de disponibilité peut basculer en cas de défaillance d’une base de données alors qu’en réalité ce n’est pas le cas. Non, ce n’est pas une blague, mais bien la réalité. Les groupes de disponibilités sont conçus uniquement pour détecter les problèmes au niveau de l’instance de SQL Server et ceci jusqu’à l’introduction de SQL Server 2016.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2016: tempdb et premiers sentiments

Mis en avant

Dans ce premier billet sur SQL Server 2016, j’ai pu noter durant l’installation de SQL Server qu’il était désormais possible de configurer le nombre de fichiers de la base de données tempdb. Ceci est une amélioration certaine et on peut penser que l’histoire s’arrête là mais il n’en est rien.

Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Saturday Lisbon: De Francesinha à Bacalhau

Mis en avant

La semaine dernière, j’ai eu l’opportunité d’assister au SQL Saturday 369 qui se déroulait à Lisbon. Si vous jetez un coup d’œil à l’agenda, vous verrez probablement qu’il y avait beaucoup de sessions intéressantes ainsi que des speakers connus. Malheureusement, je n’ai pas pu assister à toutes les sessions et je me suis donc concentré sur celles qui avaient un lien direct avec mon travail quotidien.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Insérer 1 million de lignes part III – avec les fonctionnalités In-Memory

Mis en avant

L’idée de cette suite de blogs est toute simple:

Insérer 1 millions de lignes le plus rapidement possible dans une table sous SQL Server en utilisant différentes techniques avec un environnement relativement restreint. Cette initiative vient de mon collègue Franck Pachot qui travaille sur Oracle et suivi par Daniel Westermann pour la partie PostGreSQL. L’idée n’est pas tant de comparer les 3 SGBDs du point de vue de la performance pure mais de voir les outils et techniques utilisables sur différents SGBDs pour ce genre d’exercice.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Utilisation des snapshots VSS et SQL Server – Part I

Mis en avant

Ceci est probablement une série de billets concernant les snapshots VSS et SQL Server. Laissez moi introduire le sujet avec cette anecdote:

Il y a quelques temps, nous avons implémenté une stratégie de sauvegarde chez un de mes clients basée sur une combinaison FULL, DIFF et sauvegarde du journal des transactions. Aucun problème pendant un moment et un jour mon client m’appelle en me disant que depuis un certain temps, la sauvegarde différentielle en place ne se faisait plus correctement avec le message d’erreur suivant ..

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Insérer 1 million de lignes part II – Write commit

Mis en avant

L’idée de cette suite de blogs est toute simple:

Insérer 1 millions de lignes le plus rapidement possible dans une table sous SQL Server en utilisant différentes techniques avec un environnement relativement restreint. Cette initiative vient de mon collègue Franck Pachot qui travaille sur Oracle et suivi par Daniel Westermann pour la partie PostGreSQL. L’idée n’est pas tant de comparer les 3 SGBDs du point de vue de la performance pure mais de voir les outils et techniques utilisables sur différents SGBDs pour ce genre d’exercice.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Insérer 1 million de lignes part I – bulk insert

Mis en avant

L’idée de cette suite de blogs est toute simple:

Insérer 1 millions de lignes le plus rapidement possible dans une table sous SQL Server en utilisant différentes techniques avec un environnement relativement restreint. Cette initiative vient de mon collègue Franck Pachot qui travaille sur Oracle et suivi par Daniel Westermann pour la partie PostGreSQL. L’idée n’est pas tant de comparer les 3 SGBDs du point de vue de la performance pure mais de voir les outils et techniques utilisables sur différents SGBDs pour ce genre d’exercice.

> Pour la lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server vNext devient SQL Server 2016

Mis en avant

Satya Nadella, CEO Microsoft a annoncé lors de la keynote du Microsoft Ignite qui s’est déroulé à Chicago, qu’une version preview et publique de SQL Server 2016 sortirait cet été and vous pouvez être sûr que chez dbi services nous sommes pressés de pouvoir jeter un coup d’œil sous le capot de cette nouvelle release

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Quand tempdb peut être à l’origine de problèmes indirects

Mis en avant

Il y a quelques semaines, j’ai discuté d’un cas intéressant avec un de mes amis qui a fait face à un problème étrange (en surface) avec une instance SQL Server qui a manqué de threads de travail. Je ne peux malheureusement pas dévoiler le vrai contexte client ici mais j’ai décidé de reproduire le même problème afin de partager avec vous certaines informations intéressantes. La prochaine partie de ce blog se réfère uniquement à mes propres tests qui représentent dans sa plus grande partie le problème cité ci-dessus.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Utilisation de Windows Server 2012 R2 & gestion de témoin dynamique dans une configuration minimale – part II

Mis en avant

J’ai écrit un billet il y a quelque temps à propos de l’utilisation d’un partage de fichiers en tant que témoin dans une configuration minimale Windows Failover cluster à 2 nœuds. Dans ce billet, je disais que j’étais réticent quant à l’utilisation d’un témoin dans ce cas parce qu’il introduisait une faiblesse dans cette architecture hautement disponible. En effet, le système n’était pas en mesure d’ajuster le poids de vote des nœuds dans une telle configuration mais cela ne veut pas dire que l’on en a pas besoin en réalité et c’est ce point que je voudrais clarifier ici. J’admets volontiers m’être trompé moi-même pendant quelques temps.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Problème étrange avec la fonction sys.fn_hadr_backup_is_preferred_replica()

Mis en avant

Il y a quelque temps, j’ai eu à faire face à des problèmes de sauvegardes dans un contexte AlwaysOn et groupe de disponibilités chez l’un de mes clients (merci à lui d’avoir souligner le problème). Après avoir installé notre outil de gestion de bases de données pour la maintenance des environnements AlwaysOn (Database Management Kit), mon client a remarqué que certaines de ses bases n’étaient pas sauvegardées correctement. Humm … que se passe-t-il? Première fois que ce problème se produit .. Est-ce que cela vient de notre outil ?

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Windows Server Vnext and cloud witness

Mis en avant

La prochaine version de Windows fournira d’intéressantes fonctionnalités concernant les architectures de cluster à basculement dont l’une d’entre elles concerne un nouveau type de quorum « Node majority and cloud witness ». Celui-ci va très certainement résoudre beaucoup de scénarios où l’utilisation d’un 3ème datacenter est obligatoire pour atteindre une vraie résilience du quorum.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Une histoire sympathique avec les options de recompilation au niveau requête

Mis en avant

La nuit dernière, j’ai eu une discussion intéressante avec un de mes amis MVP SQL Server qui a rencontré une situation étrange où une requête qui utilisait une option de recompilation produisait un plan d’exécution qui l’a désappointé. Ce dernier m’a dit qu’il était possible de simuler cette même situation en utilisant la base de données AdventureWorks et la table Sales.SalesOrderHeader.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

S’aventurer dans l’insertion en masse d’un fichier d’erreur SQL Server et l’ordre des données

Mis en avant

N’avez-vous jamais tenté une insertion en masse d’un fichier d’erreur SQL Server pour en extraire les informations utiles dans un rapport par exemple?
Si tel est le cas, vous vous êtes probablement demandé comment garder l’ordre du fichier dans une requête sans avoir une colonne de référence pour l’ordre des données. Il existe bien entendu des solutions mais ce n’est pas le but de ce billet. A la place, je voudrais partager avec vous une discussion intéressante sur le forum developpez.com concernant l’assurance d’obtenir l’ordre les données dans un fichier d’erreur SQL Server avec une simple requête SELECT sans spécifier la clause ORDER BY.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Analyser facilement un rapport de processus bloqués

Mis en avant

Quel DBA n’a jamais eu à faire face à un problème de performance provoqué par des blocage de plusieurs processus? En réalité, je suis sûr que non. Résoudre un problème de blocage de processus n’est pas toujours simple et peut exiger d’utiliser des outils qui simplifieront cette tâche. Il y a quelques mois, j’ai eu à gérer un tel scénario chez un de mes clients avec une cascade de processus bloqués dans une période donnée.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Gérer le témoin dynamique avec Windows 2012 R2 et une configuration minimale

Mis en avant

N’avez-vous jamais vu le message suivant lors d’une validation de configuration cluster avec les groupes de disponibilités ou les FCI avec Windows Server 2012?

blog_32_-_0_-_cluster_validation

Microsoft recommande d’ajouter un témoin même lorsque votre configuration ne comporte que 2 nœuds avec utilisation du témoin dynamique. Cette recommandation est pertinente avec les nouvelles possibilités liées au témoin dans une configuration cluster qui améliore de plus en plus la résilience du quorum. Cependant, nous devons faire attention à cela et j’aurais même tendance à dire que je suis plutôt réticent lorsqu’il s’agit de configuration « minimale » avec 2 nœuds. A noter que dans mon cas, il est plutôt habituel d’implémenter des architectures AlwaysOn avec 2 nœuds.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Cas de surveillance d’une réplication Snapshot depuis un abonné

Mis en avant

Je n’ai pas souvent l’occasion de travailler avec la réplication SQL Server. La raison est que le nombre de clients utilisant la réplication est relativement faible and à chaque fois que je suis confronté à cela, c’est une bonne occasion d’augmenter mes connaissances dans ce domaine. Il y a quelques mois maintenant, j’ai eu à faire face à une demande intéressante avec la réplication Snaspshot (oui, on peut dire que j’ai eu de la chance car ce n’est pas la réplication la plus complexe :-) ). Il s’agissait de pouvoir surveiller l’état de réplication de 250 bases de données réparties sur 2 datacenters sur un autre continent. Le challenge ici est que nous n’avions pas accès aux publicateurs mais uniquement à l’abonné centrale.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Considérations sur le placement de fichiers des bases de données SQL Server avec Netapp et SnapManager

Mis en avant

Lorsqu’on installe SQL Server, on a bien sûr à considérer comment placer les fichiers de bases de données. A ce stade, il est probable que vous suivrez les bonnes pratiques bien connues ou les guidelines fournis pour Microsoft mais êtes vous réellement au courant de ceux fournis par les vendeurs de stockage? Parlons en dans ce billet.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server: Reconstruction d’index en ligne & opérations journalisées au minimum

Mis en avant

Il y a quelques jours, j’ai rencontré un problème intéressant chez un de mes clients concernant une opération de reconstruction d’index dans un environnement datawarehouse. Laissez moi vous présenter la situation: Un journée classique d’un administrateur de base de données avec une erreur presque habituelle dans la boîte email: “The transaction log for database ‘xxx’ is full”. Après avoir vérifié la base de données en question, nous avons remarqué que la taille du journal était de 60GB. Dans le même temps, nous avons identifié la source du problème qui concernait une reconstruction d’index effectuée dans la nuit via un plan de maintenance sur un index relativement important (environ 20GB) sur une table de fait.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

Gestion de la mémoire et problème OOM avec SQL Server 2014 et In-memory

Mis en avant

Il y a quelques temps, je donnais un workshop sur les nouvelles fonctionnalités liées à SQL Server 2014. Nous avons abordé les tables In-memory et différentes problématiques tels que la gestion du stockage, le nouveau modèle de transaction et le nouveau processus concernant le checkpoint. Au cours de la journée, un des participants me demandait s’il y avait une façon particulière de gérer la mémoire dans ce cas. La question est pertinente mais malheureusement, je n’ai pas eu le temps d’élaborer une réponse complète et précise. C’est chose faite dans ce billet.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

SQL Server 2014: FCIs, groupes de disponibilités et conflits de port d’écoute

Mis en avant

Après ma session concernant les groupes de disponibilités aux derniers JSS2014, j’ai eu plusieurs questions concernant les problèmes de port d’écoute, en particulier les différences qu’il existe entre les FCI et les groupes de disponibilité.

> Lire la suite (en anglais)

David Barbarin
MVP & MCM SQL Server

N’oubliez pas de configurer la gestion d’alimentation sur Hyper-V

Mis en avant

Récemment j’ai eu l’opportunité d’auditer un serveur SQL hébergé sur cluster Hyper-V 2012. J’ai remarqué que le système d’exploitation au niveau du Guest avec l’option d’alimentation ayant la valeur « High Performance ». C’est une bonne chose mais lorsqu’ai j’ai discuté avec l’administrateur système pour vérifier si cette même option était configurée au niveau du Host, malheureusement ce n’était pas le cas.

> Pour lire la suite (en anglais)

David Barbarin
MVP & MCP SQL Server

Journées SQL Server 2014: Vidéos des sessions disponibles

Mis en avant

2e1ax_default_entry_jss2014

Les vidéos des sessions des journées SQL Server 2014 sont enfin en ligne:

> Infrastructure et AlwaysOn
> Industrialisation des audits (avec Sarah Bessard)

Si vous avez des questions n’hésitez pas à me contacter par email ou par le biais des commentaires sur ce blog.

Bon visionnage!

David Barbarin
MVP & MCM SQL Server

SQL Server 2014 : sortie du livre « Développer et administrer pour la performance »

Mis en avant

2e1ax_default_entry_sqlserver2014_livre

Un billet en cette fin d’année qui approche à grand pas pour vous annoncer la sortie prochaine (fin décembre 2014) du livre SQL Server 2014 : Développer et administrer pour la performance en français et auquel j’ai eu l’immense plaisir de participer avec Frédéric Brouard (alias SQLPro – MVP SQL Server), Nicolas Souquet (alias Elsuket – MVP SQL Server) et Christian Soutou.

Ce livre est destiné aussi bien aux développeurs qu’aux administrateurs débutants ou confirmés soucieux de la performance et couvre un ensemble complet de domaines (l’administration, le développement, la sécurité ou encore la haute disponibilité).

Bonne lecture !

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

Journées SQL Server 2014: Vidéo des sessions disponibles

Mis en avant

JSS 2014

Les vidéos des sessions des journées SQL Server 2014 sont enfin en ligne:

> Infrastructure et AlwaysOn
> Industrialisation des audits (avec Sarah Bessard)

Si vous avez des questions n’hésitez pas à me contacter par email ou par le biais des commentaires sur ce blog.

Bon visionnage!

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

Windows failover cluster: Basculement automatique ou basculement manuel ?

Mis en avant

During the night, you receive an alert concerning your SQL Server failover cluster or your availability groups. You’re in panic because the message displayed is « a failover has occured .. see the log for more details » …

Durant la nuit, vous recevez une alerte concernant un basculement d’une de vos instances SQL Server FCI ou de vos groupes de disponibilités. Mode panique !!! parce que le message qui vous arrive est le suivant : « a failover has occured .. see the log for more détails » … Bien sûr vous tentez de rester calme (après tout le basculement automatique est fait pour cela non ?) et après avoir été connecté à votre environnement vous ne trouvez rien … Que s’est-il passé ? Peut être qu’une intervention manuelle est à l’origine de cette alerte et vous n’êtes pas au courant.

Lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014: buffer pool extension & corruption

Mis en avant

J’ai eu l’opportunité d’assister à la session de Paul Randal concernant les techniques avancées de récupération de données au Pass summit. Durant la session, un des participants demande à Paul si une page de données qui vient d’être corrompue restait dans le BPE (Buffer Pool Extension). Vous savez probablement que le BPE héberge uniquement les pages de données non modifiées. Paul a hésité un moment et nous a demandé tout simplement de tester et c’est exactement ce que je vais faire au cours de ce billet.

Lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

Pass Summit 2014: c’est parti

Mis en avant

C’est la première fois que je vais au Pass summit cette année. L’édition 2014 sera donc le début de mon expérience Pass summit. Cette année j’y vais avec mon collègue Stéphane Haby (MVP SQL Server). Il est 07:30 du matin et nous sommes déjà au centre de conférence à bureau d’enregistrement …

Lire la suite ( en anglais )

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server et fuite mémoire: Etes-vous bien sûr ?

Mis en avant

Récemment j’ai rencontré un problème avec l’un de mes clients (oui je recontre beaucoup de problèmes à vrai dire …) qui m’expliquait que leur instance Server 2008 R2 avait une fuite de mémoire . Waaou une fuite mémoire! Le serveur posède 64 Go de RAM et l’instance de SQL Server concernée est limitée à 54 Go selon l’option de serveur de mémoire serveur max (GB ) . Cependant, il avait remarqué que SQL Server utilise 60 Go de mémoire, ce qui ne correspond pas à l’option serveur « max server memory (MB) ». Qu’Est-ce qui passe ici ? Je vous propose de voir cela dans le billet.

Lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server failover cluster, VSphere & les cauchemards de la réservation SCSI-3

Mis en avant

Lorsque je dois installer une instance SQL Server FCI chez un client dans un environnement virtualisé, la plupart du temps voir quasi tout le temps l’environnement est déjà paramétré et prêt à être utilisé. Je suppose que c’est la même chose pour la plupart des consultants SQL Server. Si vous avez un peu de temps n’hésitez pas à partager votre expérience :-) Cependant il faut avouer que nous manquons de pratique et que certaines fois nous avons pas la connaissance des bonnes pratiques de configuration à appliquer à la couche virtuelle concernant les infrastructures SQL Server FCI.

Il y a quelques jours, j’ai eu un cas assez surprenant à vrai dire où j’ai du aider un client à configurer la couche virtuelle de stockage sur VSphere 5.1. Je voulais profiter de l’occasion pour remercier le client ( qui se reconnaîtra si jamais il lit le blog ) qui m’a permis de remettre les mains dedans. L’histoire commence avec une un problème de basculement aléatoire de l’instance SQL Server FCI après avoir basculé les volumes disques de VMFS vers RDM …

Pour lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server: comportement d’une bascule forcée avec les groupes de disponibilités

Mis en avant

Il y a quelques temps chez un de mes clients concernant la mise en place d’une infrastructure AlwaysOn et les groupes de disponibilités, nous avons eu ensemble une discussion intéressante. Celle-ci concernait les impacts d’une bascule manuelle avec une perte potentielle de données entre 2 réplicas asynchrones. La grande question de cette discussion était la suivante: est-ce que SQL Server est capable de resynchroniser automatiquement les bases de données hautement disponibles si certaines transactions sont perdues durant la bascule ?

La réponse est oui mais une autre question plus intéressante est sans doute comment SQL Server procède pour opération cette synchronisation ? Si la réponse vous intéresse c’est par ici

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014: commit classique vs commit et delayed durability & I/Os

Mis en avant

Lorsque vous apprenez à administrer SQL Server, vous entendrez vous dire qu’une validation de transaction est une oération synchrone and vous pouvez avoir confiance en cela! Dans ce billet, je vous propose cependant de vous fournir quelques détails sur ce que nous qualifions de synchrone dans ce cas. La raison de billet est que quelque fois, lorsque je parle de cette nouvelle fonctionnalité il me semble percevoir quelques confusions à ce sujet avec le raccourci suivant: écrire dans le journal est une opération synchrone alors que réaliser la même opération avec cette nouvelle fonctionnalité est asynchrone. Ceci n’est pas totalement faux rassurez-vous mais tout dépend de quoi on parle en réalité …

Lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Saturday 323: SQL Server AlwaysOn et les groupes de disponibilités – les slides

Mis en avant

Cette édition qui se déroulait à Paris dans la tour Montparnasse est maintenue terminée. Ce fut un grand cru avec beaucoup de speakers français mais aussi internationaux. Il y eu également un grand nombre de participants et peut être que la tour Montparnasse y a été pour quelque chose .. allez savoir !

Quoi qu’il en soit j’ai été ravi de pouvoir animer 2 sessions et je remercie les organisateurs ainsi que les participants sans qui cet événement n’aurait finalement que très peu d’intérêt.

Vous pouvez trouver les slides de ma session sur le slideshare du GUSS ou sur mon blog dbi-services

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014: DBCC CHECKDB et ReFS support

Mis en avant

Pour ceux qui ont déjà testé SQL Server 2014 vous avez peut être remarqué que la commande DBCC CHECKDB avait quelque peu changé son comportement vis-à-vis de l’utilisation des fichiers sparses ? Je l’ai découvert complétement par hasard durant mes tests. Si vous prêtez attention, vous verrez que des fichiers étranges apparaissent pendant l’exécution de la commande DBCC CHECKDB …

Lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server: DBCC CHECKDB et corruption non détectée

Mis en avant

Au cours de mes audits clients, il arrive encore de trouver des bases de données avec une option de vérification de page configurée à NONE. J’ai toujours alerter mes clients sur ce type de configuration parce qu’elle peut avoir un impact certain sur l’intégrité des bases de données concernées. Un de mes clients me disait justement que de toute façon la vérification d’intégrité via les plans de maintenance pouvaient étaient faite pour cela mais est-ce vraiment le cas ?

Pour le savoir c’est par ici (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Saturday Paris Septembre 2014

Mis en avant

Les SQL Saturdays sont de nouveau présents en France pour une seconde édition. A cette occasion j’aurais l’immense plaisir d’animer une pré-conférence en collaboration avec Christophe Laporte le vendredi 12 septembre sur la thématique du stockage et des sauvegardes. Les pré-conférences sont payantes et peuvent être assimilées à des formations traditionnelles.

De plus le samedi 13 septembre je présenterais une session sur des concepts avancées concernant les architectures hautes disponibilités avec AlwaysOn et les groupes de disponibilités. D’autres sessions intéressantes auront également lieu en fonction de vos affinités avec les différentes thématiques que l’on peut retrouver avec SQL Server.

 

Il est encore temps de vous inscrire

Au plaisir de vous retrouver lors de cet événement !

Comme d’habitude un grand merci aux partenaires de l’événement !

image 

 

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014: sys.dm_exec_query_profiles, une fonctionnalité prometteuse

Mis en avant

Parmi les fonctionnalités cachées de SQL Server 2014 il y a une nouvelle DMV intéressante nommée sys.dm_exec_query_profiles. En effet, cette dernière permet aux administrateurs de bases de données et aux développeurs expérimentés de pouvoir diagnostiquer les requêtes longues en temps réel. Je suis sûr que vous avez déjà eu à répondre à ce genre de questions: Quand est-ce que cette requête va se terminer ? Quel est le pourcentage de progression de cette requête ? Quelles étapes ont pris le plus de temps ? Avant SQL Server 2014, autant dire que cela était impossible.

Cependant je dois admettre que cette nouvelle DMV a suscité pas mal de questions et d’étonnement de ma part. Je partagerais avec vous cela durant ce billet.

Pour lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014 : basculement de groupes de disponibilités impossible avec le gestionnaire de clusters

Mis en avant

Il y a quelques semaines, je travaillais pour un client qui voulait implémenter une solution de haute disponibilité avec SQL Server 2012 AlwaysOn avec les groupes de disponibilités. Nous avons effectués une batterie de tests de basculement et le client a tenté de basculer les groupes de disponibilités installés au travers de la console de gestion de clusters. Bien entendu, je lui ai dit que cela n’était pas une bonne pratique parce que celui-ci n’était pas au courant de l’état de synchronisation d’un groupe de disponibilité. Mais avec SQL Server 2014, ceci a visiblement complétement changé de ce que j’ai pu constaté. Je voudrais partager cette information avec vous.

Pour lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014 : améliorations concernant tempdb

Mis en avant

SQL Server 2014 est définitivement conçue pour la performance et je vais essayer de le démontrer durant ce billet. Je parlerais des fonctionnalités un peu cachées concernant la performance parce qu’en général celles-ci n’exigent aucun changement applicatif contrairement à d’autres fonctionnalités plus connues comme les tables in-memory par exemple.

Pour lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014 : Statistiques incrémentales

Mis en avant

Est-ce que vous utilisez le partitionnement SQL Server ? Si oui, ce post est fait probablement pour vous parce qu’il y a une bonne nouvelle avec le partitionnement SQL Server 2014 ! Je me souviens d’une ancienne mission avec un client dans le domaine de la santé ou nous avions décidé d’implémenter une stratégie de partitionnement pour une grosse table d’archivage contenant des entrées médicales. Nous utilisions SQL Server 2005 et nous devions déjà relever certains défis comme la mise à jour de statistiques. Les administrateurs de bases de données savent de quoi je parle …

Lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SELECT INTO et exécution en parallèle

Mis en avant

Il y a peu de temps, en tant que consultant j’ai dû fournir quelques bonnes pratiques en terme d’architecture pour un environnement dont l’activité d’écriture était prédominante avec un import de données depuis différents sources dans des tables SQL Server. Au cours d’une discussion mon client m’a demandé quelles étaient les nouvelles fonctionnalités de SQL Server qui pourraient potentiellement améliorer la vitesse du processus d’import. J’ai eu en tête une amélioration intéressante proposée autour de la commande SELECT INTO qui est souvent utilisé dans des environnements avec ETL. En effet, il est maintenant possible d’exécuter cette commande avec exécution parallèle …

>> Pour lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

In-Memory tables, Bw-Tree, and stockage

Mis en avant

SQL Server 2014 a introduit les indexes hash avec les tables in-memory. J’ai décrit certaines de leurs caractéristiques dans un blog précédent.
Ces indexes sont vraiment efficaces pour des opérations de recherche ciblées mais possèdent quelques limitations pour d’autres comme les opérations de balayage, les prédicats à base d’inégalités ou encore les balayages triés dans un ordre spécifique. Il existe maintenant un autre type d’index (index non cluster ou Bw-Tree) qui permet de répondre à cette problématique et tout comme les indexes hash ils incorporent également une chaîne de données dans leur structure au niveau feuille.

Dans ce billet je voudrais partager avec vous certains aspects intéressants du stockage qui les concernent.

>> Pour lire la suite (en anglais)

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

TDE, gestion des clés de chiffrement et stratégie de sauvegardes

Mis en avant

Transparent Data Encryption requières la création d’une clé de chiffrement de bases de données. Cette clé fait elle même partie d’une hiérarchie de chiffrement de clé utilisée par SQL Server. Cette hiérarchie offre une certaine souplesse dans la gestion des clés qui comprend la restriction des clés aux personnes autorisées, la sauvegarde des clés vers un stockage sécurisé et la rotation des clés de chiffrements pour éviter que celles-ci soient compromises par une personne malveillante. Comme vous pouvez l’imaginer un aspect important de cette gestion des clés est l’alignement de rotation des clés avec la stratégie de sauvegarde des bases de données.

>> Pour lire la suite

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014 : Buffer pool extension .. une fonctionnalité intéressante

Mis en avant

La sortie de SQL Server 2014 a été annoncée pour le 1er avril 2014 .. non ce n’est pas un poisson d’avril .. et je pense que l’une des fonctionnalités les plus intéressantes à utiliser hormis Hekaton bien sûr l’extension du buffer pool sur des disques de type solid-state. J’ai voulu tester et comprendre cette fonctionnalité afin de voir ce qu’il en était réellement et ce qu’elle apporterait dans des environnements serveurs où l’extension de mémoire peut être problématique pour diverses raisons.

>> Lire la suite

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014: Supprimer les fichiers sur disque associés à une table In-Memory

Mis en avant

Est-ce que vous ne vous êtes jamais demandé ce qui se passerait si les fichiers d’une table Hekaton étaient accidentellement supprimés du système de fichier ? Est-ce que cela compromettrait le fonctionnement global de la table voir même de l’instance SQL Server ? J’ai souvent entendu cette question au cours des événements auxquels j’ai pu assister mais sans jamais vraiment avoir de réponse. Dans ce billet (en anglais) je vous propose de voir ce qu’il en est.

Bonne lecture !

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014 : SELECT ALL USERS SECURABLES & DB admins

Mis en avant

Microsoft a introduit 4 nouvelles permissions. L’un d’entre elles (SELECT ALL USERS SECURABLES) peut permettre à un administrateur de bases de données de pouvoir gérer une instance SQL Server sans forcément voir les données sensibles. Cependant cette phrase est à prendre avec du recul pour éviter des erreurs d’interprétations.

Lire la suite (en anglais)

Bonne lecture !

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

Tables in-memory, indexes hash et paramétrage du nombre de buckets

Mis en avant

Je n’ai jamais posté quelque chose sur les tables in-memory depuis que SQL Server 2014 est sortie en preview. C’est chose faite et je l’ai réalisé en anglais sur le blog de ma nouvelle société (dbi services). Pour les francophones pas de souci, la lecture se fait bien et dans notre métier il est presque devenu normal de pouvoir lire de l’anglais technique :-)  A l’avenir vous trouverez mes billets de blog soit sur dbi services  soit ici en fonction du contexte et de mes envies mais il y aura toujours un lien vers les billets de blog dbi services depuis mon blog personnel.

Vous trouverez donc mon premier sur les tables Hekaton à cette adresse : http://www.dbi-services.com/index.php/blog/entry/sql-server-2014-hekaton-memory-optimized-tables-hash-indexes-and-bucket-counts

Bonne lecture !

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server AlwaysOn : Considérations sur l’ajout d’un fichier de bases de données

Mis en avant

Ce billet fait suite à quelques discussions échangés lors d’un cours sur SQL Server AlwaysOn que j’ai pu donner ces derniers temps. Une des parties du cours ciblaient certaines tâches qu’un administrateur pouvait avoir à effectuer sur une base de données concernée par un groupe de disponibilité dans un environnement complètement asymétrique. Je tiens à dire tout de suite que Microsoft conseille d’avoir des environnements similaires entre réplicas pour une administration plus simple. Maintenant que cela est dit, prenons une situation où un administrateur de bases de données doive ajouter un fichier de données supplémentaire à une base de données faisant parti d’un groupe de disponibilité dont l’architecture en place est la suivante :

 

image

Une architecture avec 4 réplicas. Je précise de suite que cette architecture est tout à fait fictive et que le placement de fichier pas forcément optimale pour une telle architecture mais le principe est de bien comprendre les problèmes qu’impliquent une telle asymétrie dans notre architecture. La convention de placement de fichier suivante : <LETTER>:\<SQLSERVER>\<INSTANCE>\<TYPEF_FICHIER>. Pour l’instance SQL141\IRONMAN pour les fichiers de données qui seront hébergés sur le disque E: nous aurons le placement suivant E:\SQLSERVER\IRONMAN\DATA.

L’ajout du fichier doit se faire en respectant la convention de placement en place. La question à 1 euros est-ce que je peux ajouter un fichier de données sans perturber l’architecture en place ?

…….

….

.

Pour le savoir rendez-vous dans la suite de ce billet !

La base de données concernée se nomme AGDB avec le schéma de répartition suivant :

image 

Côté groupe de disponibilité voici ce que nous avons :

image

 

Ajoutons maintenant un fichier supplémentaire …

image

et voilà le résultat côté groupe de disponibilité :

image

… et côté instance :

image

 

Comme dirait l’autre, ça c’est fait !!! Bon reprenons nos esprits et regardons un peu ce qui se passe dans le journal des erreurs SQL Server d’une des instances SQL Server concernées :

image

On voit rapidement que le problème est la convention de placement des fichiers de données. En effet SQL Server tente de propager la création de fichier depuis le primaire vers les secondaires qui n’ont pas du tout les mêmes chemins de fichiers. Une erreur est levée et tant que le problème n’est pas réglé la réplication est suspendue.

Ok … que doit-on faire ici ? Réinitialiser le tout en supprimant la base de données AGDB du groupe de disponibilité et repartir d’une nouvelle sauvegarde en prenant soin de changer les chemins de fichiers ? Possible mais cela veut dire qu’il faut tout rependre … avec des bases de données de petite taille c’est jouable mais imaginez seulement une base de données de plus d’une centaine de Go, le tout multiplié par 3 car nous avons 3 réplicas secondaires … Une autre solution ?  En fait oui .. on peut récupérer une sauvegarde de journal et la restaurer sur chacun des réplicas. Mais comment faire car il n’est pas possible d’appliquer des sauvegardes sur une base de données d’un groupe de disponibilités sur un réplica secondaire. En fait il faut supprimer la base de données du groupe de disponibilité sur chaque secondaire de la manière suivante :

image

Il se peut que des messages d’erreurs apparaissent stipulant un problème de création de fichiers sur un mauvais chemin mais on peut les ignorer. L’important est de pouvoir retrouver nos bases de données sur les réplicas secondaires en mode de restauration :

image

On peut maintenant appliquer une restauration du journal effectuée après avoir rencontré notre problème en veillant à restaurer notre fichier (AGDB2) qui pose problème vers le bon chemin :

image

et en ajoutant à nouveau la base de données au groupe de disponibilité pour le réplica concerné

image

… ainsi de suite pour les autres réplicas et le tour est joué :

image

… avec une répartition qui respecte la convention en vigueur :

image

Bien qu’il est possible de revenir à une situation pérenne plus ou moins facilement cela reste à mon avis fortement déconseillé car ce genre de configuration ne peut que compliquer l’administration courante d’un administrateur de bases de données. Ici nous avons ajouté un fichier de données mais que se passerait-il si nous devions ajouter en urgence un fichier journal en urgence dans un environnement SQL Server AlwaysOn complètement asymétrique ? …

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server 2014 : AlwaysOn, chiffrement TDE et chiffrement des sauvegardes

Mis en avant

SQL Server 2014 commence à pointer le bout de son nez avec la CTP2. Cette nouvelle version va apporter pas mal de nouveautés côté moteur notamment la plus attendue Hekaton mais d’autres seront également de la partie comme une amélioration continue de la haute disponibilité avec SQL Server AlwaysOn, la sécurité avec le chiffrement des sauvegardes ou encore la limitation des actions possibles pour un administrateur de bases de données, les index columstore index pouvant être mis à jour et bien d’autres. Dans ce billet j’ai choisi de parler de SQL Server AlwaysOn et du chiffrement des bases de données et des sauvegardes. Un premier billet sur la possibilité de chiffrer les sauvegardes avec SQL14 a déjà par Christophe Laporte. Je vous invite à le lire si vous voulez en savoir un peu plus sur cette fonctionnalité.

En testant SQL Server 2014, AlwaysOn et le chiffrement certaines questions me sont venus à l’esprit.  Ces questions sont les suivantes :

  • Est-ce qu’une table Hekaton (In memory) est chiffrée si la base de données qui l’héberge utilise TDE ?
  • Est-ce qu’il est possible d’implémenter TDE avec une base de données déjà membre d’un groupe de disponibilité ?
  • Quel avantage à avoir du chiffrement de sauvegardes de bases de données si celles-ci le sont déjà avec TDE ?

 

icon_arrow Est-ce qu’une table Hekaton (In memory) est chiffrée si la base de données qui l’héberge utilise TDE ?

Tout dépend ici de quoi l’on parle. Une table Hekaton réside en mémoire mais selon sa durabilité les données la concernant peuvent être stockées sur disque. TDE chiffre les données sur disque et pas en mémoire. Un processus de chiffrement et déchiffrement opère en temps réel sur les fichiers de données et journaux de transactions (cf la BOL) . Donc ici on peut se demander si le chiffrement s’effectue pour les tables Hekaton durables car celles-ci utilisent des fichiers de données et des fichiers delta afin de pouvoir remonter les données en cas de problème.

 

alwayson_tde_0

Activons maintenant TDE sur la base de données AdventureWorks2012.

alwayson_tde_01

… et là SQL Server nous donne rapidement la réponse attendue :

alwayson_tde_03

Les tables Hekaton durables en réalité reposent sur un stockage de type filestream. On peut le voir sur l’image ci-dessous :

alwayson_tde_04

Un coup d’œil sur la documentation en ligne de SQL Server à propos de TDE nous permet de confirmer que le chiffrement n’est pas valable pour ce type de conteneur. Cela est également confirmé par ce lien pour SQL14. –> TDE n’est donc pas supporté avec l’utilisation des tables Hekaton.

 

icon_arrow  Est-ce qu’il est possible d’implémenter TDE avec une base de données déjà membre d’un groupe de disponibilité ?

Nous avons implémenté une belle architecture AlwaysOn et une des bases de données d’un groupe de disponibilité requiert maintenant d’être chiffré pour des raisons de sécurité. Comment dois je procéder dans ce cas ? Est-ce qu’il suffit d’activer TDE sur la base de données située sur le réplica primaire ? Dois-je effectuer des manipulations sur les secondaires ? Dois-je repartir de zéro en supprimant cette base de données du groupe de disponibilité, chiffrer la base de données et refaire tout le processus d’ajout à un groupe de disponibilité (backup, restauration sur les secondaires et ajout au groupe de disponibilité) ?

Soyons un peu feignant et partons du principe que tout est à faire depuis le réplica primaire et que tout sera répliqué par la suite par AlwaysOn .. après tout ca sert à cela la réplication non ? :-) . Précédemment nous avons implémenté TDE sur la base de données AdventureWorks2012 qui faisait parti d’un groupe de disponibilité lst_adv. On pourrait conclure que tout est fini mais si l’on jette un rapide coup d’œil à l’état de synchronisation de notre groupe de disponibilité on s’aperçoit vite qu’un problème est survenu suite à la mise en place de TDE et que la base de données Adventureworks2012 est même dans un état suspect sur les serveurs secondaires sur SSMS.

alwayson_tde_1

 

Parfait … on active TDE et on se retrouve avec une base de données suspecte !! Bravo TDE !! :-) Ne paniquons pas et regardons un peu plus loin dans les logs d’erreurs SQL on peut voir ceci :

alwayson_tde_2

La cause du problème est la suivante : après avoir chiffré notre base de données sur le réplica primaire, les réplicas secondaires ne trouvent pas le certificat dont l’emprunte correspond à celle utilisé par le certificat créé initialement pour le chiffrement TDE. Dans ce cas la réplication du flux de données du réplica primaire vers réplicas secondaires est donc naturellement suspendue. Ce comportement est tout à fait normal puisque nous essayons de répliquer une base de données chiffrée vers une base de données qui ne peut pas être chiffrée. Ce fameux certificat est hébergé dans la base de données master et n’est pas répliqué automatiquement par AlwaysOn contrairement à la clé de chiffrement de bases de données située dans la base de données AdventureWorks2012. Il ne nous reste plus qu’à sauvegarder ce certificat, le restaurer sur les réplicas secondaires et relancer la réplication des données pour AdventureWorks2012 :

alwayson_tde_05

Après quelques secondes ou minutes (en fonction de la quantité de données à répliquer car l’état de synchronisation est suspendue) on peut voir sur le dashbord du groupe de disponibilité lst_adv que tout est rentré dans l’ordre :

alwayson_tde_3 

Pour résumé, il est possible d’implémenter TDE sur une topologie AlwaysOn existante à condition de bien penser à restaurer le certificat servant au chiffrement de la clé de chiffrement de la base de données pour TDE. Le mode feignant est donc à proscrire :-)

 

icon_arrow Quel avantage à avoir du chiffrement de sauvegardes de bases de données si celles-ci le sont déjà avec TDE ?

La documentation en ligne concernant TDE explique qu’une sauvegarde provenant d’une base chiffrée par TDE est également chiffrée par le même certificat de serveur. Quel intérêt à chiffrer de nouveau le média de backup par la nouvelle fonctionnalité de chiffrement proposée avec SQL Server 14 si celle-ci est déjà initialement chiffrée par TDE ? Je me suis posé la question en pensant qu’une fois qu’une base était chiffrée par TDE, le chiffrement des sauvegardes n’avaient aucun effet. Mais je me trompais bien sûr : le chiffrement des sauvegardes avec SQL14 agit indépendamment de TDE et chiffrera une seconde fois le média de sauvegarde. Cela nous permet d’ajouter une protection supplémentaire au média de sauvegarde à savoir que chaque chiffrement peut utiliser un algorithme différent. Voyons comment cela se passe.

On commence donc par créer un certificat dédié aux chiffrement des sauvegardes dans la base de données master :

image

On effectue une sauvegarde de notre base de données AdventureWorks2012 avec le nouveau mot clé ENCRYTION pour la commande BACKUP :

image

On a maintenant un média de sauvegarde doublement chiffré. Si maintenant on tente de lire le contenu de ce média depuis une nouvelle instance SQL on se retrouve avec le message d’erreur suivant :

alwayson_tde_6

La lecture de l’entête du média de sauvegarde est impossible si le serveur SQL ne possède pas un certain certificat avec l’emprunte décrite ci-dessus. Par déduction, on peut aussi affirmer que la restauration ne sera pas impossible pour le moment.

Restaurons le certificat utilisé pour le chiffrement des sauvegardes dans la base de données master de la nouvelle instance SQL et essayons à nouveau de lire le contenu du média de sauvegarde :

alwayson_tde_7

Cela ne fonctionne toujours pas … on peut remarquer que l’emprunte du certificat manquant est différent cette fois. Il correspond en réalité à celle du certificat créé initialement pour activer TDE sur AdventureWorks2012. Après avoir restauré ce certificat il est possible de lire le contenu du média de sauvegarde et donc de restaurer notre base de données :

alwayson_tde_4 

Pour un nouveau réplica AlwaysOn, il faudra donc bien penser à restaurer tous les certificats nécessaires à la restauration d’une base de données avant de la joindre au groupe de disponibilité concerné.

Bon chiffrement !!

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Server FCI et AlwaysOn et configuration quorum … de Windows 2008 à Windows 2012 R2

Mis en avant

Après quelques missions d’architecture sur l’implémentation d’architectures AlwaysOn chez divers clients il est temps de faire un point sur les possibilités de configuration du quorum du cluster Windows. En effet, pour rappel SQL Server AlwaysOn ou SQL Server FCI  se basent tous les 2 sur une couche Windows Failover Cluster Service (WFCS). Par conséquent le bon fonctionnement des groupes de disponibilités AlwaysOn ou des instances en cluster SQL reposent en quelque sorte sur celui du cluster Windows. Lorsqu’on parle de cluster Windows on arrive très vite à parler de quorum. La notion même de quorum n’est d’ailleurs pas uniquement associée au cluster. On peut la retrouver également lorsqu’on parle d’architecture en miroir avec SQL Server en mode synchrone et basculement automatique. Le but de ce billet est simplement de parcourir un peu les différentes possibilités de configuration du quorum avec WFSC à partir de 2008 R2 et de faire un focus sur les dernières innovations proposées par Windows Server 2012 et Windows Server 2012 R2.

 

icon_arrow Windows Server 2008 R2

Au fur et à mesure des versions Microsoft a fait évoluer ses modèles de quorum dans un processus continue d’amélioration de disponibilité du cluster Windows dans des scénarios de plus en plus divers. Par exemple on est passé de 2 modèles de quorum avec Windows 2003 à 4  à partir de Windows 2008. Windows 2008 a plus tard introduit la notion de paramétrage des poids de vote (avec l’application du KB2494036) qui peut s’avérer très utile dans des scénarios de type  “géo-cluster”. Cependant si le paramétrage du poids de vote se révèle très utile dans certains cas il n’en reste pas moins que celui-ci reste statique. En fonction de la situation c’est à l’administrateur de cluster de changer la configuration des poids de vote afin de garantir le quorum lors de la défaillances de nœuds.

L’image suivante montre 3 scénarios pour une architecture cluster Windows et pourquoi la nature statique du paramétrage du poids de vote peut poser problème :

 

quorum_1

 

Dans cette architecture le nœud 4 est sur un site distant. Comme nous ne voulons pas que ce nœud influence le vote du quorum en cas de coupure réseau entre les 2 sites nous pouvons lui supprimer la possibilité de voter dans l’établissement du quorum.

Scénario 1 :

Dans ce scénario il nous reste donc 3  nœuds qui peuvent voter (node 1, node 2 et node 3). Dans ce cas nous avons la possibilité d’utiliser le modèle de quorum “nœuds majoritaire” parce que le nombre de nœuds est impair ici. Dans cette configuration nous pouvons perdre jusqu’à 2 nœuds : le nœud 4 qui n’influence pas le vote du quorum via notre configuration et un des nœuds restants. Dans le cas où le nœud 4 aurait un vote nous ne pourrions perdre qu’un seul nœud.

Scénario 2 :

Dans ce scénario nous perdons le nœud 2 suite à une défaillance matérielle. Dans ce cas le cluster reste en ligne puisqu’il faut au minimum 2 nœuds pour effectuer le quorum. Cependant la perte d’un autre nœud risque à ce moment de compromettre la disponibilité du cluster. Dans ce cas l’administrateur du cluster Windows a 2 plusieurs possibilités :

  • Changer le quorum en ajoutant un témoin pour augmenter le nombre de votes possibles afin d’avoir la majorité en cas de défaillance d’un nœud
  • changer le nombre de votes possible à 1 seul nœud et en cas de défaillance du nœud 1 le cluster resterait en ligne (Dans notre exemple le nœud 3 perd sa possibilité de voter lors du quorum).

Scénario 3 :

Le nœud 2 a été réparé et est à nouveau opérationnel. Il faut de nouveau changer la configuration de poids de vote des nœuds pour augmenter la disponibilité du cluster en cas défaillance. En effet le vote étant ciblé uniquement sur un seul nœud, il devient le SPOF de cette topologie haute disponibilité. L’administrateur du cluster doit à nouveau activer le vote pour les nœuds 2 et 3 afin de garder en ligne le cluster Windows.

Pour résumer, le but du jeu ici est de jouer avec le poids de votes des nœuds tout en gardant à l’esprit qu’il faut garder plus 50% des votes pour garder le quorum en ligne !!

 

icon_arrow Windows Server 2012

Windows Server 2012 a changé la donne et a introduit le concept de quorum dynamique. Cette nouvelle fonctionnalité est intéressante car elle permet au cluster de recalculer à la volée le nombre de votes nécessaires pour que le cluster reste au maximum disponible. Ainsi il est possible d’avoir un cluster en ligne avec moins de 50% des nœuds restants.  A noter qu’il est toujours possible d’exclure des nœuds dans le vote du quorum avec un recalcul automatique qui ne tiendra compte uniquement que des nœuds restants.

En reprenant les scénarios décrits précédemment :

Scénario 1 :

quorum_2

On peut voir qu’il existe une nouvelle propriété appelée DynamicWeight. Le nœud 4 ne dispose pas de poids de vote (NodeWeight = 0) et par conséquent celui-ci ne sera pas pris en compte dans le calcul dynamique du quorum (dynamicweight=0) contrairement aux autres nœuds (NodeWeight et Dynamicweight = 1).

Scénario 2 :

quorum_3

On voit ici que le nœud 2 a subit une défaillance (State = Down) et que le calcul dynamique du quorum a été effectué par le cluster Windows. Par conséquent seul le nœud 3 possède un poids de vote ce qui permettra de garder en ligne le cluster en cas de défaillance d’un autre nœud de la topologie (nœud 1 ou 3).

quorum_4

L’arrêt du nœud 3 a déclenché à nouveau le recalcul du quorum par le cluster Windows. Ce dernier a transféré le poids de vote au seul nœud restant en ligne (nœud 1).

quorum_5

Les nœuds 2 et 3 ont été remis en ligne et à nouveau le cluster Windows a recalculé le poids de vote des nœuds pour le quorum.

Même si cette fonctionnalité présente des avantages certains, elle n’est cependant pas parfaite. En effet pour que le quorum se recalcule correctement, il faut que la défaillance des nœuds soit séquentielle dans le temps et que le recalcul du quorum ait eu le temps de s’effectuer. De plus l’introduction d’une ressource témoin avec Windows Server 2012 reste inchangé par rapport à Windows Server 2008 R2 à savoir que le témoin possède un poids de vote statique dans tous les cas ce qui diminue paradoxalement la disponibilité du cluster dans certains cas. Modifions notre architecture en y ajoutant un nœud supplémentaire de la façon suivante :

 

quorum_6

L’ajout d’un nœud pose ici un problème quant à l’établissement du quorum en cas de défaillance d’un des nœuds autre que nœud 5. Celui-ci comme dans l’architecture précédente n’est pas pris en compte dans le vote du quorum, ce qui laisse un nombre pair de nœuds qui peuvent voter. Dans cette configuration et sans quorum dynamique la défaillance de 2 nœuds ferait tomber à coup sûr l’ensemble du cluster Windows. En d’autres termes, la défaillance d’un seul nœud est supportée dans cette configuration. L’ajout d’une ressource témoin permet de pallier ce problème en ajoutant un vote supplémentaire afin d’augmenter le nombre de nœuds qui peuvent être défaillants à 2. Cependant avec l’utilisation du quorum dynamique, le recalcul se fera en tenant compte uniquement les nœuds du cluster restants en ligne. Le nombre de vote final sera donc composé de celui des nœuds restants + celui de la ressource témoin. Que se passera-t-il au moment où il restera un seul nœud en ligne et si l’on perd notre ressource témoin ? Malheureusement le quorum ne pourra être établi car il faudrait avoir au minimum 2 votes.

 

quorum_7

 

Ci-dessous un extrait de ce que l’on peut retrouver dans les logs du cluster Windows dans le cas où l’on perd une ressource témoin et par la suite le dernier nœud permettant au cluster Windows de rester en ligne.

Ici la ressource témoin est un dossier partagé qui n’est plus accessible ([RES] File Share Witness … Failed to create / Failed to validate etc …). Cependant le cluster peut encore rester en ligne puisque 2 nœuds sont encore présents pour faire le quorum (2 votes sur 3).

quorum_10

Cependant si l’on perd le dernier nœud (ici SQL122) comme montré ci-dessous …

quorum_11

… le début des problèmes commence puisque le cluster, malgré l’utilisation du quorum dynamique, se base encore sur le vote de la ressource témoin comme montré ci-dessous (File Share Witness is quorum and we’re one off quorum …). En effet à ce moment il n’existe plus qu’un seul vote sur 3 pour réaliser le quorum ce qui n’est plus suffisant. Après quelques secondes le cluster Windows

quorum_8

quorum_9

 

icon_arrow Windows Server 2012 R2

C’est ici que Windows Server 2012 R2 va avoir toute son utilité avec l’utilisation du témoin dynamique. Cette fonctionnalité permet de pallier au problème que nous venons de voir précédemment. Le vote du témoin est maintenant lui aussi dynamique et le cluster Windows recalcule le nombre de votes en fonction de la situation en tenant compte de ce nouvel élément.

L’image suivante montre la même situation que précédemment avec une topologie SQL Server 2014 décrite-dessus avec 5 nœuds dont un qui n’aura pas de vote pendant l’établissement du quorum. Au final nous avons 4 nœuds avec un poids de vote à 1.

image

On a également une ressource témoin de type FileShareWitness mais avec une nouvelle propriété WitnessDynamicWeight reflétant le caractère dynamique de la ressource témoin.

quorum_13

quorum_14

Que se passe-t-il si l’on perd la ressource témoin ?

quorum_15

On peut voir que la répartition des votes octroyés aux nœuds du cluster a changé dynamiquement. Premièrement le système a supprimé le vote de la ressource témoin et il a ensuite recalculé les votes de chaque nœud en supprimant celui octroyé au nœud 2 (SQL142). Cette nouvelle configuration prend en compte le fait que le nombre de nœuds restants pouvant voter est devenu pair et qu’il faut supprimer un vote à un des nœuds pour que celui-ci devienne impair.

quorum_16

En arrêtant successivement les nœuds 2 et 4 le quorum est de nouveau recalculé comme avec Windows 2012. Le nœud 3 est le seul à posséder un poids de vote car il possède le groupe de ressource système (nom réseau + IP du cluster Windows). Cela permet également en cas de défaillance du nœud 1 (ou éventuellement du nœud 3) de garder le cluster Windows en ligne

 

quorum_17

 

L’utilisation du témoin dynamique est également intéressante dans des configurations géo-clusters où le nombre de nœuds sur chaque site est équivalent. Prenons par exemple la configuration suivante :

quorum_18

Le cluster Windows possède 4 nœuds répartis par pair sur chaque site. Tous les nœuds du cluster peuvent voter et comme nous sommes dans une configuration où le nombre de nœuds par site est pair une ressource témoin a été ajouté sur le 1er site pour augmenter la disponibilité du cluster en cas de défaillance du lien réseau inter-sites. En effet sans cette ressource témoin, si une défaillance survenait sur ce lien réseau  nous pourrions être dans un cas de “split brain” avec l’apparition d’un partitionnement du cluster Windows en 2 parties. De plus le nombre de votes dans ce cas ne suffirait plus puisque la perte d’un seul nœud ne serait plus acceptable. Avec l’introduction du témoin nous éliminons du coup ce phénomène de “split brain” et nous augmentons en même temps le nombre global  de nœuds qui pouvant être défaillants soit 2 nœuds. Cependant la perte de cette ressource témoin en mode statique nous ramènerait au problème décrit un peu plus haut dans le billet . L’utilisation du témoin dynamique plus une nouvelle fonctionnalité de Windows Server 2012 R2 appelée “tie breaker” permet de garder le nombre de noeuds restants pouvant voter impair. C’est ce que nous pouvons voir ici après la perte du témoin :

quorum_19

Cependant si ce recalcul dynamique est bénéfique ici il serait intéressant aussi de pouvoir contrôler quels nœuds auront la priorité sur les autres pendant le recalcul. Dans notre cas nous voudrions par exemple garder un maximum de disponibilité sur le site A et donc donner la priorité aux serveurs correspondants. Heureusement pour nous il est possible de configurer des priorités par nœud avec la propriété de cluster  LowerQuorumPriorityNodeID.

quorum_20

quorum_21

On voit ici que l’assignement des poids de vote a changé en fonction de notre paramétrage.

image

Maintenant si nous perdons totalement le site 2 nous pourrons garantir que le cluster Windows sera encore en ligne.

Bonne configuration de quorum !!

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

Cas d’utilisation d’un groupe de disponibilité multi-listeners

Mis en avant

Pour ceux qui ont déjà installé SQL Server AlwaysOn vous avez pu sans doute remarquer qu’il est possible d’avoir uniquement un seul listener pour un groupe de disponibilité. Sur le principe cela n’est pas gênant dans la plupart des configurations mais comment dans le cas où un client cherche absolument à décomissionner un serveur SQL avec une multitude d’application et qu’il est difficile de changer le nom de serveur dans la chaîne de connexion de ces applications.

Prenons un cas concret que j’ai pu rencontrer chez un client lors d’une migration et qui aurait pu poser problème lors du passage à une architecture haute disponibilité SQL Server AlwaysOn :

  • Plusieurs applications installées sur une centaine de postes clients depuis longtemps et qui ne sont plus supportées par les différents éditeurs La chaîne de connexion des applications est codée en dur (pas de chance …) et l’intervention des différents consultants peut coûter cher d’autant plus que ces derniers proposent de mettre à jour l’application pour résoudre le problème. hors le client n’a pas forcément le budget pour cela car il n’a pas pu anticiper ce problème … bref le changement du nom de serveur pour cette application n’est pas envisageable et pourtant il nous faut migrer les bases de données pour décomissionner au plus vite notre ancien serveur SQL vers une infrastructure AlwaysOn

Quelles solutions avons-nous à disposition ?

–> Nous pouvons créer un listener avec l’ancien nom du serveur SQL et son ancienne adresse IP mais deux problèmes se posent :

  • le but est à l’origine est de pouvoir décomissionner l’ancien nom de serveur qui n’est plus conforme à la nouvelle nomenclature générale de nommage et doit être absolument changé dès que possible.
  • le planning de migration nous impose de migrer les applications en douceur et nous impose de garder de migrer les applications facilement modifiables au départ et garder les applications statiques pour la fin. Cette option n’est donc pas envisageable.

–> Nous pouvons utiliser un alias CNAME avec l’ancien nom de serveur qui pointe vers le nouveau listener. Cela suppose que notre ancien serveur soit complètement décomissionné pour pouvoir utiliser notre nouveau listener mais notre planning de migration nous impose encore une fois de garder l’ancien serveur pendant la phase de migration jusqu’à la fin. 

Dans ce cas cas comment faire ? He bien une solution (parmi quelques autres) serait de créer un second listener pour notre groupe de disponibilité. Comment ? En fait l’astuce consiste à passer par le gestionnaire de cluster et de créer un nouveau point d’accès client (Client Access Point) pour le rôle associé au groupe de disponibilité concerné avec un nom réseau et une adresse IP :

aag_new_cllient_access_point

aag_new_cllient_access_point_2

Une fois la ressource associé au nouveau point d’accès client créé il suffit de le mettre en ligne et de configurer les dépendances associées au groupe de disponibilité. L’utilisation d’une logique de dépendance à base de AND est possible mais il est préférable d’utiliser une logique de dépendance à base de OR pour garder le groupe de disponibilité en ligne autant que possible.

aag_new_cllient_access_point_3

Une fois le tout configuré on peut avoir apparaître un nouveau listener dans SQL Server Management Studio.

aag_new_cllient_access_point_4

L’utilisation de la vue système sys.availability_group_listeners nous montre également que le groupe aag possède bien 2 listeners :

image

La colonne is_conformant indique que le listener peut être managé depuis SQL Server. On voit également que pour le moment le listener n’est pas encore exploitable car aucun port d’écoute est configuré. Puisque le listener est configurable depuis SQL Server nous pouvons changer facilement son port depuis SQL Server Management Studio.

image

image

Un test de connexion et le tout fonctionne !!

image 

 

Merci à Qiang Wang pour l’astruce

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

Journées SQL Server 2013 c’est parti

Mis en avant

Les journées SQL Server 2013 auront lieu le 2 et 3 décembre 2013 au centre des conférences Microsoft à Issy-les-Moulineaux. L’agenda des sessions est disponible ici : http://guss.pro/2013/11/03/agenda-des-journees-sql-server-2013/

 

agenda

 

Comme d’habitude cet événement sera divisé en plusieurs catégories (en couleur) en fonction de vos envies et de vos intérêts. Cette année j’aurai l’opportunité de présenter et de co-animer plusieurs sessions :

 

Remercions une nouvelle fois le GUSS et les sponsors sans qui cet événement ne serait pas possible

Au plaisir de partager avec vous ce moment !

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

Microsoft Certified Master SQL Server 2008 — je suis

Mis en avant

Je profite d’un moment d’absence pour recommencer à écrire sur mon blog dédié à SQL Server. Cela fait un moment que je n’écris plus de billets mais il y avait une bonne raison à cela : la préparation de la certification MCM SQL Server 2008. Et cela a été payant puisque depuis peu je suis officiellement MCM SQL Server 2008 :-)

Je profite de ce billet pour partager rapide mon expérience sur l’obtention de cette certification qui se termine malheureusement bientôt. Bien que cette certification soit vouée à disparaître j’ai quand même voulu relever ce challenge. Pour ma part je suis arrivé tard sur ce programme par manque de temps. Avant de pouvoir la passer j’ai pris au sérieux la préparation de cette certification car l’une de ses grosses difficultés est l’étendue des domaines de connaissances qu’il faut pouvoir maîtriser et comme on peut s’en douter ceux-ci sont nombreux : administration, performance, sécurité, haute disponibilité, développement etc.. La préparation de cette certification m’a pris beaucoup de temps. Je ne saurais dire au total mais je sais que j’y ai sacrifié quelques soirées mais au bénéfice pour moi de revoir certains domaines dans lesquels je n’étais plus forcément familier (je pense que peu de personnes aujourd’hui travaillent simultanément sur tous les domaines sur lesquels on peut travailler avec SQL Server)  et d’approfondir certains. Ce fut l’occasion également d’acquérir encore plus de connaissance. 

Après avoir passé les 2 examens requis (théorique et lab) pour cette certification, je peux maintenant affirmer que le simple bachotage ne suffit pas et heureusement dira-t-on. Ces examens requièrent  une réelle expérience sur l’utilisation de SQL Server et apporte une réelle valeur ajoutée sur le marché. Pour les personnes ayant un certain niveau d’expérience c’est également une bonne occasion de faire le point pour aller plus loin. Je rejoins ainsi le groupe restreint des MCM avec un coup d’oeil particulier à certains MCM français que je connais comme Christophe Laporte ou encore Christian Robert.

MCM_2013(rgb)_1262

Il est maintenant temps de revenir plus activement sur la partie communautaire SQL Server et ceci pour très bientôt !!

 

David BARBARIN (Mikedavem)
MVP et MCM SQL Server

SQL Saturdays 2013 à Paris : les slides

Mis en avant

Comme promis voici les slides de ma session sur les événements étendus. Malheureusement je n’ai pas pu effectuer toutes les démonstrations que je voulais .. eh oui il faut bien commencer par expliquer comment fonctionne les événements étendus et cela m’a pris un peu plus de temps que prévu :-) . Mais ce n’est que partie remise, je garde cette partie pour une session uniquement orientée démonstration. J’espère pouvoir vous la présenter rapidement.

Merci aux personnes qui ont voulu assister à ma présentation et de assister de manière générale à ce premier SQL Saturdays  Paris. Ce fut un bon moment d’échange et de rencontres !

David BARBARIN (Mikedavem)
MVP SQL Server

Analyse des problèmes de basculement survenus sur une infrastructure SQL Server 2012 AlwaysOn

Mis en avant

Récemment j’ai eu à débugger un problème client survenu sur une infrastructure haute disponibilité SQL Server 2012 AlwaysOn. Le problème était le suivant : les connexions sur le réplica primaire ont subitement  cessé vers 12:25 et il n’était plus possible de s’y connecter. Le client, dans la précipitation, a visiblement essayer de basculer le groupe de disponibilité sur le réplica secondaire mais visiblement sans succès. Le but de mon intervention était d’expliquer à mon client pourquoi il n’était plus possible de se connecter aux réplicas et pourquoi le basculement n’a pas eu l’effet escompté. 

Par où commencer ? Analyser un problème sur une infrastructure AlwaysOn n’est pas une mince affaire en réalité. SQL Server 2012 AlwaysOn fonctionne sur une première couche basique de cluster à basculement au niveau du système d’exploitation et une couche applicative au niveau SQL Server. Lorsqu’un problème survient cela peut donc se produire sur l’une des 2 couches voir sur les 2 couches simultanément.

 

Les connexions se sont arrêtées subitement

Commençons dans l’ordre des problèmes. Dans le cas présent les connexions s’effectuent directement en utilisant le listener du groupe de disponibilité concerné. Cela peut vouloir dire que le problème se situe à ce niveau mais aussi au niveau de l’instance SQL Server. Pour cela nous avons à disposition :

  • les logs Windows ou du cluster à basculement Windows
  • les logs SQL Server
  • Les fichiers de diagnostics fournis par la procédure stockée sp_server_diagnostics

 

D’autres outils peuvent nous aider comme les sessions d’événements étendus AlwaysOn mais dans notre cas nous n’en aurons pas forcément besoin. J’essayerai d’effectuer un billet sur le sujet. Revenons à notre sujet : les logs Windows nous révèlent ceci :

billet_alwayson_diag_1

 

On voit ici une série d’erreur à partir de 12:20 relatives au cluster Windows à basculement :

  • Event ID 1562 : Cette erreur décrit un problème au niveau du témoin fichier partagé utilisé dans la configuration AlwaysOn qui nous concerné (2 nœuds + 1 FSW). Le partage servant comme élément de vote pour le quorum n’est plus accessible pour une raison non connue
  • Event ID 1069 : Cette erreur indique simplement qu’il existe un problème au niveau du groupe de ressource "Cluster Group". Dans notre cas cette erreur est provoquée par le partage qui n’est plus accessible.
  • Event ID 1564 : Cette erreur nous informe que le partage de fichier ne pourra pas jouer son rôle d’arbitrage en cas de défaillance d’un des nœuds de la topologie. En effet dans notre configuration le FSW n’étant plus disponible la perte d’un nœud de cluster supplémentaire serait fatale car la majorité ne pourrait pas être atteinte et le quorum ne pourrait pas être formé.

A ce stade on peut simplement conclure que le partage de fichier utilisé en tant que vote pour le quorum n’est plus accessible.

 

On retrouve également des erreurs de type NETLOGON qui nous en dit plus sur la nature de notre problème :

  • Event ID 5783 : Cette erreur indique qu’un problème de connexion aux serveurs DNS ou aux contrôleurs de domaine est survenu. Un redémarrage des serveurs ? Un problème de connexion de réseau entre le réplica primaire et les serveurs DNS ou DC ? Des serveurs ne pouvant plus répondre à cause d’un engorgement des demandes ? Une intervention sur l’infrastructure virtuelle sous-jacente ? Difficile à dire à ce stade … Ce qui est certain est que la résolution de nom ne pouvait pas s’effectuer correctement vers le partage de fichier dans ce cas, ce qui peut expliquer que le FSW n’était plus disponible à ce moment là

 

billet_alwayson_diag_13

 

L’analyse des logs SQL nous dévoilent ceci :

billet_alwayson_diag_2

 

Des informations intéressantes ici qui confirment bel et bien qu’un problème d’infrastructure a bien eu lieu avec une liaison à un contrôleur de domaine défaillante (No authority could be contacted for authentication).

L’erreur Windows nous spécifie la même chose :

billet_alwayson_diag_14

 

Une autre voix d’investigation est possible. Avec SQL Server 2012 AlwaysOn, la ressource DLL SQL Server utilisée par le cluster Windows à basculement exécute une procédure stockée sp_server_diagnostics pour déterminer l’état de santé du réplica primaire utilisé dans une topologie AlwaysOn. Des informations détaillées sont envoyés périodiquement au travers de cette ressource et permet au cluster Windows d’initier un basculement en fonction de ces informations et des règles de basculement associées. Toutes ces informations de diagnostics produites par la procédure stockée sp_server_diagnostics sont enregistrées par défaut dans des fichiers SQLDIAG exploitables directement par la fonction sys.fn_xe_file_target_read_file() ou directement dans SQL Server Management Studio.

SELECT
 xml_data.VALUE('(event/@name)[1]','varchar(max)') AS 'Name',
 xml_data.VALUE('(event/@package)[1]','varchar(max)') AS 'Package',
  xml_data.VALUE('(event/data[@name=''node_name'']/value)[1]','varchar(max)') AS 'Node_Name',
 xml_data.VALUE('(event/data[@name=''instance_name'']/value)[1]','varchar(max)') AS 'Instance_Name',
 xml_data.VALUE('(event/@timestamp)[1]','datetime') AS 'Time',
 xml_data.VALUE('(event/data[@name=''state'']/value)[1]','int') AS 'State',
 xml_data.VALUE('(event/data[@name=''state_desc'']/value)[1]','varchar(max)') AS 'State Description',
 xml_data.VALUE('(event/data[@name=''failure_condition_level'']/value)[1]','int') AS 'Failure Conditions',
 xml_data.VALUE('(event/data[@name=''creation_time'']/value)[1]','datetime') AS 'Creation Time',
 xml_data.VALUE('(event/data[@name=''component'']/value)[1]','varchar(max)') AS 'Component',
 xml_data.VALUE('(event/data[@name=''data'']/value)[1]','varchar(max)') AS 'Data',
 xml_data.VALUE('(event/data[@name=''info'']/value)[1]','varchar(max)') AS 'Info',
 xml_data
FROM (
SELECT
 object_name AS 'event'  ,
 CONVERT(xml,event_data) AS 'xml_data'  
 FROM sys.fn_xe_file_target_read_file('C:\customer_alwayson_issue\primary_replica\*.xel',NULL,NULL,NULL)
) AS XEventData
WHERE  xml_data.VALUE('(event/data[@name=''creation_time'']/value)[1]','datetime') > '20130723 12:15:00'
ORDER BY TIME;

 

billet_alwayson_diag_3

 

On remarque ici 2 choses. La procédure stockée sp_server_diagnostics stipule que le groupe de disponibilité qui nous concerne n’a visiblement pas de problème (premières flèches en rouge) . Les informations fournies ensuite par cette procédure stockée sont classés en catégorie (composants système, ressources, sous système disque, exécution des requêtes et autre évènements utiles notamment extraites des différents ring buffers SQL Server).

Concernant le composant de groupe de disponibilité :

billet_alwayson_diag_4

 

Concernant le composant Events :

billet_alwayson_diag_5

billet_alwayson_diag_6

 

On retrouve ici des informations du ring buffer "security error" dans lequel sont enregistrés les erreurs d’authentification. Celui-ci qui nous indique une erreur survenue lors de l’authentification via les api utilisés par SQL Server et d’autres informations que l’on retrouve dans les journaux d’erreurs Windows. Dans mon cas on retrouve une multitude d’enregistrements de ce genre dans ce ring buffer.

Pour résumer, nous avons donc ici l’origine du problème de connexion : un contrôleur de domaine ou un serveur DNS non joignable qui empêche les authentifications sur le réplica primaire. Passons maintenant à notre problème de basculement qui n’a visiblement pas fonctionné. Après investigation, c’est le processus de basculement manuel qui n’a pas fonctionné via l’interface GUI. En effet l’interface demande une authentification vers le réplica cible avant d’effectuer la bascule et comme le processus d’authentification ne fonctionnait pas avec des comptes de domaine il était alors impossible à ce moment là de basculer. Le serveur SQL a donc été redémarré. On peut le confirmer ici en regardant les informations contenues dans les journaux SQL Server que le service a été arrêté suite à une demande du gestionnaire de service.

 

billet_alwayson_diag_7

 

… Le gestionnaire de réplica démarre, attend que le service de cluster démarre correctement et démarre le réplica local. On voit que l’état du réplica passe de NOT_AVAILABLE à RESOLVING_NORMAL

 

billet_alwayson_diag_12

 

…On voit ici que le réplica local pour le groupe de disponibilité qui nous concerne se prépare à redevenir réplica primaire. L’état du réplica passe donc de RESOLVING_NORMAL à PRIMARY_PENDING

 

billet_alwayson_diag_8

… L’écoute démarre sur le listener associé au groupe de disponibilité  et le réplica passe à son état final PRIMARY_NORMAL.

 

billet_alwayson_diag_9

… Le réplica a bien redémarré mais on voit qu’il existe toujours des problèmes de connexion sur le réplica primaire à cause d’un problème de connexion à une autorité d’authentification (le fameux contrôleur de domaine).

 

billet_alwayson_diag_10

 

Pourquoi le groupe de disponibilité n’a-t-il pas pu basculer vers notre réplica secondaire ? Les règles de basculement étaient pourtant bien paramétré avec un niveau de condition par défaut (3). Les logs du cluster Windows sur le réplica secondaire nous donne la réponse :

billet_alwayson_diag_11

 

L’event id 1254 correspond à un nombre de basculement qui a dépassé le seuil autorisé pour un groupe de ressource. Dans notre cas le groupe de ressource correspond bien à notre groupe de disponibilité. Le basculement de ce dernier était donc impossible ici. C’est la raison pour laquelle le groupe de disponibilité a redémarré sur le réplica 1 après son redémarrage manuel.  La boucle est donc bouclée !!

 

Bonne investigation !

 

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Saturday à Paris 2013 le 14 septembre 2013 – Rappel

Mis en avant

Il est temps de dévoiler un peu le contenu de la session que je présenterai au cours des SQL Saturdays et de faire par la même occasion une piqure de rappel Sourire

Je pense que le titre de la session est assez parlante : SQL Trace vs Extended Events … Les évènements étendues sont devenus avec SQL Server 2012 un outil de diagnostic extrêmement puissant mais pourtant je pourrais parier que la majorité des développeurs ou des DBA utilisent encore le profiler de SQL Serve car ce dernier reste encore très pratique à utiliser. Pourtant les possibilités du profiler sont loin d’égaler celles offertes par les évènements étendues et ce c’est que je tenterai de montrer lors de cette session.

Les sessions sont les évènements étendues ne sont pas nouvelles. David Baffaleuf ou encore Nicolas Souquet en ont parlé avant moi et le but ne sera pas de faire doublon avec leur excellent travail. La grande majorité de la session sera donc dédiée à une présentation concrète de cas pratique où les évènements étendues auront un grand intérêt !

En espérant vous voir nombreux Sourire

N’oublions les autres sessions très intéressantes présentées par Christophe Laporte avec IO Fusion ou encore celle présentée par Hugo Kornelis sur les index columstore pour la partie DBA … que du bonheur !

 

SQLSAT251_web_thumb1

 

David BARBARIN (Mikedavem)
MVP SQL Server

Détecter un basculement automatique avec SQL Server 2012 AlwaysOn

Mis en avant

Après avoir installé une infrastructure SQL Server 2012 AlwaysOn, il peut être intéressant d’être alerté lorsqu’un groupe de disponibilité basculement automatiquement d’un réplica à un autre pour une raison quelconque. Alors que pour les architectures en mirrroring nous avons built-in tout ce qu’il faut avec DATABASE_MIRRORING_STATE_CHANGE et des états en sortie qui nous permettent de savoir si un basculement manuel ou automatique a été effectué, c’est une autre paire de manche avec les infrastructures AlwaysOn. La documentation en ligne nous propose différentes outils comme  System Center, SQL Server Management Studio, les compteurs de performances ou encore Transact-SQL. Je rajouterai également PowerShell qui peut nous aider ici ou encore les outils tiers qui viendront compléter cette liste.

Voici une solution parmi d’autres. Pour ma part j’ai opté pour :

  • Une routine continue en T-SQL qui va chercher les changements d’états survenus sur les groupes de disponibilités présents sur un serveur sql. Si un changement est détecté un email est envoyé via databasemail aux personnes concernées
  • Un job SQL qui démarre et s’exécute lorsque le service de l’agent SQL Server démarre ou redémarre. Ce service est déjà monitoré par des outils tiers et si un problème survient au niveau de l’agent SQL l’information sera de toute façon remontée

 

icon_arrow Le code de la routine à intégrer

-- WORK TABLES
DECLARE @t_aag TABLE
(
   group_name SYSNAME NOT NULL,
   primary_replica VARCHAR(128) NOT NULL,
   primary_recovery_health NVARCHAR(80) NULL
);

DECLARE @t_aag_result TABLE
(
   [action] VARCHAR(50) NOT NULL,
   group_name SYSNAME NOT NULL,
   primary_replica_old VARCHAR(128) NULL,
   primary_replica_new VARCHAR(128) NOT NULL,
   primary_recovery_health NVARCHAR(80) NULL
);

INSERT @t_aag (group_name, primary_replica, primary_recovery_health)
SELECT [group_name], [primary_replica_new], [primary_recovery_health]
FROM [dbo].[dbi_alwayson_failover_logs];

WITH aag
AS
(
SELECT
    g.name AS group_name,
    primary_replica,
    primary_recovery_health_desc
    FROM sys.dm_hadr_availability_group_states AS ags
    JOIN sys.availability_groups AS g
    ON ags.group_id = g.group_id
)
MERGE dbo.dbi_alwayson_failover_logs AS t_aag
USING aag
ON aag.group_name = t_aag.group_name COLLATE Latin1_General_CS_AS_KS
WHEN matched AND aag.primary_replica != t_aag.primary_replica_new COLLATE Latin1_General_CS_AS_KS
THEN UPDATE SET event_time = CURRENT_TIMESTAMP,
                primary_replica_new = aag.primary_replica,
                primary_replica_old = primary_replica_new,
                primary_recovery_health = aag.primary_recovery_health_desc
WHEN NOT MATCHED BY TARGET
THEN INSERT VALUES (CURRENT_TIMESTAMP, aag.group_name, NULL, aag.primary_replica, aag.primary_recovery_health_desc)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT $action, inserted.group_name, deleted.primary_replica_new, inserted.primary_replica_new, inserted.primary_recovery_health
INTO @t_aag_result;

SELECT
    group_name,
    primary_replica_new
FROM @t_aag_result
WHERE [action] = 'UPDATE'


-- Reset work table
DELETE FROM @t_aag;
DELETE FROM @t_aag_result;
GO

 

Le script fonctionne de manière suivante :

  • 2 tables de travail @t_aag et @t_aag_result qui vont respectivement contenir la configuration des groupes de disponibilités présents sur le serveur SQL et le delta éventuel dans une configuration existante (action = update) qui impliquerait un basculement dans notre cas
  • Une boucle continue de détection de basculement avec une temporisation de 10 secondes
  • 1 table [dbo].[dba_alwayson_failover_logs] qui contiendra une ligne de données pour chaque  basculement de groupes de disponibilité détecté. Une procédure stockée dbo.dba.alwayson_mail se servira ensuite de cette table d’historique pour l’envoi des emails.
  • Une instruction MERGE utilisée ici pour mettre à jour en continue la configuration des groupes de disponibilités sur le serveur SQL concerné (les ajouts, les mises à jour et les suppressions de groupes de disponibilités) avec insertion d’une ligne de données en cas de mise à jour du réplica primaire pour un groupe de disponibilité (when matched and aag.primary_replica <> t_aag.primary_replica)

 

icon_arrow Le code de la table d’historique

CREATE TABLE [dbo].[dbi_alwayson_failover_logs](
    [event_time] [datetime] NOT NULL DEFAULT (getdate()),
    [group_name] [sysname] NOT NULL,
    [primary_replica_old] [VARCHAR](128) NULL,
    [primary_replica_new] [VARCHAR](128) NOT NULL,
    [primary_recovery_health] [nvarchar](80) NULL
) ON [PRIMARY]

 

Je ne mets pas ici volontairement le code la procédure d’envoi d’email car elle est plutôt spécifique à notre environnement de script. La logique est assez simple et consiste simplement à :

  • 1- parcourir la table d’historique [dbo].[dba_alwayson_failover_logs] et vérifier les lignes de données non traitées par la routine d’envoi d’email.
  • 2- Mettre à jour la valeur de colonne sent_by_email à 1 une fois l’email envoyé.

 

Et vous comment faites-vous ?

Bonne détection de basculement !

 

David BARBARIN (Mikedavem)
MVP SQL Server

Gérer les erreurs générées par la commande DBCC CHECKDB dans un script T-SQL

Mis en avant

La vérification d’intégrité des bases de données s’effectue par la commande DBCC CHECKDB. Le résultat de cette commande est assez verbeuse par défaut et peut poser problème lorsque la vérification d’intégrité est  utilisé dans des scripts T-SQL personnalisés de maintenance par exemple.

 

Posons un peu le contexte et le pourquoi de ce billet. En réalité j’ai eu l’occasion de travailler (comme beaucoup je pense) sur la création de plans de maintenance "custom". L’idée a été de construire un jeu de script permettant de pouvoir gérer l’ensemble des tâches que l’on peut avoir à utiliser pour la maintenance des bases de données. Une de ces tâches concerne la vérification d’intégrité des bases. Cette vérification se fait à l’aide de la commande bien connue DBCC CHECKDB. Dans notre contexte l’idée est de pouvoir exécuter une tâche de maintenance et d’enregistrer dans une table de log les données suivantes :

  • Nom de la tâche
  • Nom de la base concernée
  • Durée de la tâche
  • Statut de la tâche (OK ou en échec)
  • Envoi par mail des tâches en échec à posteriori avec le détail de l’erreur

Ceci nous permet d’avoir une traçabilité des tâches de maintenance par la suite et pouvoir les consommer à des fins d’analyse.

Lorsque l’on scripte une vérification d’intégrité à l’aide de la commande DBCC CHECKDB on s’aperçoit rapidement que la gestion des erreurs liées à cette commande n’est pas triviale. C’est que nous verrons dans le cadre de ce billet.

 

icon_arrow Une sortie verbeuse

Voici la sortie d’une commande DBCC CHECKDB sur une base de données corrompue :

DBCC CHECKDB ('DemoCorruptMetadata')

DBCC results for ‘DemoCorruptMetadata’.
Service Broker Msg 9675, State 1: Message Types analyzed: 14.
Service Broker Msg 9676, State 1: Service Contracts analyzed: 6.
Service Broker Msg 9667, State 1: Services analyzed: 3.
Service Broker Msg 9668, State 1: Service Queues analyzed: 3.
Service Broker Msg 9669, State 1: Conversation Endpoints analyzed: 0.
Service Broker Msg 9674, State 1: Conversation Groups analyzed: 0.
Service Broker Msg 9670, State 1: Remote Service Bindings analyzed: 0.
Service Broker Msg 9605, State 1: Conversation Priorities analyzed: 0.
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (object_id=1977058079) of row (object_id=1977058079,column_id=1) in sys.columns does not have a matching row (object_id=1977058079) in sys.objects.
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (object_id=1977058079) of row (object_id=1977058079,column_id=2) in sys.columns does not have a matching row (object_id=1977058079) in sys.objects.
CHECKDB found 0 allocation errors and 2 consistency errors not associated with any single object.
DBCC results for ‘sys.sysrscols’.
There are 872 rows in 9 pages for object "sys.sysrscols".
DBCC results for ‘sys.sysrowsets’.
There are 124 rows in 1 pages for object "sys.sysrowsets".
DBCC results for ‘sys.sysclones’.
There are 0 rows in 0 pages for object "sys.sysclones".
DBCC results for ‘sys.sysallocunits’.
There are 138 rows in 2 pages for object "sys.sysallocunits".
DBCC results for ‘sys.sysfiles1′.
There are 2 rows in 1 pages for object "sys.sysfiles1".
DBCC results for ‘sys.sysseobjvalues’.
There are 0 rows in 0 pages for object "sys.sysseobjvalues".
DBCC results for ‘sys.syspriorities’.
There are 0 rows in 0 pages for object "sys.syspriorities".
DBCC results for ‘sys.sysdbfrag’.
There are 0 rows in 0 pages for object "sys.sysdbfrag".
DBCC results for ‘sys.sysfgfrag’.
There are 0 rows in 1 pages for object "sys.sysfgfrag".
DBCC results for ‘sys.sysdbfiles’.
There are 2 rows in 1 pages for object "sys.sysdbfiles".
DBCC results for ‘sys.syspru’.
There are 0 rows in 0 pages for object "sys.syspru".
DBCC results for ‘sys.sysbrickfiles’.
There are 0 rows in 0 pages for object "sys.sysbrickfiles".
DBCC results for ‘sys.sysphfg’.
There are 1 rows in 1 pages for object "sys.sysphfg".
DBCC results for ‘sys.sysprufiles’.
There are 2 rows in 1 pages for object "sys.sysprufiles".
DBCC results for ‘sys.sysftinds’.
There are 0 rows in 0 pages for object "sys.sysftinds".
DBCC results for ‘sys.sysowners’.
There are 14 rows in 1 pages for object "sys.sysowners".
DBCC results for ‘sys.sysdbreg’.
There are 0 rows in 0 pages for object "sys.sysdbreg".
DBCC results for ‘sys.sysprivs’.
There are 136 rows in 1 pages for object "sys.sysprivs".
DBCC results for ‘sys.sysschobjs’.
There are 2180 rows in 29 pages for object "sys.sysschobjs".
DBCC results for ‘sys.syscolpars’.
There are 698 rows in 11 pages for object "sys.syscolpars".
DBCC results for ‘sys.sysxlgns’.
There are 0 rows in 0 pages for object "sys.sysxlgns".
DBCC results for ‘sys.sysxsrvs’.
There are 0 rows in 0 pages for object "sys.sysxsrvs".
DBCC results for ‘sys.sysnsobjs’.
There are 1 rows in 1 pages for object "sys.sysnsobjs".
DBCC results for ‘sys.sysusermsgs’.
There are 0 rows in 0 pages for object "sys.sysusermsgs".
DBCC results for ‘sys.syscerts’.
There are 0 rows in 0 pages for object "sys.syscerts".
DBCC results for ‘sys.sysrmtlgns’.
There are 0 rows in 0 pages for object "sys.sysrmtlgns".
DBCC results for ‘sys.syslnklgns’.
There are 0 rows in 0 pages for object "sys.syslnklgns".
DBCC results for ‘sys.sysxprops’.
There are 0 rows in 0 pages for object "sys.sysxprops".
DBCC results for ‘sys.sysscalartypes’.
There are 34 rows in 1 pages for object "sys.sysscalartypes".
DBCC results for ‘sys.systypedsubobjs’.
There are 0 rows in 0 pages for object "sys.systypedsubobjs".
DBCC results for ‘sys.sysidxstats’.
There are 130 rows in 1 pages for object "sys.sysidxstats".
DBCC results for ‘sys.sysiscols’.
There are 317 rows in 3 pages for object "sys.sysiscols".
DBCC results for ‘sys.sysendpts’.
There are 0 rows in 0 pages for object "sys.sysendpts".
DBCC results for ‘sys.syswebmethods’.
There are 0 rows in 0 pages for object "sys.syswebmethods".
DBCC results for ‘sys.sysbinobjs’.
There are 23 rows in 1 pages for object "sys.sysbinobjs".
DBCC results for ‘sys.sysaudacts’.
There are 0 rows in 0 pages for object "sys.sysaudacts".
DBCC results for ‘sys.sysobjvalues’.
There are 134 rows in 13 pages for object "sys.sysobjvalues".
DBCC results for ‘sys.syscscolsegments’.
There are 0 rows in 0 pages for object "sys.syscscolsegments".
DBCC results for ‘sys.syscsdictionaries’.
There are 0 rows in 0 pages for object "sys.syscsdictionaries".
DBCC results for ‘sys.sysclsobjs’.
There are 16 rows in 1 pages for object "sys.sysclsobjs".
DBCC results for ‘sys.sysrowsetrefs’.
There are 0 rows in 0 pages for object "sys.sysrowsetrefs".
DBCC results for ‘sys.sysremsvcbinds’.
There are 0 rows in 0 pages for object "sys.sysremsvcbinds".
DBCC results for ‘sys.sysxmitqueue’.
There are 0 rows in 0 pages for object "sys.sysxmitqueue".
DBCC results for ‘sys.sysrts’.
There are 1 rows in 1 pages for object "sys.sysrts".
DBCC results for ‘sys.sysconvgroup’.
There are 0 rows in 0 pages for object "sys.sysconvgroup".
DBCC results for ‘sys.sysdesend’.
There are 0 rows in 0 pages for object "sys.sysdesend".
DBCC results for ‘sys.sysdercv’.
There are 0 rows in 0 pages for object "sys.sysdercv".
DBCC results for ‘sys.syssingleobjrefs’.
There are 156 rows in 1 pages for object "sys.syssingleobjrefs".
DBCC results for ‘sys.sysmultiobjrefs’.
There are 107 rows in 1 pages for object "sys.sysmultiobjrefs".
DBCC results for ‘sys.sysguidrefs’.
There are 0 rows in 0 pages for object "sys.sysguidrefs".
DBCC results for ‘sys.sysfoqueues’.
There are 0 rows in 0 pages for object "sys.sysfoqueues".
DBCC results for ‘sys.syschildinsts’.
There are 0 rows in 0 pages for object "sys.syschildinsts".
DBCC results for ‘sys.syscompfragments’.
There are 0 rows in 0 pages for object "sys.syscompfragments".
DBCC results for ‘sys.sysftsemanticsdb’.
There are 0 rows in 0 pages for object "sys.sysftsemanticsdb".
DBCC results for ‘sys.sysftstops’.
There are 0 rows in 0 pages for object "sys.sysftstops".
DBCC results for ‘sys.sysftproperties’.
There are 0 rows in 0 pages for object "sys.sysftproperties".
DBCC results for ‘sys.sysxmitbody’.
There are 0 rows in 0 pages for object "sys.sysxmitbody".
DBCC results for ‘sys.sysfos’.
There are 0 rows in 0 pages for object "sys.sysfos".
DBCC results for ‘sys.sysqnames’.
There are 100 rows in 1 pages for object "sys.sysqnames".
DBCC results for ‘sys.sysxmlcomponent’.
There are 100 rows in 1 pages for object "sys.sysxmlcomponent".
DBCC results for ‘sys.sysxmlfacet’.
There are 112 rows in 1 pages for object "sys.sysxmlfacet".
DBCC results for ‘sys.sysxmlplacement’.
There are 19 rows in 1 pages for object "sys.sysxmlplacement".
DBCC results for ‘sys.sysobjkeycrypts’.
There are 0 rows in 0 pages for object "sys.sysobjkeycrypts".
DBCC results for ‘sys.sysasymkeys’.
There are 0 rows in 0 pages for object "sys.sysasymkeys".
DBCC results for ‘sys.syssqlguides’.
There are 0 rows in 0 pages for object "sys.syssqlguides".
DBCC results for ‘sys.sysbinsubobjs’.
There are 3 rows in 1 pages for object "sys.sysbinsubobjs".
DBCC results for ‘sys.syssoftobjrefs’.
There are 0 rows in 0 pages for object "sys.syssoftobjrefs".
DBCC results for ‘sys.queue_messages_1993058136′.
There are 0 rows in 0 pages for object "sys.queue_messages_1993058136".
DBCC results for ‘sys.queue_messages_2025058250′.
There are 0 rows in 0 pages for object "sys.queue_messages_2025058250".
DBCC results for ‘sys.queue_messages_2057058364′.
There are 0 rows in 0 pages for object "sys.queue_messages_2057058364".
DBCC results for ‘sys.filestream_tombstone_2089058478′.
There are 0 rows in 0 pages for object "sys.filestream_tombstone_2089058478".
DBCC results for ‘sys.syscommittab’.
There are 0 rows in 0 pages for object "sys.syscommittab".
DBCC results for ‘sys.filetable_updates_2121058592′.
There are 0 rows in 0 pages for object "sys.filetable_updates_2121058592".
CHECKDB found 0 allocation errors and 2 consistency errors in database ‘DemoCorruptMetadata’.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

 

On se rend vite compte que la quantité d’information qui nous intéresse ici reste négligeable par rapport à la quantité totale d’information produite en sortie par notre commande. Ici la commande DBCC CHECKDB a produit 162 lignes d’information alors que  moins de 10 lignes nous intéresse ici. Heureusement pour nous, nous pouvons jouer avec les options NO_INFOMSGS et ALL_ERRORMSGS pour limiter le nombre d’informations produites par DBCC CHECKDB. Pour rappel NO_INFOMSGS permet d’éliminer les messages d’information produites en sortie et ALL_ERRORMSGS permet d’afficher toutes les erreurs rencontrées lors d’une opération de vérification de bases de données. Par défaut seulement les 1000 premiers messages d’erreur sont affichés depuis SQL Server Management Studio.

 

icon_arrow Utilisation des options NO_INFOMSGS, ALL_ERRORMSGS

DBCC CHECKDB ('DemoCorruptMetadata') WITH NO_INFOMSGS, ALL_ERRORMSGS

 

Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (object_id=1977058079) of row (object_id=1977058079,column_id=1) in sys.columns does not have a matching row (object_id=1977058079) in sys.objects.
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (object_id=1977058079) of row (object_id=1977058079,column_id=2) in sys.columns does not have a matching row (object_id=1977058079) in sys.objects.
CHECKDB found 0 allocation errors and 2 consistency errors not associated with any single object.
CHECKDB found 0 allocation errors and 2 consistency errors in database ‘DemoCorruptMetadata’.

 

On a ici bien réduit le nombre de lignes produites par notre commande DBCC CHECKDB avec l’affichage du détail des erreurs rencontrées et 2 messages d’information qui ne sont ni plus ni moins qu’un récapitulatif de ces erreurs.

 

icon_arrow Gestion de la sortie de la commande DBCC CHECKDB dans un script T-SQL

Après avoir limité le nombre d’information utiles comment nous en servir pour construire une logique de maintenance par script ? L’idée ici est simplement de pouvoir détecter un problème d’intégrité et de prévenir les personnes concernées (notamment l’équipe DBA) qu’un problème est survenu à ce moment là

A priori 2 voies d’exploitation évidentes peuvent être prises en compte :

  • On peut utiliser la variable @@ERROR et vérifier que celle-ci soit différente de 0
  • On peut utiliser les blocs de gestions d’erreur TRY CATCH

 

Avec la variable @@ERROR :

dbcc checkdb('DemoCorruptMetadata') WITH no_infomsgs, all_errormsgs;
IF @@ERROR  <>0    
BEGIN    
 print '';    
 print '--> error during dbcc checkdb';    
END

 

Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (object_id=1977058079) of row (object_id=1977058079,column_id=1) in sys.columns does not have a matching row (object_id=1977058079) in sys.objects.
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (object_id=1977058079) of row (object_id=1977058079,column_id=2) in sys.columns does not have a matching row (object_id=1977058079) in sys.objects.
CHECKDB found 0 allocation errors and 2 consistency errors not associated with any single object.
CHECKDB found 0 allocation errors and 2 consistency errors in database ‘DemoCorruptMetadata’.
 
–> error during dbcc checkdb

 

La variable @@ERROR nous permet effectivement de pouvoir détecter les erreurs engendrées par la commande DBCC CHECKDB. Il suffit ensuite de coder la logique de maintenance qui nous intéresse. Cependant si on utilise notre script T-SQL dans un job SQL Server, les erreurs produites impliqueront une étape de job en échec. La question est donc de savoir ce résultat est attendu ou non ? Effectivement ce n’est pas parce qu’une commande DBCC CHECKDB produit une erreur qu’un job SQL Server doit forcément partir en échec. En réalité tout dépendra de la logique d’exécution globale concernée par ce script. On peut tout à fait traiter l’erreur de job et effectuer une surveillance sur l’état de ce job par envoi d’alerte ou via des outils tiers par exemple. On peut aussi vouloir enregistrer l’erreur sans que le job parte en échec, avec l’exécution d’étapes supplémentaires sans pour autant avoir une logique d’exécution complexe du style "si étape 1 échec –> aller à l’étape 3 sinon aller à l’étape 2 etc … A mon humble avis les jobs SQL Server ne sont pas vraiment désignés pour gérer des logiques complexes de workflow . Dans le cadre de notre script nous avons retenu une solution générique et simple : si une tâche génère une erreur alors celle-ci est enregistrée dans une table de log et l’information pourra être envoyé à posteriori par email. Le choix est laissé à l’utilisateur final. 

 

Avec le bloc de gestion d’erreur BEGIN TRY, CATCH :

BEGIN try    
 dbcc checkdb('DemoCorruptMetadata') WITH no_infomsgs, all_errormsgs;    
END try    
BEGIN catch    
 print '--> error during dbcc checkdb';    
END catch

 

CHECKDB found 0 allocation errors and 2 consistency errors not associated with any single object.
CHECKDB found 0 allocation errors and 2 consistency errors in database ‘DemoCorruptMetadata’.

 

Comme on peut le remarquer le bloc de gestion TRY , CATCH ne va malheureusement pas nous être d’une grande utilité ici car les dernières lignes d’information produites par la commande DBCC CHECKDB empêchent notre bloc de gestion d’erreur de détecter les erreurs produites par notre commande DBCC CHECKDB quelques lignes plus haut.

 

Avons nous une autre alternative dans ce cas ? La réponse est oui. Il est également possible d’enregistrer les erreurs produites lors d’une vérification d’intégrité dans une table SQL en utilisant l’option TABLERESULTS de cette manière :

 

icon_arrow Utilisation de l’option TABLERESULTS

 

DBCC CHECKDB('DemoCorruptMetadata')
WITH NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS

 

dbcc_checkdb_tableresults

 

Il suffit ici d’extraire les informations produites dans la table et de gérer sa propre logique de maintenance. Dans mon cas je remplis une variable de table avec le résultat de la commande DBCC CHECKDB et l’option TABLERESULETS et je vérifie qu’au moins une ligne existe pour détecter la présence d’une erreur (la commande DBCC CHECKDB ne produit aucune ligne d’erreur si aucun problème d’intégrité n’est détecté).  L’information est ensuite enregistrée dans une table de log avec le numéro d’erreur et sera envoyé par mail à postériori.

 

L’option TABLERESULTS est-elle là solution miracle ? Malheureusement non car la commande DBCC CHECKDB peut produire certaines erreurs propres à son exécution et qui stopper franchement le script en cours d’exécution. C’est le cas de certaines erreurs sévères rencontrés par la commande DBCC CHECKDB.

 

icon_arrow Gestion des erreurs liées à l’exécution même de la commande DBCC CHECKDB

Voici quelques cas où l’exécution de la commande DBCC CHECKDB provoquera une erreur grave et un arrêt net du script T-SQL en cours d’exécution.

 

- Après avoir corrompu la page PFS (page id = 1)  à l’aide d’un éditeur hexadécimal de ma base DemoCorruptMetada le script SQL se stoppera net avec le message d’erreur suivant :

Msg 0, Level 11, State 0, Line 0
A severe error occured on the current command. The results, if any, should be discarded

 

- De la même manière Après avoir supprimer une ligne dans la table système sys.syscolpars en redémarrant l’instance SQL Server en mode mono utilisateur et se connectant en mode administrateur dédié la commande DBCC CHECKDB génère le message suivant :

 

Msg 0, Level 20, State 0, Line 0
A severe error occured on the current command. The results, if any, should be discarded

 

Pour une description des niveaux d’erreurs voir la documentation en ligne SQL Server (section "Understanding DBCC errors messages"). Dans ce cas il faudra effectivement gérer l’erreur de manière différente. Dans mon cas au début de chaque tâche une ligne est enregistrée dans une table de log. Si le script T-SQL est arrêté a date de fin de la tâche ne sera pas renseigné. Un email est envoyé pour les cas suivants :

  • Le statut de la tâche est égale à false
  • Le statut de la tâche est inconnu ou la date de fin d’une tâche n’est pas renseignée

 

Bonne gestion d’erreur !!

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Saturday à Paris 2013 le 14 septembre 2013

Mis en avant

C’est fait les SQL Saturdays arrivent en France ! Cet évènement se déroulera le samedi 14 septembre 2013 entre 10H et 17H à Paris au sein du campus des écoles informatiques bien connus EPITA et EPITECH. Celui-ci sera axé de 3 pôles spécifiques :

  • Business Intelligence
  • Administration de bases de données
  • Etudiant

 

SQLSAT251_web_thumb1

 

Cet évènement aura la particularité d’accueillir des speakers anglophones tels que Jen Stirrup, Allan Mitchell ou Hugo Kornelis (donc préparer votre anglais) mais aussi et en grande majorité des speakers français comme Jean-Pierre Riehl, Christophe Laporte, Phillipe Geiger, Patrick Guimonet et d’autres . Je vous laisse découvrir leurs noms sur le site dédié à l’évènement. Pour le planning c’est par ici.

J’aurai l’opportunité de lancer les hostilités pour le track pour DBA avec une session sur les traces SQL vs les évènements étendus. Ce sera également l’occasion de pouvoir partager nos différentes expériences entre jeunes et moins jeunes Sourire

A noter que cet évènement a été à l’initiative du GUSS

 

guss

 

Rien de tel pour préparer sa rentrée Sourire 

 

David BARBARIN (Mikedavem)
MVP SQL Server

Considération sur les listeners associées aux groupes de disponibilités avec SQL Server 2012 AlwaysOn

Mis en avant

Lorsqu’on crée un groupe de disponibilité avec SQL Server et AlwaysOn on l’associe par la suite à un listener. Lorsque ce dernier est créé plusieurs objets lui sont associées :

  • Un objet d’ordinateur dans l’annuaire active directory
  • Une entrée DNS de type A
  • Une ressource cluster associée à au groupe de ressource créé et qui représente le groupe de disponibilité

 

Dans l’exemple suivante un groupe de disponibilité nommé AdventureWorks2 a été créé. Le listener associé s’appelle LST_ADVW2

 

alwayson_aag_lst

 

icon_arrow Les différents objets associés

 

L’objet d’ordinateur dans l’annuaire :

alwayson_ad_object

 

… l’enregistrement DNS :

alwayson_dns_record

 

… Le groupe de ressource lié au groupe de disponibilité :

alwayson_cluster_resource

 

… et les ressources qui le composent :

alwayson_cluster_resource2

 

Jetons un coup d’œil aux dépendances existantes entre les ressources du groupe de ressource AdventureWorksGrp2 :

alwayson_cluster_dependencies

 

Ici on vient bien les dépendances existantes : le groupe de disponibilité AdventureWorksGrp2 dépend de la ressource "nom réseau" qui représente notre listener (LST_ADVW2) qui elle même dépend de la ressource "Adresse IP" qui vous l’aurez devinez, correspond à l’adresse IP de notre listener.

 

icon_arrow Port d’écoute du listener

Est-ce qu’un listener doit écouter sur le même port que les réplicas du groupe disponibilité ?  Est-ce possible ? C’est une question qui s’est posé rapidement dans mon cas lorsqu’il a fallu installer des réplicas n’écoutant pas sur le port qui n’écoutaient pas sur le port par défaut (1433). On peut même aller à l’extrême et prendre le cas où chaque réplica écoute sur un port différent. Dans ce cas quel port dois-je paramétrer pour mon listener ? Un listener peut tout à fait écouter sur un port différent que les réplicas. Le choix du numéro de port dépend évidement de vos besoins, contraintes de sécurité etc …  Prenons un exemple avec 2 réplicas qui écoutent sur 2 ports différents (1499 et 1500) et un listener qui écoute sur le port 1433.

 

[AlwaysOn Instance]

Cette configuration fonctionne parfaitement. Par curiosité on peut voir ce que cela donne sur une trace réseau via NetMon par exemple.

alwayson_netmon0

On peut voir ici une connexion depuis SQL Server Management Studio vers le listener lst_advw.insentia.lab (IP virtuelle : 192.168.0.61)

 

Dans notre cas le listener écoute sur le port 1433 et la connexion est automatiquement redirigée vers le réplica concerné en toute transparence. Au niveau de la chaine de connexion l’impact est minime : le nom du listener remplace tout simple le nom de l’instance SQL Server. Cependant que se passe-t-il maintenant si nous changeons le port d’écoute du listener vers un port non standard ? En réalité les choses se compliquent un peu et il existe plusieurs cas :

  • On spécifie le numéro de port directement dans la chaine de connexion
  • On a la possibilité d’utiliser le format suivant : [nom listener]\[nom instance] sous certaines conditions :
    • On utilise des instances nommées qui portent le même nom pour l’ensemble des réplicas
    • Le service SQL Browser est démarré et opérationnel sur l’ensemble des réplicas pour effectuer la résolution de nom de l’instance vers le numéro de port adéquat.

icon_arrow Cas de la redirection vers un réplica secondaire en lecture seule

AlwaysOn nous fournit la possibilité d’être redirigé vers un réplica secondaire en lecture seule en se connectant via le listener à condition que les règles de redirection  aient été définies (routes et priorités). Dans ce cas une trace NetMon nous révèle la chose suivante :

alwayson_netmon1

 

On peut constater ici qu’après la phase d’authentification la connexion de SQL Server Management Studio initialement effectuée vers le listener lst_advw.insentia.lab (port 1433) est redirigé vers le réplica secondaire en lecture seule REPLICA2 (port 1498)

 

icon_arrow Kerberos, SPN et redirection vers un réplica secondaire en lecture seule

La documentation en ligne Microsoft stipule que pour utiliser Kerberos dans une architecture AlwaysOn il faut ajouter les SPN correspondants à nos listeners. Cependant je n’ai pas trouvé dans la documentation le cas où le listener effectuait une redirection d’une connexion en lecture seule vers un réplica secondaire en lecture seule. Dans ce cas ajouter les SPN pour les listeners ne suffit pas et l’on doit également ajouter les réplicas secondaires en lecture seule.

Voici une trace netmon d’une tentative de connexion en erreur à un réplica secondaire avec Kerberos :

alwayson_spn_netmon

 

On peut voir ici 2 requêtes TGS depuis ma station cliente (192.168.0.100) vers mon contrôleur de domaine (192.168.0.1) :

  • TGS request vers le service MSSQLSvc/lst_advw.insentia.lab (port 1433) : listener
  • TGS request vers le service MSSQLSvc/replica2.insentia.lab (port 1498) : réplica secondaire en lecture seule

Le contrôleur de domaine répond avec une erreur pour la deuxième demande car il n’y a pas de SPN paramétré pour REPLICA2 dans mon cas (KDC_ERR_S_PRINCIPAL_UNKNOW)

 

icon_arrow Listeners vs alias (DNS / SQL) ?

Une question intéressante surtout lorsqu’on a l’habitude de lier le point de connexion des applications via un alias DNS ou SQL par exemple. Ainsi lorsqu’on change de serveur de bases de données avec un nouveau nom, il suffit d’utiliser de modifier l’alias en conséquence. Le changement est donc relativement transparent pour les applications. Avec SQL Server AlwaysOn, lorsqu’un un listener est créé nous avons vu qu’une entrée DNS est également effectuée. De plus on a la possibilité d’associer plusieurs listeners à un seul groupe de disponibilité ce qui peut tout à fait remplacer les alias. Bien entendu chaque méthode présente des avantages mais aussi des inconvénients. Goden Yao (Program Manager , SQL Server Engine High Availability)  a écrit un billet intéressant à ce sujet.

 

Bon paramétrage de listeners !!

 

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Server 14 : c’est parti enfin presque …

Mis en avant

Pour ceux qui ont suivi un peu l’actualité, Microsoft a annoncé le 6 Avril la sortie de SQL Server 2014 à l’occasion du TechEd North America. Il est vrai que cette annonce peut surprendre d’autant plus que le 02 avril 2012 SQL Server 2012 sortait. Le planning des sorties des versions s’est en effet réduit. Mais qu’est-ce que nous réserve cette nouvelle version (et pas une R2 cette fois)  ?

Parmi les fonctionnalités les plus attendus et les plus prometteuses :

  • Hekaton : le nom de code du moteur de base de données entièrement in-memory avec un contrôle de concurrence multi-version sans mécanisme de verrouillage (locks et latchs).  On pourra également compiler les procédures stockées directement en code machine pour obtenir des gains de performance supplémentaires. Très prometteur !!!
  • L’extension du cache mémoire aux supports non volatiles avec l’utilisation de disques SSD
  • L’utilisation des index columnstores  avec possibilité de mises à jour, ce qui va étendre les scénarios d’utilisations de ces types d’index
  • L’extension du gouverneur de ressources aux IO. On a maintenant le scope complet de gestion des ressources CPU, RAM et IO
  • L’estimation des cardinalités par l’optimiseur de requêtes améliorée
  • Gestion des statistiques des colonnes et index possibles au niveau partition d’une table
  • Amélioration apportée pour SQL Server AlwaysOn (utilisation possible jusqu’à 8 réplicas, plus de downtime pendant les reconstructions d’index en ligne …)
  • Possibilité de scaling des ressources augmentée avec l’utilisation de Windows Server 2012 R2
  • Plateforme Hybrid-Cloud ready
  • ….

 

Pour plus de détails c’est par ici : SQL Server Blog

Vous avez la possibilité de vous inscrire pour l’obtention de SQL Server 2014 en CTP1 !

 

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Server 2012 AlwaysOn et plans de maintenance par défaut

Mis en avant

Lors de ma session GUSS du 23 avril 2013 à propos de AlwaysOn on m’a demandé si les plans de maintenance SQL Server pouvaient être utilisés dans ce contexte. J’ai répondu négativement à cette réponse sans pour autant être vraiment explicite. Pourtant lorsqu’on créé un plan de maintenance avec SQL Server 2012 et qu’on utilise une tâche de sauvegarde des bases on peut s’apercevoir que si une base de données est concernée par un groupe de disponibilité une option apparait automatiquement "For availability databases, ignore Replica Priority for Backup and Backup on Primary  Settings". L’apparition de cette option implique que par défaut les plans de maintenance SQL Server ou du mois les tâches de sauvegarde sont en théorie capables de s’aligner sur la politique de sauvegarde dictée par le groupe de disponibilité en question mais malgré ce je persiste à dire que les plans de maintenance par défaut ne sont pas adaptés (du moins encore) aux environnements AlwaysOn et c’est ce que je vais tenter d’expliquer dans ce billet.

 

icon_arrow Des tâches de sauvegardes qui gèrent et prennent en compte les préférences de sauvegarde d’un groupe de disponibilité

Commençons par le début. Effectivement les tâches de sauvegardes des plans de maintenance par défaut détectent l’appartenance ou non d’une base de données à un groupe de disponibilité.

J’ai créé une base de données DUMMY faisait parti du groupe de disponibilité

image

 

J’ai paramétré mes préférences de sauvegarde de la manière suivante :

image

 

Dans un plan de maintenance par défaut je glisse une tâche de sauvegarde de type FULL en choisissant la base de données DUMMY …

image

 

… et on s’aperçoit qu’une option supplémentaire apparait

image

 

Cette option permet de ne pas tenir compte des préférences de sauvegarde configurés dans les groupes de disponibilités pour un réplica. Par défaut cette option n’est pas activée et la tâche de sauvegarde prendra en compte les préférences de sauvegardes des groupes de disponibilités (de préférence sur les secondaires, uniquement sur les secondaires, uniquement sur le primaire, sur n’importe quel réplica).

On peut voir que la commande T-SQL générée utilise la fonction sys.fn_hadr_backup_is_preferred_replica() pour la base de données DUMMY

image

 

Notez également que j’ai activé l’option COPY_ONLY pour les sauvegardes. En effet comme ma politique de sauvegarde stipule que les réplicas secondaires seront utilisés en priorité, seules les sauvegardes avec l’option COPY_ONLY fonctionneront si le réplica concerné sera secondaire au moment de la sauvegarde. Mon plan de maintenance fonctionne parfaitement même après test de failover d’un réplica vers un autre. Cependant comme vous le savez certainement un plan de maintenance n’est jamais aussi simple.

Restons sur notre tâche de sauvegarde et ajoutons-y quelques bases de données utilisateurs en mode de récupération FULL et qui ne font pas parti d’un groupe de disponibilité et c’est la que le premier problème arrive. Ma politique de sauvegarde de type full se fait toujours avec l’option COPY_ONLY dans mon cas puisque mes sauvegardes se feront en priorité sur le secondaire et que ceux-ci ne supportent que les sauvegardes avec l’option COPY_ONLY. Le problème est qu’ici la création d’une base de données utilisateur en mode de récupération FULL fera planté la tâche de sauvegarde des journaux de transactions. Pourquoi ? Tout simplement parce qu’une sauvegarde FULL avec l’option COPY_ONLY ne va pas initialiser la séquence des LSN utiles pour nos sauvegardes des journaux de transactions. Alors bien entendu je peux créer 2 plans de maintenance par exemple :

  • Un plan de maintenance qui concernera uniquement les bases de données en mode de récupération FULL associées à un groupe de disponibilité
  • Un plan de maintenance qui concernera les autres bases de données

Il faudra dans ce cas répartir manuellement les bases de données dans les différents plans de maintenance. On perd ici toute notion de gestion dynamique des plans de maintenance selon moi. Si j’ajoute une base de données par exemple, je n’ai pas forcément envie de modifier ensuite mon plan de maintenance … Bien entendu ce raisonnement ici ne tient que pour les cas où les sauvegardes sont déportés sur le secondaire. Si les sauvegardes sont effectuées uniquement sur le primaire, l’utilisation de l’option COPY_ONLY n’a plus lieu d’être.

Une autre chose à noter ici est le manque de support de l’option CHECKSUM qui permet pour rappel d’une part de vérifier le checksum de chaque page de données sauvegardée d’une base de données (si l’option est bien entendu activée au niveau de celle-ci) et de générer un checksum global pour le média de sauvegarde.

 

icon_arrow La tâche de vérification d’intégrité

Vérifier l’intégrité de ses bases de données avant de les sauvegarder est plutôt une opération recommandée. Mais dans une architecture AlwaysOn on peut se poser la question de savoir où est-ce que je dois lancer cette tâche. Si dans d’autres environnements le choix est plutôt évident car les sauvegardes ne peuvent se faire que sur le serveur "principal" , le raisonnement n’est pas tout à fait le même quand on parle de déplacement des sauvegardes sur un réplica secondaire. En effet, vu que ma politique de sauvegarde gère des préférences et des priorités de réplicas pour les sauvegardes ces dernières peuvent être lancés de n’importe où en fonction de la situation présente et des paramètres de configuration. En plus mes bases de données sont accessibles en lecture écriture depuis un réplica primaire et peuvent être inaccessible depuis mes les réplicas secondaires. Il faut également que je vérifie l’intégrité de ma base à ce niveau. Cela fait potentiellement 2 points de vérification d’intégrité des bases sur n réplicas (n pouvant aller jusqu’à 5 pour le moment mais avec SQL14 on pourra monter jusqu’à 8 !).

Si on regarde de plus près la tâche de vérification d’intégrité des plans de maintenance par défaut de SQL Server on s’aperçoit qu’il n’y a aucun paramètre de gestion des groupes de disponibilités :

image

 

Dans ce cas comment puis-je faire pour lancer ma tâche ? On peut prendre le cas extrême qui dit qu’il faut lancer cette tâche de vérification des bases sur tous les réplicas .. et pourquoi pas après tout ?

Je vois déjà 2 problèmes à cela :

  • Même si la vérification d’intégrité initiée par la commande DBCC CHECKDB ne génère pas de verrou par défaut (utilisation des snapshots de bases de données) celle-ci peut avoir un impact négatif sur les performances IO et sur l’augmentation de la REDO queue sur les réplicas secondaires. Une augmentation de cette file d’attente sur les secondaires peuvent avoir un impact sur le RPO et RTO en fonction du type de réplication choisi.
  • On peut tout à fait utiliser un réplica secondaire pour faire des sauvegardes et second réplica secondaire en standby uniquement pour effectuer du failover ou dans une procédure de disaster recovery. Dans ce cas la tâche de vérification d’intégrité des bases des plans de maintenance par défaut SQL Server étant incapable de savoir si la base de données concernée fait parti ou non d’un groupe de disponibilité et si la base de données en question est accessible en lecture seule ou non provoquera une erreur dans le plan de maintenance en fonction de la situation

 

icon_arrow Les tâches de mise à jour des statistiques et des indexes

On a exactement le même problème ici. En regardant les tâches du plan de maintenance associées aux statistiques et aux indexes il n’y a aucun paramètre de configuration lié aux groupes de disponibilité. Dans une architecture AlwaysOn on ne peut mettre à jour les indexes et les statistiques  d’une base que sur le réplica primaire. Je peux également avoir des bases de données qui ne sont pas concernées par un groupe de disponibilité. Dans ce cas il est tout à fait possible qu’un réplica secondaire d’un groupe de disponibilité soit l’instance principale d’une autre base de données. Je peux effectivement créer un plan de maintenance spécifique pour cela et activer / désactiver les jobs SQL Server associées en fonction du cas mais encore une fois cela m’oblige à gérer manuellement les bases de données à répartir dans les plans de maintenance …

De plus dans ce genre d’architecture l’utilisation des tâches par défaut de maintenance des indexes ne sont pas forcément conseillés car elles peuvent être excréments couteuse en écriture journalisée et de bande passante pour la réplication de ces écritures vers les autres réplicas. En effet, et beaucoup d’articles l’expliquent déjà, il n’y a pas la possibilité de définir des seuils de réorganisation ou de reconstruction d’indexes. La politique du tout ou rien ici n’est pas forcément très approprié.

 

Pas besoin d’aller plus loin je pense pour vous dire que les plans de maintenance SQL Server ne sont pas adaptés pour SQL Server 2012 AlwaysOn. Que fais-t-on dans ce cas là ? Pour le moment pour ma part j’ai créé un jeu de script de maintenance des bases de données pour des architectures AlwaysOn installées chez nos clients. Je n’ai pour le moment pas trouvé d’outil tiers permettant de gérer la maintenance des bases de données de A à Z pour ce type d’environnement mais je reste à l’écoute si jamais vous avez plus d’information là dessus Sourire

 

Bonne maintenance de vos architectures AlwaysOn !

 

David BARBARIN (Mikedavem)
MVP SQL Server

Webcast sur SQL Server 2012 AlwaysOn pour les fermes Sharepoint 2013 : les slides et la vidéo sont disponibles

Mis en avant

Un billet en retard pour dire que les slides et la vidéo de la session GUSS que j’ai eu l’occasion d’animer sur SQL Server 2012 AlwaysOn et SharePoint 2013 sont disponibles sur le site du GUSS

>> http://guss.fr/2013/06/01/webcast-guss-avril-2013-les-bases-alwayson/

 

guss

David BARBARIN (Mikedavem)
MVP SQL Server

Créer un serveur lié avec une connexion en lecture seule vers un réplica secondaire SQL Server 2012 AlwaysOn

Mis en avant

Petite question que je me posais aujourd’hui vu qu’en ce moment je travaille souvent sur des environnements haute disponibilité avec SQL Server 2012 et AlwaysOn. Est-il possible de créer un serveur lié qui se connecte sur un réplica secondaire en lecture et profiter du coup d’une redirection transparente en cas de changement de rôle de réplica lors d’un basculement automatique par exemple ?

Le meilleur moyen de le savoir est de faire un test.

Créons tout d’abord un serveur lié en utilisant le provider SQL Server Native Client 11.0 pour pouvoir utiliser le paramètre de connexion applicationintent=readonly. Le script de création du serveur lié est le suivant :

 

EXEC master.dbo.sp_addlinkedserver    
 @server = N'LST_APPLIX',
 @srvproduct=N'',    
 @provider=N'SQLNCLI', -- Provider SQL Native Client    
 @datasrc=N'LST_APPLIX', -- Availability group listener    
 @provstr=N'applicationintent=readonly',  -- Readonly intent parameter    
 @catalog=N'ApplixEnterprise' --Target database to connect

 

icon_arrow Mon groupe de disponibilité est composé de 3 réplicas avec :

  • REPLICA1 (réplica primaire)
  • REPLICA2 (réplica secondaire en lecture seule utilisé en priorité)
  • REPLICA3 (réplica secondaire en lecture seule utilisé si REPLICA2 n’est plus joignable)

 

icon_arrow Mon serveur lié est quant à lui configuré sur un serveur standalone à part.

 

La requête suivante illustre l’état de note scénario :

 

SELECT  
 g.name AS group_name,    
 r.replica_server_name,    
 rs.role_desc,    
 rs.operational_state_desc,    
 ro.replica_server_name AS replica_ro_server_name,    
 rol.routing_priority,    
 r.secondary_role_allow_connections_desc    
FROM sys.dm_hadr_availability_replica_states AS rs    
 JOIN sys.availability_groups AS g    
  ON rs.group_id = g.group_id    
 JOIN sys.availability_replicas AS r    
  ON r.replica_id = rs.replica_id    
   AND r.group_id = rs.group_id    
 JOIN sys.availability_read_only_routing_lists rol    
  ON rol.replica_id = r.replica_id    
 JOIN sys.availability_replicas AS ro    
  ON ro.replica_id = rol.read_only_replica_id    
WHERE g.name = 'ApplixGrp'    
 AND r.replica_server_name = 'REPLICA1'

 

image

 

Tentons de retrouver le serveur sur lequel le serveur lié pointe :

SELECT *    
FROM OPENQUERY(LST_APPLIX, 'SELECT @@SERVERNAME AS SERVER_NAME');

qui donne

image

 

Ok visiblement cela fonctionne. En utilisant le listener la requête est automatiquement redirigée vers le REPLICA2 comme le stipule notre configuration.

 

On lance maintenant un basculement manuel de groupe de disponibilité ApplixGrp de REPLICA1 vers REPLICA2. REPLICA2 devient donc le nouveau primaire.REPLICA1 et REPLICA3 deviennent les réplicas secondaires. On exécute à nouveau nos requêtes :

 

SELECT  
 g.name AS group_name,    
 r.replica_server_name,    
 rs.role_desc,    
 rs.operational_state_desc,    
 ro.replica_server_name AS replica_ro_server_name,    
 rol.routing_priority,    
 r.secondary_role_allow_connections_desc    
FROM sys.dm_hadr_availability_replica_states AS rs    
 JOIN sys.availability_groups AS g    
  ON rs.group_id = g.group_id    
 JOIN sys.availability_replicas AS r    
  ON r.replica_id = rs.replica_id    
   AND r.group_id = rs.group_id    
 JOIN sys.availability_read_only_routing_lists rol    
  ON rol.replica_id = r.replica_id    
 JOIN sys.availability_replicas AS ro    
  ON ro.replica_id = rol.read_only_replica_id    
WHERE g.name = 'ApplixGrp'    
 AND r.replica_server_name = 'REPLICA2'

 

image

 

et

SELECT *    
FROM OPENQUERY(LST_APPLIX, 'SELECT @@SERVERNAME AS SERVER_NAME');

qui donne

image

 

Comme on peut le voir l’utilisation d’un serveur lié vers une architecture SQL Server 2012 AlwaysOn avec une redirection des connexions en lecture seule vers les réplicas secondaires fonctionne très bien !

 

Bon paramétrage de serveurs liés

SET TRANSACTION ISOLATION LEVEL READ COMMITTED et NOLOCK = pas de verrous ?

Mis en avant

Chez un de mes clients on est venu me dire la chose suivante : visiblement lorsque j’utilise le hint NOLOCK ou un niveau de transaction READ UNCOMMITED lorsque j’exécute une requête je vois quand même des verrous posés sur mes tables alors que je croyais le contraire et du coup ma requête en lecture doit bloquer les mises à jour … A cela j’ai répondu : la vérité est ailleurs Sourire

Plus sérieusement, la bonne question à se poser est la suivante : est-ce que le fait d’utiliser un hint NOLOCK ou un niveau de transaction permettant la lecture sale veut dire que aucun verrou n’est posé ?

 

Pour répondre prenons un exemple simple avec une requête dans la base de données AdventureWorksDW2012 :

SELECT *  
FROM dbo.FactInternetSales AS f  
CROSS JOIN dbo.FactInternetSales AS f2

 

Voyons les verrous posées par cette requête à l’aide de la DMV sys.dm_tran_locks :

SELECT  
 resource_database_id,    
 resource_type,  
 resource_subtype,    
 request_mode,  
 request_type,    
 request_status,    
 request_owner_type    
FROM sys.dm_tran_locks    
WHERE request_session_id = "session"

 

icon_arrow Avec un niveau d’isolation de transaction en read committed (niveau d’isolation par défaut) :

image

 

icon_arrow  Avec un niveau d’isolation de transaction en read uncommitted :

image

 

On voit d’abord que le niveau d’isolation de transaction en mode read uncommitted ne veut pas dire qu’il n’existe plus de verrou. Le 1er verrou (de type SHARED_TRANSACTION_WORKSPACE) nous intéresse moins ici car c’est un verrou posé lorsqu’il existe une connexion sur une base de données (en l’occurence database_id = 6 ici). Cela permet de protéger la base de données contre les suppressions accidentelles par exemple lorsqu’il existe une connexion sur cette dernière.

Les verrous suivants sont plus intéressants dans notre cas. On voit que la différence notoire est qu’il existe des verrous de type IS et type S dans un cas (read committed) et plus de verrou de ce type dans l’autre cas  (read uncommitted). Le niveau d’isolation de transaction par défaut utilisé par SQL Server garantit une lecture propre des données c’est la raison pour laquelle il existe des verrous de type S et IS à différents niveaux (OBJECT et PAGE) . Avec le niveau d’isolation permettant de la lecture sale ces verrous n’existent évidemment plus mais d’autres verrous existent cependant comme celui que l’on voit dans la dernière image : verrou de type Sch-S. Ce verrou protège la table contre les modifications pendant qu’une lecture est effectuée même si celle-ci n’est pas propre.

 

Faisons le même test avec une table HEAP (sans index cluster) avec la requête suivante :

SELECT *  
FROM dbo.DatabaseLog AS f    
CROSS JOIN dbo.DatabaseLog AS f2

 

… et voyons les verrous posées :

icon_arrow Avec un niveau d’isolation de transaction en read committed (niveau d’isolation par défaut) :

image

 

icon_arrow  Avec un niveau d’isolation de transaction en read uncommitted :

image

 

La aussi on peut voir qu’avec les verrous de type S ne sont plus présents sur les objets de type PAGE ou OBJET avec un niveau d’isolation de transaction en read uncommitted.  On a néanmoins un type de verrou supplémentaire que l’on n’avait pas  avec une table possédant un index cluster à la ligne 2 (resource_type = HOBT et resource_subtype = BULK_OPERATION). Ce type de verrou n’est présent que sur les tables HEAP pour protéger les lectures contre les pages potentiellement mal formatés via des opérations BULK (merci à Paul Randal pour la précision).

 

On vient donc de voir que la lecture sale sur SQL Server engendrait certains types de verrous. Cependant on peut pousser le raisonnement plus loin. Qui dit verrou veut dire aussi latch pour accéder aux structures physiques en mémoire … on peut essayer de voir si une requête avec un niveau d’isolation en read uncommitted produit des latchs. Pour cela on peut utiliser la DMV sys.dm_os_waiting_tasks comme ceci :

-- Création à la volée d'une table temporaire pour les tâches en attente    
SELECT TOP 1 *  
INTO #waiting_tasks    
FROM sys.dm_os_waiting_tasks;    
GO

-- On vide la table avant le test  
TRUNCATE TABLE #waiting_tasks;    
GO

-- Récupération des tâches en attente générées par la requête de test    
WHILE 1 = 1    
BEGIN    
 INSERT #waiting_tasks    
 SELECT *    
 FROM sys.dm_os_waiting_tasks    
 WHERE SESSION = "session"  
END

 

En parallèle la requête suivante est lancée :

SELECT *  
FROM dbo.DatabaseLog AS f  
CROSS JOIN dbo.DatabaseLog AS f2

 

Après avoir lancé une des requêtes avec un niveau d’isolation de transaction en read uncommitted on peut constater que cette dernière a effectivement générée des latchs de type SH dans notre cas :

image

 

On peut regarder à quel objet appartient la page 154 par exemple :

DBCC TRACEON(3604);  
GO    

DBCC PAGE(6, 1, 154) WITH TABLERESULTS;    
GO

 

image

image

 

Pour conclure l’idée que l’utilisation de la lecture sale avec SQL Server ne génère pas de verrous est faussée. Certains les verrous de type S pouvant gêner les écritures sont absents mais  on a pu constater au cours de ce billet que d’autres types de verrous étaient et bien présents ainsi que des latchs pouvant même aboutir à une potentielle contention !!

Bonne utilisation de lecture sale Sourire 

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Server 2012 : Installation et intégration des mises à jour

Mis en avant

Pour ceux qui ont eu à installer SQL Server 2012, vous avez sans doute remarqué que le processus d’installation incorporait maintenant des mises à jour avant même d’installer SQL Server. Cette petite nouveauté est en réalité très pratique lorsque l’on doit installer des binaires dans une certaine version et que l’on doit installer un service pack ou un cumulative update. On remplace les fameuses installations "slipstream" où l’incorporation d’un service pack dans des binaires d’installation était une opération plutôt laborieuse. De plus il existe 2 méthodes de mise à jour : l’une permet de récupérer les mises à jour via internet et l’autre permet de spécifier un dossier dans lequel il est possible de placer les mises à jour d’installation à incorporer durant l’installation d’une instance SQL Server. Par exemple il est tout à fait possible d’incorporer en même temps le service pack 1 de SQL Server 2012 et le cumulative update 3. Si plusieurs cumulative update sont présent l’installation ne prendra que le dernier en vigueur !

 

icon_arrow J’ai créé ici un dossier nommé SQL2012_SP1_CU3 où j’ai placé les fichiers d’installation du service pack1 de SQL Server 2012 et 2 cumulatives updates : CU1 et CU3

 

sp1_et_cu1_et_cu3

 

icon_arrow Il suffit ensuite d’utiliser les paramètres supplémentaires fournis avec SQL Server 2012 (/UpdateEnabled et /UpdateSource). J’effectue ici une installation en ligne de commande

 

image

 

icon_arrow Lorsque l’installation se lance on peut remarquer que l’installation détecte les mises à jour et ne prend que le service pack 1 et le dernier cumulative update (CU3)

 

install_gui_product_updates

 

Le cumulative update 3 correspond au KB 2812412 :

kb_cu3

 

icon_arrow Une fois l’installation terminée une petite vérification de la version :

 

result_after_install

 

Bonne installation !!

David BARBARIN (Mikedavem)
MVP SQL Server

A propos de l’erreur 33203 : SQL Server audit could not write to the security log

Mis en avant

Lors de la mise en place des audits de sécurité je me suis heurté à cette fameuse erreur 33203 sur une instance nommée qui indique explicitement que SQL Server ne peut pas écrire dan le journal de sécurité Windows.  Ma configuration est la suivante : SQL Server 2012 SP1  et Windows 2012 Server.

Je précise avant de commencer que les prérequis de fonctionnement des audits avec le journal de sécurité Windows sont respectés. La conséquence directe de l’erreur 33203 est qu’au évènement n’est enregistré dans le journal de sécurité Windows, ce qui est plutôt gênant pour des audits. De plus les journaux des erreurs Windows et SQL Server ne sont pas spécialement bavards quant à la cause de cette erreur.

 

image

 

Dans ce cas comment savoir ce qui empêche SQL Server d’écrire dans le journal ? Je dois dire que les outils sysinternals sont bien utiles dans ces moments et en particulier procmon.

Une capture procmon me donne ceci lorsque j’active un objet d’audit depuis SQL Server :

 

image

On peut remarquer ici que SQL Server tente un accès à la clé de registre HKLM\System\CurrentControlSet\Services\EventLog\Security et que cet accès lui est visiblement refusé. Un message est également inscrit dans le journal des erreurs SQL. Pas de souci, nous allons configurer les permissions adéquates sur cette clé de registre.

 

image

 

Le paramétrage des permissions a visiblement permis à l’instance SQL Server de créer une nouvelle clé de registre dans HKLM\System\CurrentControlSet\Services\EventLog\Security :

image

 

image

 

Me croyant sauvé, j’active mes audits mais je me heurte à une nouvelle erreur. Une nouvelle trace procmon me révèle le problème suivant :

 

image

 

SQL Server tente de lire le fichier C:\Windows\System32\LogFiles\Sum\Api.log mais encore un fois ce dernier se voit refuser l’accès. Le paramétrage en lecture seule du fichier Api.log me permet enfin d’activer mes audits et de valider que les évènements soient bien enregistrés dans le journal de sécurité Windows. Ce deuxième problème visiblement a été remonté chez Microsoft et est toujours d’actualité. A noter que je n’ai eu ce souci que pour mon instance nommé dans mon cas.

 

Quelques remarques supplémentaires :

  • Le fait d’enlever le compte de service SQL des permissions de la clé de registre HKLM\System\CurrentControlSet\Services\EventLog\Security ne semble plus être gênant à partir du moment où la nouvelle clé a été créé.
  • Il n’est pas possible cependant d’enlever les permissions sur le fichier C:\Windows\System32\LogFiles\Sum\Api.log sous peine d’avoir dans le journal des évènements Windows le type d’erreur suivant et plus d’évènement d’audit enregistré. A voir si le problème sera résolu plus tard par Microsoft (dans un CU4 peut être ?) avec Windows Server 2012. L’ensemble des problèmes répertoriés concerneraient Windows Server 2012.
  • Je ne pense pas que le problème soit lié à la version de SQL Server. Si j’ai le temps je testerai sur une version SQL Server 2008 R2 et mettrait à jour mon blog.

 

image

 

Bonne activation d’audit !! Sourire

 

David BARBARIN (Mikedavem)
MVP SQL Server

Problème d’utilisation de l’option WITH EXECUTE AS dans une procédure stockée avec les serveurs liés

Mis en avant

L’emprunt d’identité peut s’avérer nécessaire lorsque l’on commence à vouloir faire de la sécurité à un niveau granulaire relativement bas. Par exemple la politique de sécurité en vigueur peut nous contraindre à restreindre l’accès aux données via des procédures stockées. Cependant si ces données sont distantes et implique l’implémentation d’un serveur lié pour y avoir accès, cela peut donner matière à plus de réflexion. En effet, dans ce cas il va falloir donner les droits adéquates aux utilisateurs concernés sur le serveur distant pour accéder aux données, ce qui risque pour le coup d’augmenter la surface d’exposition. Un utilisateur A devra pouvoir exécuter une procédure stockée et sélectionner les données sur le serveur distant. L’utilisateur A peut par conséquent passer outre la procédure stockée et se connecter directement au serveur distant pour accéder aux données. Pour éviter cela on peut tout à fait utiliser le mécanisme d’emprunt d’identité dans une procédure stockée à l’aide de WITH EXECUTE AS et associer l’utilisateur dédié à cette tâche à un utilisateur sur le serveur distant. On bénéficie ainsi d’un contrôle d’accès beaucoup fort et maitrisé.

 

Le schéma ci-dessous illustre bien notre problématique :

 

icon_arrow Dans le 1er cas un mapping est nécessaire pour chaque utilisateur qui va vouloir accéder aux données du serveur distant Instance 2, ce qui signifie qu’il devra exister les mêmes logins sur le serveur distant Instance 2. Comme je l’ai évoqué au début cela implique également que les utilisateurs concernés pourront directement accéder aux données du serveur distant avec leurs informations de connexion.

 

image

 

icon_arrow Dans le 2ème cas nous mettons en place un mécanisme d’emprunt d’identité via l’option WITH EXECUTE AS USER dans la procédure stockée. L’idée ici est de n’autoriser que cet utilisateur à avoir accès aux données distantes.

 

image

 

La mise en place d’un tel mécanisme dans le contexte des serveurs liés nécessitent un certain paramétrage :

  • L’activation obligatoire de l’option de bases de données trustworthy. Malheureusement seule cette option est viable lorsqu’il s’agit d’accès inter instances. L’utilisation des certificats dans ce cas ne fonctionne pas.
  • Différer l’exécution de la procédure stockée concernée. Je n’ai pas trouvé d’article Microsoft sur le sujet mais simplement un item connect. C’est ce point que je vais détailler ici.

 

Si l’on utilise directement l’option WITH EXECUTE AS dans une procédure stockée de la manière suivante :

 

CREATE PROCEDURE dbo.GetRemoteData
WITH EXECUTE AS 'USER1'
AS

SELECT col1, col2
FROM [linked_server].[DATABASE].[schema].[TABLE]
GO

 

… avec l’appel suivant …

 

EXEC dbo.GetRemoteData

 

… il y a de grandes chances que cela ne fonctionne pas surtout si l’on a définit le contexte d’authentification de serveur lié suivant :

 

image

 

Dans ce cas seul le mapping défini pour l’utilisateur USER1 fonctionnera et aucun autre login ou aucun autre type d’authentification ne fonctionnera.

 

Si maintenant j’exécute ou je crée la procédure stockée dbo.GetRemoteData dans le contexte d’un utilisateur différent de l’utilisateur USER1 ayant les droits de création et d’exécution je peux me retrouver avec le message suivant :

 

image

 

Pourtant me direz-vous que nous avons bien défini l’emprunt d’identité dans la procédure stockée et qu’ici visiblement SQL Server n’est pas capable de trouver le mapping défini dans les options de sécurité du serveur lié. En réalité il faut bien comprendre ce qui se passe lorsqu’une procédure stockée est compilée et lorsque celle-ci est exécutée (run-time context). SQL Server compile une procédure stockée avec les credentials de l’appelant de la procédure et non ceux de l’utilisateur associée à l’emprunt d’identité. C’est pendant l’exécution de la procédure que le mécanisme d’emprunt d’identité jouera tout son rôle. Lorsqu’on accède aux données aux travers d’un serveur lié la compilation va générer l’erreur 7416 si l’appelant de la procédure n’a pas un mapping inter-instances configuré (SQL Server va vérifier lors de la compilation l’accès aux différents objets du serveur distant).

Pour contourner ce problème on peut user de 2 mécanismes qui permettent de différer l’exécution de la procédure stockée et de laisser le mécanisme d’emprunt d’identité opérer en premier lieu :

  • Créer une nouvelle procédure stockée qui va scinder l’exécution de notre procédure stockée initiale en 2 étapes
  • Encapsuler le code à exécuter de la procédure stockée avec EXEC( »), ce qui permettra au final de faire la même que dans la 1ère solution.

 

Par exemple :

CREATE PROCEDURE dbo.GetRemoteDataWithImpersonate
WITH EXECUTE AS 'USER1'  
AS

EXEC dbo.GetRemoteData
GO

ou encore :

CREATE PROCEDURE dbo.GetRemoteData    
WITH EXECUTE AS 'USER1'    
AS

EXEC('SELECT col1, col2 FROM [linked_server].[database].[schema].[table]')    
GO

 

Le choix de la méthode dépendra bien du contexte.

 

Bonne programmation !

David BARBARIN (Mikedavem)
MVP SQL Server

Prochain évènement GUSS le 24 avril – 19h00 : Webcast sur SQL Server 2012 AlwaysOn pour les fermes Sharepoint 2013

Mis en avant

J’aurai le plaisir d’animer le prochain évènement du GUSS sous un nouveau format. Le principe est simple : où que vous soyez, vous pouvez rejoindre le webcast en ligne avec le son, la vidéo et un chat pour poser des questions.

 

Ce webcast sera composé de 2 sujets de 30 minutes :

 

icon_arrow  Always-On : rappel des bases
La première session rappellera le fonctionnement et les bases de la Haute-Disponibilité avec AlwaysOn (avantages, architecture, groupes de disponibilités, type de réplications de données, etc.).

 

icon_arrow AlwaysOn dans les fermes sharepoint 2013
Mise en pratique avec une implémentation d’AlwaysOn avec SharePoint, produit très consommateur de SQL Server et avec des topologies souvent complexes. L’idée ici est d’avoir une vision beaucoup plus orientée base de données et analyser les avantages mais aussi les impacts à utiliser AlwaysOn avec Sharepoint (création / supression d’applications, authentification, utilisation des connexions readonly, maintenance des bases de données, monitoring …)

 

Les informations de connexion vous seront communiqués la veille sur le site du GUSS. En espérant vous voir nombreux !

 

David BARBARIN (Mikedavem)
MVP SQL Server

MVP SQL Server : Quatrième chapitre pour l’année 2013

Mis en avant

Pas de poisson d’avril et une vraie bonne nouvelle de la part de Microsoft aujourd’hui : le renouvèlement de mon titre de MVP SQL Server pour la 4ème fois.

J’en profite pour remercier Martine Tiphaine et Microsoft une nouvelle fois !

 

mvp

 

David BARBARIN (Mikedavem)
MVP SQL Server

Cluster Windows et fileshare quorum : comment changer le chemin de partage du quorum

Mis en avant

Sur une installation SQL Server 2012 Always-On avec un cluster composé d’un quorum nœuds et partage de fichiers majoritaire j’ai eu à changer le chemin de partage du quorum. Avec surprise j’ai pu m’apercevoir rapidement que le changement du chemin au travers de la console de gestion du cluster était bien pris en compte mais restait actif sur l’ancien partage. J’ai pu reproduire ce problème sur mon environnement de test

Voici donc la situation initiale :

image

 

image

 

Le partage réseau n’est plus accessible dans mon cas. Il faut donc trouver un nouveau path.

image

 

image

 

Cependant une fois configurée on peut remarquer que la nouvelle ressource est effectivement créée et pire que l’ancienne ressource est toujours utilisée comme faisant parti du quorum.

image 

 

A ce stade l’interface graphique ne nous empêche de supprimer la ressource concernée. Si on tente l’opération en passant par les cmdlets powershell du cluster nous nous heurtons également à un message d’erreur qui stipule qu’une ressource cluster core ne peut être supprimée.

image

 

Donc comment faire en sorte que notre changement de chemin soit pris en compte par le cluster. En réalité l’astuce consiste tout simplement à supprimer temporairement ce type du quorum de cluster et de revalider le nouveau chemin une nouvelle fois comme ceci :

image

 

image

 

Une fois le changement de quorum changé la ressource qui nous gênait a bien été supprimée.

image 

 

On peut également supprimé dans notre cas la ressource fileshare restante. Enfin il ne reste plus qu’à revalider notre type de quorum avec le nouveau chemin en suivant la procédure décrite un peu plus haut.

image

 

Bonne configuration de quorum !

 

David BARBARIN (Mikedavem)
MVP SQL Server

Virtualisation et SQL Server 2012 : disques non reconnus avec VSphere 5.X

Mis en avant

Lors d’une installation SQL Server 2012 chez un de mes clients j’ai été confronté à un problème surprenant. La machine virtuelle comportait 3 disques avec les partitions C, D et E et SQL Server ne reconnaissait uniquement que le premier disque. Après avoir cherché un petit moment et notamment des problèmes aux niveaux des permissions de compte de service SQL nous nous sommes aperçu que le problème venait en réalité des types de disques que VSphere présentait au système d’exploitation. Les disques D et E étaient vus comme périphériques amovibles ce qui peut être gênant pour SQL Server !!

L’astuce consiste donc à désactiver cette option au niveau de la machine virtuelle (devices.hotplug = false).

>> Le KB VMWARE pour plus de précision

 

Bonne installation !!

David BARBARIN (Mikedavem)
MVP SQL Server

Instant File Initialization et SetFileValidData()

Mis en avant

Instant File Initialization est une option connue des DBA et permet d’accélérer certaines opérations faisant de la réservation d’espace disque. Avec SQL Server cela se traduit par les opérations de création, restauration de bases de données ou encore ajout de fichiers, modification de taille ou encore expansion de fichiers … Bref cette option est souvent très bénéfique pour les performances mais celle-ci exige quelques prérequis qui sont les suivants :

  • Le fichier n’est pas un fichier journal d’une base de données
  • Le système d’exploitation supporte l’utilisation de la fonction SetFileValidData()
  • Le compte de service SQL possède le privilège SE_MANAGE_VOLUME_NAME
  • Le fichier n’est pas un fichier sparse
  • Le fichier n’est pas concernée par du chiffrement TDE
  • Trace flag 1806 n’est pas activé sur l’instance SQL (ce traceflag désactive l’utilisation de cette fonctionnalité)

 

Ce qui nous intéresse ici c’est l’utilisation de la fonction SetFileValidData(). Nous voila donc plongé dans la documentation des  API Windows et de notre fonction SetFileValidData(). Voici ce que la documentation nous propose :

Sets the valid data length of the specified file. This function is useful in very limited scenarios. For more information, see the Remarks section.

Dans la section remarques nous avons :

The SetFileValidData function sets the logical end of a file. To set the size of a file, use the SetEndOfFile function. The physical file size is also referred to as the end of the file.

Each file stream has the following properties:

  • File size: the size of the data in a file, to the byte.
  • Allocation size: the size of the space that is allocated for a file on a disk, which is always an even multiple of the cluster size.
  • Valid data length: the length of the data in a file that is actually written, to the byte. This value is always less than or equal to the file size.

The SetFileValidData function allows you to avoid filling data with zeros when writing nonsequentially to a file. The function makes the data in the file valid without writing to the file. As a result, although some performance gain may be realized, existing data on disk from previously existing files can inadvertently become available to unintended readers

A caller must have the SE_MANAGE_VOLUME_NAME privilege enabled when opening a file initially

 

Pour résumer : cette fonction va nous permettre d’éviter le remplissage de zéros dans un fichier lorsque les écritures ne sont pas séquentielles

Pourquoi pour des opérations non séquentielles ?  Effectivement si l’on écrit de manière séquentielle dans un fichier la phase d’écriture de zéro est relativement rapide puisque l’on écrit toujours à la suite des données précédentes

Cependant si l’on écrit de manière aléatoire, le problème est tout autre. Imaginez que l’on écrive la première au début du fichier et la 2ème fois à la fin, il va donc falloir remplir de zéros le fichier de la première écriture jusqu’à la 2ème. La documentation le stipule bien : chaque fichier doit posséder notamment une propriété Valid data length qui correspond à la longueur des données écrites dans le fichier.  Cette opération, vous l’avez compris, peut prendre du temps en fonction de la longueur à initialiser. SQL Server écrit de manière aléatoire dans le fichier même lors de son initialisation. C’est la raison pour laquelle l’utilisation de cette option est très intéressante ici.

 

Ecriture séquentielle :

 

image

 

Ecriture aléatoire :

 

image

 

L’utilisation de procmon peut nous permettre de visualiser l’utilisation des fonctions SetEndOfFile() et SetFileValidData(). J’ai simplement créé une base de données simple avec le fichier de données TestIntantFileInitializationWith.mdf.

 

  • Dans le cas où Instant File Initialization n’est pas activé

 

image

 

On ne voit ici que l’utilisation de la fonction SetEndOfFile(). Cette fonction est utilisée dans tous les cas pour fixer physiquement la fin du fichier. Dans le cas présent la fin du fichier est fixée à 10485760 octets soit 10Go.

 

  • Dans le cas où Instant File Initialization est activé

 

image

 

Une fonction supplémentaire est utilisée ici SetFileValidDate() qui permet de valider la longueur des données dans le fichier mdf :  ValidDataLength : 10485760 (10Go de données dans un fichier de 10Go)

 

David BARBARIN (Mikedavem)
MVP SQL Server

Techdays 2013 à Paris : Je serais présent en tant qu’ATE SQL Server

Mis en avant

techdays_ate

ATE sur les Microsoft TechDays 2013

 

J’aurais le plaisir d’être ATE sur la technologie SQL Server aux techdays 2013 à Paris les 13 et 14 février prochain. Ca sera l’occasion pour moi d’échanger autour de SQL Server avec vous !

Au plaisir de vous voir !

David BARBARIN (Mikedavem)
MVP SQL Server

Utiliser le même certificat pour chiffrer les connexions SQL Server en SSL et pour TDE ?

Mis en avant

Lors d’une de mes dernières interventions nous avions implémenté chez un client le chiffrage des connexions SQL Server via SSL avec la mise en place d’un certificat. Ce même client m’ a demandé s’il était possible d’utiliser ce même certificat pour chiffrer une de leurs bases de données via TDE au lieu d’utiliser un certificat auto-signé. Vu de loin on pourrait penser que oui et que l’implémentation du certificat dans SQL Server est une chose aisée mais il n’en est rien. La raison est la suivante : l’export du certificat avec la clé privée au travers du magasin de certificat Windows génère un fichier avec l’extension .pfx qui n’est pas exploitable directement par SQL Server. Il faut donc trouver un moyen d’extraire de ce fichier le certificat et la clé privée dans 2 fichiers .cer et .pvk. Pour cela nous allons utiliser openssl.

 

Pour commencer et après avoir exporté le certificat du magasin certificat, on se retrouve avec un fichier ayant l’extension .pfx. Ce fichier stocke notre certificat, la clé publique et la clé privée.

image

image

 

Ensuite j’ai utilisé la version light de SSL (Win32_OpenSSL_v1.0.1c_light) et j’ai installé au préalable les composants redistribuables C++ 2008 (prérequis à l’installation de openSSL).

image

 

Une fois installée il suffit de lancer les commandes suivantes pour :

  • Extraire dans un fichier PEM la clé privée et le convertir dans un format compréhensible pour SQL Server (fichier pvk)

openssl.exe pkcs12 –in cert_ssl.pfx –nocerts –nodes –out cert_ssl_pvk.pem
openssl.exe rsa –in cert_ssl_pvk.pem –outform PVK –pvk-strong –out cert_ssl.pvk

 

  • Extraire dans un fichier PEM  le certificat et le convertir dans un format compréhensible pour SQL Server (fichier cer)

openssl.exe pkcs12 –in cert_ssl.pfx –nokeys –out cert_ssl_cer.pem
openssl.exe x509 –outform DER –in cert_ssl_cer.pem –out cert_ssl.cer

 

Ce qui nous donne les fichiers suivants :

image

 

Il suffit ensuite de créer le certificat correspondant dans SQL Server dans le contexte de la base master avec le certificat et la clé publique (.cer) et la clé privée correspondante (.pvk) :

,

CREATE CERTIFICATE TDE_CERT_2
FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\cert_ssl.cer'
WITH PRIVATE KEY
(
 FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\cert_ssl.pvk',
 DECRYPTION BY PASSWORD = 'P@$$w0rd'
);

 

Vérification de la création correcte de notre certificat à l’aide de la vue système sys.certificates :

 

image

 

Bien entendu j’avais déjà créé la clé de service master (SERVICE MASTER KEY) sur le serveur SQL. C’est donc en toute logique que la clé privée du certificat que je viens de créer soit chiffrée par la clé master ici.  Il ne reste ici plus qu’à créer la clé de chiffrement de la base de données qui sera elle même chiffrée par notre certificat.

Bon chiffrement !

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Server mirroring : Ajout d’un fichier de bases de données et impact

Mis en avant

Lors d’une prestation chez un client, celui-ci m’a demandé s’il était possible d’ajouter un fichier à une base de données concernée par une session en miroir. La réponse est évidement oui mais cette opération nécessite quelques actions supplémentaires pour qu’elle soit également validée sur le serveur en miroir. En effet l’ajout d’un fichier de bases de données va suspendre la session en miroir comme on peut le voir sur l’image ci-dessous :

image

image

 

Le fait de reprendre la session ne changera rien. Si on jette un coup d’œil dans le journal des évènements SQL Server sur l’instance en miroir on peut voir le message suivant :

image

 

La modification du schéma de bases de données n’a pas été répercuté automatiquement sur l’instance en miroir et par conséquence la session en miroir est suspendue. La question évidente ici est comment répercuter la modification de schéma de base sur l’instance en miroir ? L’opération n’est pas très compliquée en réalité : il suffit de :

  • supprimer la session en miroir qui concerne nos bases de données
  • initier une sauvegarde du journal de la base de données sur le serveur principal
  • restaurer la sauvegarde du journal sur la base de données en mode NORECOVERY sur le serveur en miroir (il n’est pas obligatoire de restaurer une sauvegarde complète pour resynchroniser l’instance principale et l’instance en miroir)
  • recréer la session miroir entre les 2 instances concernées

 

Sur le serveur principal :

 -- Désactivation session miroir
ALTER DATABASE DXXXXXX_MIRRORING SET PARTNER OFF;
GO

-- Sauvegarde des données du journal non envoyées sur le miroir
BACKUP LOG DXXXXXX_MIRRORING TO DISK = 'E:\MSSQL\BACKUP\DXXXXXX_MIRRORING.TRN'
WITH INIT;
GO

 

Sur le serveur miroir :

 -- Restauration des données du journal + fichier manquant
RESTORE DATABASE DXXXXXX_MIRRORING
FILE = 'DXXXXXX_2'
FROM DISK = 'E:\MSSQL2\BACKUP\DXXXXXX_MIRRORING.TRN'
WITH MOVE 'DXXXXXX_2' TO 'E:\MSSQL2\DXXXXXX_2.ndf',
     NORECOVERY;
GO
     
-- Réactivation session en miroir
ALTER DATABASE DXXXXXX_MIRRORING SET PARTNER = 'TCP://SQL2008.insentia.lab:5022';

 

Sur le serveur principal :

 -- Réactivation session en miroir
ALTER DATABASE DXXXXXX_MIRRORING SET PARTNER = 'TCP://SQL2008.insentia.lab:5023';
ALTER DATABASE DXXXXXX_MIRRORING SET WITNESS = 'TCP://MCM.insentia.lab:5022';

 

Et voilà cette manipulation permet de pouvoir resynchroniser nos bases de données en miroir sans avoir à effectuer une restauration complète

 

David BARBARIN (Mikedavem)
MVP SQL Server

Journées SQL Server 2012 : Les slides

Mis en avant

Un petit billet pour commencer cette année 2013 comme il se doit ! A disposition les slides des sessions que j’ai présenté aux journées SQL Server 2012 à savoir :

  • SQL Server et stockage interne
  • SQL Server et infrastructure

 

image

 

Merci à vous de laisser vos commentaires. Ceux-ci sont importants pour savoir ce que vous avez pu apprécier ou non. C’est l’occasion pour nous également d’améliorer encore plus nos sessions. Au plaisir de vous revoir aux journées SQL Server 2013 Clignement d'œil

 

David BARBARIN (Mikedavem)
MVP SQL Server

Journées SQL Server 2012 : Bilan

Mis en avant

 

                         

 

La fin d’année approche et c’est l’heure des bilans et plus particulièrement celui des journées SQL Server 2012. En attendant les chiffres officiels, je voulais simplement dire que cette année a été encore un très bon cru avec un bon taux de participation : 300 professionnels du data management avec 45 speakers. Malheureusement cela a été très éphémère pour moi cette année. Arrivé le lundi soir à minuit passé avec un mauvais itinéraire pour arriver à l’hôtel (tout de suite la question : vous venez de la province ? …). Juste le temps de me remettre en tête mes 2 sessions SQL Server : stockage interne et SQL Server et infrastructure et au lit vers 2h30. J’ai pu quand même discuter rapidement et revoir certains MVP (il y en a un certain nombre mais je pense tout de suite à Christophe Laporte, David Baffaleuf, Frédéric Brouard, Christian Robert  …). que j’apprécie de part leur sympathie et leur expertise et j’ai eu l’immense plaisir de pouvoir rencontrer un certain François de Saint Marie (alias fsmrel) sur developpez.com. Je ne t’ai pas oublié Bruno Sourire  C’est donc avec plaisir que je reviendrais l’année prochaine (on croise les doigts) aux prochaines journées SQL Server.

Côté session voici celles qui m’ont ou m’auraient intéressé de voir (en quelque sorte ma perso liste) :

  • Monitoring SQL Server : Attentes et performances (David Baffaleuf et Benjamin Vesan)
  • Réplication transactionnelle et haute disponibilité – Retour d’expérience (EXPACEO)
  • Parallel Data Warehouse vNext (Microsoft)
  • SQL Server v1.1 à v11 (Christian Robert) –> Pour le fun
  • Haute-Disponibilité (Christophe Laporte)
  • Very High Performance  (Christophe Laporte et Frédéric Pichaut)
  • Optimisation pour les nuls (Frédéric Brouard et Arian Papillon)

 

Vous l’aurez sans doute deviner ce sont des sessions très orientés moteur SQL.

A venir prochainement la mise à disposition des présentations de sessions.

 

image

 

David BARBARIN (Mikedavem)
MVP SQL Server

Powershell : scripter la création d’alias SQL Server

Mis en avant

J’ai eu récemment à définir une procédure d’installation de serveurs liés SQL Server pour une application. Cette procédure doit être bien entendu testée en environnement de qualité et en production.  De plus chez mon client, un 2ème environnement de qualité est prévu en parallèle pour installer l’application concernée. Le principal souci ici est que les noms de serveurs liés vont changés et que cela risque d’avoir un impact au niveau du code de l’application. Nous ne pouvions pas nous permettre de mettre à jour l’ensemble du code TSQL applicatif à chaque changement d’environnement. Pour répondre à cette problématique nous avons choisi d’utiliser des alias SQL Server. L’utilisation des alias est beaucoup plus flexible avec les serveurs liés. Il suffit de changer ces noms sans avoir un impact sur le code.

Mais revenons à notre problématique initiale : comment scripter la création des alias SQL Server ? Il n’existe pas de procédure système T-SQL qui permette de faire cela. La solution ici est d’utiliser les classes WMI correspondantes (ici j’utilise un SQL Server 2008). Comme nous sommes à l’air du PowerShell voici le script utilisé permettant la création d’alias sous SQL Server :

param
(
$server=$(throw "Mandatory parameter -instance_name_sot not supplied")
)


# Example script to create an alias
$alias = ([wmiclass] '\\.\root\Microsoft\SqlServer\ComputerManagement10:SqlServerAlias').CreateInstance()
$alias.AliasName = 'SERVER_ALIAS'
$alias.ConnectionString = '1433' #connection specific parameters depending on the protocol
$alias.ProtocolName = 'tcp'
$alias.ServerName = $server
$alias.Put() | Out-Null;

# List existing aliases
Get-WmiObject -Namespace 'root\Microsoft\SqlServer\ComputerManagement10' -Class 'SqlServerAlias' |
    Format-Table -Property 'AliasName', 'ServerName', 'ProtocolName', 'ConnectionString'

 

… à utiliser de la manière suivante :

 & '.\deployalias' –server servername

 

image

 

Vous pouvez tout à fait modifier ce script et le rendre plus paramétrable (nom de l’alias, no de port etc …). Encore une chose, en fonction du besoin vous allez sans doute devoir installer les alias pour les 2 types d’architecteur x86 et x64. Pour se faire il suffit de lancer le script avec Windows PowerShell (x64) et Windows PowerShell (x86).

 

Bon déploiement

David BARBARIN (Mikedavem)
MVP SQL Server

Journées SQL Server 2012 : Ma session Infrastructure SQL Server

Mis en avant

 

Parce que quand il n’y en a plus il y en a encore j’aurai la chance de présenter une 2ème session aux journées SQL Server 2012 sur l’infrastructure SQL Server Sourire . Le sujet est vaste comme vous pouvez vous l’imaginer. L’écosystème de nos instances SQL Server est large. Quels processeurs ? quel modèle de RAM, combien ? Que dois-je acheter comme stockage ? Est-ce que mon serveur va être concerné par la virtualisation ? Si oui comment quels sont les éléments à prendre en compte ? Comment dois-je configurer mon système d’exploitation …. autant de question que nous DBA devons répondre. J’essaierai au cours de cette session de passer en revue les éléments caractéristiques d’une bonne infrastructure SQL Server.

Pour le planning c’est par ici

En espérant vous voir nombreux !

David BARBARIN (Mikedavem)
MVP SQL Server

Journées SQL Server 2012 : Ma session stockage interne SQL Server

Mis en avant

 

Les journées SQL Server 2012 arrivent à grand pas. J’aurai l’occasion d’intervenir le 2ème jour pour présenter une session sur le stockage interne SQL Server. Ce n’est pas forcément un des sujets les plus simples à traiter mais certainement un de ceux (parmi tant d’autres) où il y a beaucoup de choses à dire et un de mes sujets favoris. Je vous conseille lors de cette session de sortir le décodeur hexadécimal. Je vous aurai prévenu Sourire

Pour plus de détails c’est par ici

 

En espérant vous voir nombreux !

 

David BARBARIN (Mikedavem)
MVP SQL Server

Techdays 2012 à Lausanne : compte rendu

Mis en avant

J’ai eu l’occasion d’animer 2 sessions aux techdays 2012 à Lausanne les 06 et 07 novembre sur SQL Server bien entendu Sourire  :

  • Une session orientée développement avec les nouveautés SQL Server 2012 dans ce domaine (session que j’ai eu le plaisir de co-animer avec Oishiiii) . Présentation disponible ici
  • Une session orientée IT avec SQL Server 2012 et Always-On. Présentation disponible ici

 

Cette année nous avons orienté nos sessions sur 80% de démonstration et 20% de présentation.Vous pourrez voir les vidéos sur Channel 9. Pour le moment seule la session orientée développement est présente mais le reste viendra après.

Un petit clin d’œil également à la dream team (voir ci-dessous). C’est vrai que ces 2 jours étaient plutôt sympathiques Sourire

 

 

techdays2012Lausanne

 

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Server 2012 SP1 disponible en téléchargement

Mis en avant

Le service pack 1 de SQL Server 2012 qui était très attendu est disponible en téléchargement ici.

On a maintenant une forte intégration et un support des fonctionnalités BI comme PowerPivot ou PowerView dans office 2013.  Du côté des fonctionnalités classiques non BI nous retrouvons le support pour la migration cross-cluster et always-on, les index XML sélectifs, un changement de permission pour DBCC SHOW_STATISTICS et autres.

Pour plus détail c’est par ici

 

David BARBARIN (Mikedavem)
MVP SQL Server

SQL Pass : Quelques news

Mis en avant

La keynote du SQLPass a enfin dévoilé le projet Haketon. C’est quoi Haketon ? Il s’agit en réalité d’une base InMemory, pour des traitements OLTP, dont les principaux facteurs de ralentissement ont été supprimés.

On peut visiblement d’après les premiers tests clients triés sur le volet s’attendre à des gains de performance allant de x10 à x50 avec le support complet ACID  et les requêtes T-SQL compilés en code natif ! Cette fonctionnalité apparaitra  dans la prochaine version majeure de SQL Server.

La prochaine version PDW (Parallel DataWarehouse) a été annoncé et est visiblement prévue pour le premier semestre 2013 avec l’apparition de PolyBase. Ce dernier permettra les requêtes de bases de données relationnelles et non relationnelles Hadoop. On se rapproche clairement du BIGDATA !

Enfin une nouveauté qui n’est pas sans importance et qui concerne les index columnstore avec la possibilité de mise à jour des tables si celles-ci contiennent ce type d’index  …

 

David BARBARIN (Mikedavem)
MVP SQL Server

Journées SQL Server : Les inscriptions sont ouvertes !

Mis en avant

 

Si vous avez l’intention de participer aux journées SQL Server et je suis sûr que ca sera le cas Sourire  sachez que les inscriptions pour les journées SQL Server qui se dérouleront le 10 et 11 décembre 2012 sont désormais ouvertes.

Pour rappel voici quelques informations utiles :

Au niveau du contenu :

  • 4 tracks en parallèle
  • Plus de 35 sessions
  • Plus de 35 speakers
  • Des sessions sur la Business Intelligence, les performances SQL, le Cloud, le Big Data, l’ALM, le DataViz, etc.

Pour plus de détails c’est par ici

Le lieu :

Centre de Conférences Microsoft
41 quai du Président Roosevelt
Issy-Les-Moulineaux
Accessible Métro et Tram

Inscriptions :

Web : http://jss2012.fr
Twitter : #jss2012

 

 

En espérant vous voir nombreux !!

 

David BARBARIN (Mikedavem)
MVP SQL Server

Lancement de Windows Server 2012 le 24 octobre 2012

Mis en avant

Ce n’est pas sans intérêt que les administrateurs de bases de données devront suivre cette nouvelle version de Windows Server et des nouvelles fonctionnalités que cette dernière proposera et qui pourront être bénéfiques aux instances SQL Server comme la haute disponibilité, le stockage ou encore le NIC Teaming. Vous pourrez suivre le lancement de cette nouvelle version chez Microsoft France (Issy-les-Moulineaux) le 24 octobre 2012.

Pour le formulaire d’inscription c’est par ici

 

 

David BARBARIN (Mikedavem)
MVP SQL Server

Cluster Resource DTC in clustered service or application ‘Cluster Group’ Failed

Mis en avant

Un problème assez particulier que je viens de rencontrer au cours d’un audit d’un cluster SQL chez un de mes clients. Je vois une multitude d’erreurs dans le journal des évènements 1205 et 1069 liée à une ressource DTC. Le hic c’est qu’il existait bien une ressource DTC sur le serveur mais elle n’était pas concernée. Me voilà bien avancé avec mon erreur …

Pour bien situer le contexte voici l’erreur rencontré dans le journal des évènements:

 

image

 

Seulement en regardant les ressources au niveau du cluster management en mode GUI on voit que la ressource DTC est en ligne et fonctionne correctement. Je passe en mode commande (cluster.exe) et voici ce que je remarque :

 

image

 

J’ai en réalité 2 DTC sur mon cluster SQL. La ressource MSDTC-SQL2005Dtc est la ressource qui a été créée lors de l’installation du cluster SQL. En revanche la ressource DTC (statut failed) est présente dans le groupe Cluster Group mais n’est pas visible dans la console cluadmin.msc. Visiblement c’est cette 2ème ressource qui pose problème. A noter que les ressources qui font parti du groupe Cluster Group ne sont pas visible en mode GUI.

La suppression de cette ressource fera disparaitre le message d’erreur intermittent présent dans les différents journaux d’évènements.

image

 

En vérifiant dans les services de composants on peut s’assurer que c’est bien la ressource cluster qui sera utilisé :

image

 

David BARBARIN (Mikedavem)
MVP SQL Server

Windows Server 2012 et SQL Server partie 1–Dynamic quorum

Mis en avant

Comme vous le savez sans doute Windows Server 2012 est sorti et bien entendu en tant qu’administrateur de bases de données on peut se demander quelles sont les fonctionnalités de cette nouvelle mouture qui pourront bénéficier de près ou de loin à SQL Server. Dans ce premier volet j’ai décidé de commencer par la haute disponibilité. Une des fonctionnalités que j’ai trouvé relativement intéressante dans ce domaine est l’utilisation du quorum dynamique en environnement cluster et par la même occasion de Always-On de SQL Server 2012.

Lire la suite

Présentation SQL Server 2012 Always-On au Pass Suisse Romandie

Mis en avant

Nous relançons pour cette rentrée 2012 les sessions SQL Server en suisse romande avec le groupe Pass Romandie. J’aurai l’occasion de présenter Always-On avec SQL Server 2012 lors de cette première session. Il y aura également une autre session tout aussi intéressante sur SQL Server dans Azure présentée par Thoi Dung de chez Microsoft Suisse. Je vous laisse également découvrir l’ensemble de l’agenda des sessions jusqu’à la fin de cette année. N’hésitez pas à vous inscrire et à réserver les dates !!!

 

10.10.2012

SQLServer sur Azure en machine virtuelle : T. Thoi
Always-On : D. Barbarin
Inscription ICI: http://www.eventbrite.com/event/4365192408

14.11.2012

De la sécurité avec le chiffrement : D. Barbarin
Repousser les limites de SQL Server Express / Pushing SQL Server Express to the max : C. Robert
Inscription ICI: http://www.eventbrite.com/event/4369651746

05.12.2012

Pourquoi mettre en place de la réplication ? / Why using the replication ? : C. Robert
Memory Usage within SQL Server : D. Schmidt
Inscription ICI: http://www.eventbrite.com/event/4369621656

 

Toutes ces séances auront lieu à l’adresse suivante:

Novotel Genève
Rue de Zurich 19
1201 Genève
022 909 90 00

 

David BARBARIN (Mikedavem)
MVP SQL Server

Les journées SQL Server–second volet

Mis en avant

 

 

 

Le premier volet des journées SQL Server a visiblement connu un très grand succès. C’est la raison pour laquelle GUSS s’est relancé dans la préparation d’un second volet qui devrait se dérouler en décembre. Les dates définitives seront communiqués un peu plus tard. Cependant pour que cet évènement soit de nouveau un succès nous avons besoin de vos avis qui se présente sous la forme d’un sondage qui ne vous prendra que quelques minutes de votre temps Sourire et qui nous permettront de mieux cibler vos attentes à tous les niveaux (contenu des sessions, organisation etc …)

Pour le remplir c’est par ici

Merci par avance !!

 

David BARBARIN (Mikedavem)
MVP SQL Server