AlwaysOn Availability Groups (AG)

AlwaysOn Availability Groups : réplication et basculement automatique

Histoire : le miroir

Permet un basculement automatique très rapide

La redirection est effectuée par le client (Client natif SQL)‏

Un seul miroir par base de données

Peut être implémenté sur n’importe quel matériel

Un second serveur est nécessaire

Pas de contrainte de distance entre les serveurs

Principes de base de AlwaysOn AG

Combine le meilleur du cluster de basculement et du mirroring

Basé sur un modèle WSFC non-shared storage

WSFC assure le basculement automatique – IP virtuelle

Les endpoints assurent la copie des données – canal TCP

Permet l’accès en lecture aux réplicas.

Spécifications techniques

Basculement multi-bases de données. Vous pouvez ajouter autant de bases de données dans un groupe que vous le souhaitez, et créer un nombre non limité de groupes12https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/prereqs-restrictions-recommendations-always-on-availability . Microsoft a testé AlwaysOn avec une dizaine de groupes et une centaine de bases.

Plusieurs secondaires. 4 en 2012, 8 en 2014. 2 synchrones. 1 paire de basculement.

Compression et chiffrement intégrés du transport par endpoint. Voir section 5.2.5, Échange de données par endpoints, page 73.

Auto-page repair

Basculement automatique et manuel. Règles de basculement flexibles.

Nom virtuel fourni par WSFC.

Dashboard de surveillance

Intégration du Filestream et des index FTS.

Basculement d’un éditeur de réplication.

Réplicas actifs

Lecture seule

Sauvegardes

Déchargement de requêtes sur les réplicas

Supervision et diagnostic avancés

Automation avec PowerShell

Modes

Synchrone
  • Les performances du serveur principal sont affectées par la qualité du réseau

  • Synchronisation des données garantie

  • Basculement automatique

Asynchrone
  • Plus performant

  • Les serveurs peuvent être désynchronisés

  • Basculement manuel

Un réplica asynchrone ne sera jamais dans l’état « synchronisé ». Il sera toujours en synchronisation, et aucun basculement automatique ne sera possible. Un basculement manuel « propre » n’est pas non plus possible. Seul un basculement forcé (FORCE_FAILOVER_ALLOW_DATA_LOSS) sera possible.

Le réplica asynchrone est utile si vous ne voulez pas faire dépendre les performances du principal de ce réplica, dans le cas où celui-ci est moins puissant, ou à une distance importante.

Configuration only

Nouveau mode, qui permet, de créer un réplica sans donnée, dans une configuration de cluster non Windows (non WSFC), pour assurer un vote de quorum. Sur ce réplica, la base de données Master contient les métadonnées de la configuration du groupe de disponibilité.

évolutions à travers les versions

SQL Server 2014

8 secondaires

3 réplicas synchrones, dont 2 en failover

Disponibilité augmentée pour les réplicas en lecture

coupure réseau / perte de quorum

Intégration Azure

Réplicas asynchrone en IaaS

Ouverts en lecture

Plus de fonctionnalités de diagnostic

SQL Server 2016

3 réplicas synchrones, dont 3 en failover

Support de DTS (Distributed Transaction Coordinator) : Windows Server 2016 ou Windows Server 2012 Release 2 patch KB3090973.

Failover en cas d’indisponibilité d’une base (<> ONLINE)

Réplicas en load-balancing (round robin)

Support de gMSA (Group-Managed Service Accounts)

Transport de journal optimisé

Parallel redo

SQL Server 2017

Support des solutions de haute disponibilité sur Linux (avec Pacemaker et Corosync en couche cluster OS).

Support d’un groupe de disponibilité sans cluster.

Support de réplicas hétérogènes (Windows – Linux).

Reconstruction d’index en ligne pouvant être reprise, pour éviter l’explosion du journal de transactions.

Support des transactions cross bases de données impliquées dans un groupe de disponibilité.

SQL Server 2019

Jusqu’à 5 réplicas synchrones.

Support des configurations de haute-disponibilité en container.

Redirection de la connexion entre un réplica secondaire et un réplica principal, même si la chaîne de connexion mentionne le réplica directement13https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/secondary-replica-connection-redirection-always-on-availability-groups.

Synchronisation de secondaires

Transaction en synchrone

La transaction doit être validée sur tous les réplicas synchrones pour être validée sur le principal.

En 2016, le processus est ~ 10x plus rapide

Parallélisation de la lecture de log et du redo

Amélioration des performances de la compression

En cas de déconnexion, le réplica passe en asynchrone

Session timeout, 10 secondes par défaut

Échange de données par endpoints

Ouverture vers l’extérieur

Définissent un socket

Authentification et chiffrement. Windows ou certificat

Permissions d’accès

CREATE ENDPOINT

Redémarrage des endpoints

En cas de problème, ou pour couper et rétablir la communication, vous pouvez arrêter et redémarrer un endpoint :

use master
alter endpoint endpoint_name state = stopped;
alter endpoint endpoint_name state = started;

Cela peut être utile dans le cas d’une erreur de ce genre :

An error occurred in a Service Broker/Database Mirroring transport connection endpoint, Error: 8474, State: 11.

C’est la commande à essayer si un réplica est dans un état déconnecté14https://docs.microsoft.com/fr-FR/troubleshoot/sql/database-mirroring/mirrored-databases-disconnected.

Chiffrement des endpoints

Dans le cas où vous souhaitez utilise AlwaysOn pour mettre à jour votre version de SQL Server, vous pourriez tomber sur une erreur de chiffrement des endpoint, si l’algorithme de chiffrement par défaut du endpoint change entre les versions. Ce fut notamment un problème sur un CU de SQL Server 2016, ou l’algorithme RC4 a été remplacé.

Vous pourriez obtenir une erreur 8474, comme suivant.

An error occurred in a Service Broker/Database Mirroring transport connection endpoint, Error: 8474, State: 11.

Interrogez les erreurs sur le réplica, à l’aide de la requête suivante :

SELECT r.replica_server_name ,
r.endpoint_url ,
rs.connected_state_desc ,
rs.last_connect_error_description ,
rs.last_connect_error_number ,
rs.last_connect_error_timestamp
FROM sys.dm_hadr_availability_replica_states rs
JOIN sys.availability_replicas r ON rs.replica_id = r.replica_id
WHERE rs.is_local = 1;

En cas d’erreur de chiffrement, vous devriez obtenir quelque chose comme ceci dans la colonne last_connect_error_description :

An error occurred while receiving data: '10054(An existing connection was forcibly closed by the remote host.)'.

Vérifiez les algorithmes de chiffrement (encryption_algorithm_desc) :

SELECT name ,
type_desc ,
state_desc ,
role_desc ,
is_encryption_enabled ,
connection_auth_desc ,
encryption_algorithm_desc
FROM sys.database_mirroring_endpoints;

Vous pouvez changer l’algorithme de chiffrement de votre endpoint :

ALTER ENDPOINT [Hadr_endpoint]
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM AES RC4)

Rôles des réplicas

Un réplica peut se trouver dans un des rôles suivants :

SECONDARY or RESOLVING

État des réplicas et des bases de données

Le serveur principal et le serveur miroir s’analysent mutuellement, et déterminent leurs états respectifs

ÉtatDescription

SYNCHRONIZED

Le réplica est à jour

SYNCHRONIZING

Le réplica se met à jour. Situation normale en asynchrone. Le basculement n’est pas possible, sauf en forçant.

NOT SYNCHRONIZING

Le réplica est en pause.

PENDING_FAILOVER

Le basculement est en cours

DISCONNECTED

Le réplica a perdu la communication.

Les changements d’état peuvent se suivre dans la session d’événements étendus alwayson_health. Surveillez l’événement availability_replica_state_change. Par exemple :

timestampcurrent_stateprevious_state

2018-06-01 14:44:22.7134418

RESOLVING_PENDING_FAILOVER

SECONDARY_NORMAL

2018-06-01 14:44:27.2955323

RESOLVING_NORMAL

RESOLVING_PENDING_FAILOVER

Statuts de synchronisation des bases de données

NOT SYNCHRONIZING

Statuts de santé de synchronisation

« synchronization-health state. » Visible dans les vues sys.dm_hadr_availability_group_states, sys.dm_hadr_availability_replica_states, sys.dm_hadr_database_replica_states.

HEALTHY

NOT_HEALTHY – au moins une des bases de données du groupe est dans le statut NOT SYNCHRONIZING.

PARTIALLY_HEALTHY – au moins une base de données du groupe est dans le statut SYNCHRONIZING. Mais aucune base de données n’est dans le statut NOT SYNCHRONIZING.

Connexion cliente

La connexion se fait à travers un listener – VNN en ressource WSFC

Le « failover partner » dans la chaîne de connexion fonctionne encore

Si vous ne pouvez pas changer la connexion du client

La connexion en lecture se fait à travers le listener, en indiquant ApplicationIntent=ReadOnly dans la chaîne de connexion.

Historiquement l’option de chaîne de connexion MultiSubnetFailover=True permettait une reconnexion plus rapide.

Secondaires actifs

Un réplica secondaire peut être ouvert en lecture.

Quand vous ouvrez un secondaire en lecture, SQL Server implémente une isolation snapshot pour éviter les blocages. Cela augmente la taille des données de 14 octets par page de données et d’index. Cela peut potentiellement diminuer les performances et provoquer plus de fragmentation.

BAG en SQL Server 2016

À partir de SQL Server 2016, le miroir n’est plus utile en édition standard. BAG (Basic Availability Group) offre les mêmes fonctionnalités en édition Standard.

  • 2 réplicas. Les groupes de disponibilité de base pour SQL Server 2017 sur Linux prennent en charge un réplica de configuration uniquement supplémentaire.

  • Pas d’accès en lecture au réplica secondaire.

  • Pas de sauvegarde possible sur le réplica secondaire, ni de CHECKDB.

  • Une seule base

  • Pas de mise à jour en vrai AG après coup. Supporté uniquement en édition Standard.

  • Modes synchrone et asynchrone possibles.

CREATE AVAILABILITY GROUP MonAG
WITH (BASIC)
FOR DATABASE PachadataFormation

Configuration hybride avec Azure

Réplicas AlwaysOn dans Azure

Nouvel assistant

Azure peut servir à héberger des réplicas en lecture seule ou pour générer les sauvegardes

Intégration Azure storage

Support natif des fichiers de bases de données comme blobs Azure

Vous profitez des SLAs Azure Storage (hum…​)

Déplacement base de données par base de données

Assistant de migration en VM Azure

Installation et mise en place

Mise en place de WSFC

Configurer le cluster

Activer AlwaysOn sur le service

Gestionnaire de configuration + Redémarrage du service

Powershell : Enable-SQLAlwaysOn (redémarrage automatique)

En cas de disque partagé

Il peut arriver que la présence d’un disque partagé trouble le cluster WSFC. En AlwaysOn AG, nous utilisons en général un témoin de partage de fichiers (FSW, File Share Witness).

Si nous créons le cluster WSFC avec l’assistant, il existe une coche qui indique « ajouter tous les disques disponibles au cluster » qui est cochée par défaut. Cela peut casser le cluster si les disques en questions ne sont pas destinés à être partagés dans le cluster.

Pour supprimer après coup un disque de cluster, vous pouvez utilise Powershell15https://docs.microsoft.com/en-us/powershell/module/failoverclusters/remove-clustersharedvolume.

Exemple :

Remove-ClusterSharedVolume -Name "Cluster Disk 1"

Réplica de configuration

Vous pouvez définir un réplica de configuration uniquement (SQL Server 2017), ce qui est utile dans les clusters externes de type Pacemaker, qui ne supportent pas les témoins. Un troisième réplica de configuration est alors nécessaire pour former un quorum.

ALTER AVAILABILITY GROUP Pacha ADD REPLICA ON <server_instance>
WITH  (
ENDPOINT_URL = 'TCP://system-address:port',
AVAILABILITY_MODE = CONFIGURATION_ONLY
)

Créer un groupe de disponibilité

Vous pouvez un groupe de disponibilité en utilisant l’assistant SSMS, T-SQL ou Powershell.

Pré-requis des bases de données

Doivent être en mode complet (et pas pseudo-simple).

Auto-close interdit.

La base peut être chiffrée en TDE : Ajout manuel avant 2016, et, selon documentation, intégré dans l’assistant depuis 2016 – copie de la clé de chiffrement sur le réplica par l’assistant. Si vous arrivez à le faire marcher, je suis preneur.

Toutes les machines doivent être dans le même domaine

Toutes les bases doivent être en mode de récupération COMPLET

⇒ faites des sauvegardes de journaux

L’unité de basculement est le groupe

Vous pouvez utiliser des bases contenues pour simplifier les connexions

Attention aux travaux de l’agent

Création de l’AG en T-SQL

CREATE AVAILABILITY GROUP [<availability_group_name>]
FOR DATABASE db1
REPLICA ON'<*primary_server*>'
WITH (ENDPOINT_URL = N'TCP://<primary_server>.<fully_qualified_domain_name>:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC),
N'<secondary_server>' WITH (ENDPOINT_URL = N'TCP://<secondary_server>.<fully_qualified_domain_name>:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC);

Créer un groupe de disponibilité sur Azure VM

La procédure est décrite dans cette documentation : « Use PowerShell or Az CLI to configure an availability group for SQL Server on Azure VM » : https://docs.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/availability-group-az-commandline-configure.

Initialisation des bases

Par assistant – dossier partagé, sauvegarde / restauration prise en charge

Manuellement – application des restaurations sur le réplica, complète + journaux, NORECOVERY

Automatic seeding (2016)

Configuration DB_FAILOVER

Si DB_FAILOVER = ON sur un groupe de disponibilité, le groupe basculera si une base appartenant au groupe se trouve dans n’importe quel état autre qu’ONLINE.

Support du DTC

DTC_SUPPORT = { PER_DB | NONE }

Spécifie si les transactions distribuées sont activées pour ce groupe de disponibilité. Les transactions distribuées sont prises en charge depuis SQL Server 2016.

PER_DB promeut automatiquement les transactions entre bases de données impliquant des bases de données dans le groupe de disponibilité dans des transactions distribuées.

NONE empêche la promotion automatique des transactions entre bases de données en transactions distribuées, et n’inscrit pas la base de données avec un RMID stable dans DTC.

Les transactions distribuées ne sont pas bloquées quand le paramètre NONE est utilisé, mais le basculement et la récupération automatique de base de données risquent d’échouer16https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring .

REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

Depuis SQL Server 2017. Définit un nombre minimal de réplicas secondaires synchrones nécessaires à la validation avant que le réplica principal ne valide une transaction.

Garantit que la transaction SQL Server attend que les journaux des transactions soient mis à jour avec le nombre minimal de réplicas secondaires. La valeur par défaut est 0, ce qui donne le même comportement que SQL Server 2016. La valeur maximale est le nombre de réplicas moins 1.

Réplica en CONFIGURATION_ONLY

CONFIGURATION_ONLY17https://docs.microsoft.com/fr-fr/sql/linux/sql-server-linux-availability-group-ha spécifie que le réplica principal valide de façon synchrone les métadonnées de configuration de groupe de disponibilité dans la base de données master de ce réplica. Un réplica en configuration seule :

  • peut être hébergé sur une édition Express.

  • exige que le point de terminaison de mise en miroir des données du réplica CONFIGURATION_ONLY soit de type WITNESS.

  • Ne peut pas être utilisé si CLUSTER_TYPE = WSFC.

Erreur 19435

Il m’est arrivé d’obtenir cette erreur à la création du groupe de disponibilité, dans un environnement où la machine avait été jointe à un domaine après l’installation de SQL Server. Je ne sais pas si c’est la source du problème, mais voici une solution si cela se produit pour vous.

L’erreur dans le log d’erreur de SQL Server est semblable à ceci :

Unknown,Error: 19435
The state of the local availability replica in availability group 'XXX' has changed from 'RESOLVING_NORMAL' to 'NOT_AVAILABLE'. The state changed because either the associated availability group has been deleted or the local availability replica has been removed from another SQL Server instance.

On peut trouver des erreurs dans le log du cluster, de ce type :

EVENT ID : 1254 Error - Clustered role 'XXX' has exceeded its failover threshold.  It has exhausted the configured number of failover attempts within the failover period of time allotted to it and will be left in a failed state.  No additional attempts will be made to bring the role online or fail it over to another node in the cluster.  Please check the events associated with the failure.  After the issues causing the failure are resolved the role can be brought online manually or the cluster may attempt to bring it online again after the restart delay period.

EVENT ID : 1205 Error - The Cluster service failed to bring clustered role 'XXX' completely online or offline. One or more resources may be in a failed state. This may impact the availability of the clustered role.

EVENT ID : 1069 Error - Cluster resource 'XXX' of type 'SQL Server Availability Group' in clustered role 'AG-SQLIPSN-DEV' failed. Based on the failure policies for the resource and role, the cluster service may try to bring the resource online on this node or move the group to another node of the cluster and then restart it.  Check the resource and group state using Failover Cluster Manager or the Get-ClusterResource Windows PowerShell cmdlet.

Apparemment, cela provient d’un problème de communication entre SQL Server et le service de cluster. Le service de cluster tourne sous le compte de service NT AUTHORITY\SYSTEM.

Vous verrez également des signes de ce problème dans le journal du cluster (que vous récupérez avec Get-ClusterLog). Il sera indiqué une erreur d’exécution de la procédure sp_server_diagnostics par manque de permission.

Il faut ajouter des privilèges dans SQL Server pour ce compte de service :

GRANT ALTER ANY AVAILABILITY GROUP TO [NT AUTHORITY\SYSTEM];
GRANT CONNECT SQL TO [NT AUTHORITY\SYSTEM];
GRANT VIEW SERVER STATE TO [NT AUTHORITY\SYSTEM];

Amorçage automatique

Grâce à l’amorçage automatique (automatic seeding), l’ajout d’une base dans le groupe de disponibilité ne demande pas de manipulation supplémentaire pour l’initialisation de la base sur les réplicas. Les bases sont donc créées automatiquement sur les réplicas.

Pour permettre le seeding automatique sur un réplica secondaire, vous devez autoriser la création de la base de données avec la commande suivante :

ALTER AVAILABILITY GROUP Pacha
GRANT CREATE ANY DATABASE;

Ensuite, commande JOIN lancera le seeding.

ALTER AVAILABILITY GROUP Pacha JOIN;

Utilisez la vue sys.dm_hadr_automatic_seeding pour surveiller le processus. Pour interrompre :

ALTER AVAILABILITY GROUP Pacha;

DENY CREATE ANY DATABASE

Activation de la compression

DBCC TRACEON (9567,-1)

Fonctionnement du seeding automatique

Pour effectuer un seeding automatique, SQL Server effectue en interne une sauvegarde complète de la base de données, et l’envoie sur les secondaires à l’aide d’un flux VDI (Virtual Device Interface).

Les secondaires effectuent une restauration de la sauvegarde. La base est ajoutée au groupe de disponibilité lorsque la restauration est complète.

Le journal de transaction ne peut pas se vider durant une opération de seeding.

Le seeding automatique est un processus monothread qui peut gérer jusqu’à cinq bases de données.

Vous pouvez suivre la sauvegarde sur le principal avec la requête suivante.

SELECT
r.session_id, r.status, r.command, r.wait_type
, r.percent_complete, r.estimated_completion_time
FROM sys.dm_exec_requests r JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
WHERE r.session_id <> @@SPID
AND s.is_user_process = 0
AND r.command like 'VDI%'
and wait_type ='BACKUPTHREAD'

Sur le secondaire, le type de requête est un REDO. Vous pouvez suivre la restauration avec la commande suivante :

SELECT
r.session_id, r.status, r.command, r.wait_type
, r.percent_complete, r.estimated_completion_time
FROM sys.dm_exec_requests r JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
WHERE r.session_id <> @@SPID
AND s.is_user_process = 0
AND r.command like 'REDO%'
and wait_type ='BACKUPTHREAD'

Après la fin des opérations de seeding automatique, la session reste ouverte, autant que je sache, jusqu’au redémarrage de l’instance.

Emplacement des fichiers

Pour le seeding automatique, l’idéal est que les répertoires existent à l’identique sur les réplicas secondaires. Le seeding automatique n’a pas d’option de déplacement des fichiers à la restauration. C’est absolument le cas en SQL Server 2016.

Le chemin des fichiers par défaut, défini dans l’instance, n’est pas pris en compte.

SQL Server 2017 prend en charge le seeding automatique sur des serveurs Linux, Avec une utilisation des chemins par défaut. Le comportement est documenté18https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/automatic-seeding-secondary-replicas, et il peut être changé avec un drapeau de trace.

Utilisation avec des sauvegardes existantes

Il est possible de combiner la sauvegarde, la copie et la restauration traditionnelles avec l’amorçage automatique. Dans ce cas, restaurez d’abord la base de données sur un réplica secondaire, y compris tous les journaux de transactions disponibles. Ensuite, activez l’amorçage automatique lors de la création du groupe de disponibilité pour « rattraper » la base de données du réplica secondaire, comme si une sauvegarde de la fin du journal était restaurée (consultez Sauvegardes de la fin du journal (SQL Server)).

Évènements pour le seeding automatique

Des évènements étendus existent pour le seeding automatique. Ils ne sont pas visibles par défaut dans l’assistant, parce qu’ils appartiennent au canal debug, que vous devez cocher dans l’assistant.

Les évènements sont les suivants :

  • hadr_automatic_seeding_start – début de l’opération.

  • hadr_automatic_seeding_state_transition – changement de statut.

  • hadr_automatic_seeding_success – fin avec succès.

  • hadr_automatic_seeding_timeout – timeout

  • hard_physical_seeding_progress – pourcentage de progression.

Vous trouvez un requête de création de session d’évènement pour le seeding automatique à l’adresse suivante : https://github.com/rudi-bruchez/tsql-scripts/blob/master/hadr/direct-seeding-monitoring.sql.

Surveillance de l’automatic seeding

Le seeding automatique n’est pas très loquace. Notamment, si le seeding ne réussit pas, vous n’avez pas d’avertissement graphique, ou très évident. Vous devez vous en référer aux journaux d’erreur de SQL Server et à la session d’événements étendus alwayson_health.

Vous trouvez des requêtes du suivi du seeding automatique à l’adresse suivante : https://github.com/rudi-bruchez/tsql-scripts/blob/master/hadr/direct-seeding-monitoring.sql .

Historique des sauvegardes de seeding

SELECT
bs.backup_start_date,
bs.backup_finish_date,
bs.type,
bs.database_name,
bs.server_name,
bs.machine_name,
compressed_backup_size
FROM msdb.dbo.backupset bs
JOIN msdb.dbo.backupmediafamily bmf
ON bs.media_set_id = bmf.media_set_id
WHERE TRY_CAST(bmf.physical_device_name as uniqueidentifier) IS NOT NULL

Suivi par évènements étendus

CREATE EVENT SESSION [AlwaysOn_autoseed] ON SERVER
ADD EVENT sqlserver.hadr_automatic_seeding_state_transition,
ADD EVENT sqlserver.hadr_automatic_seeding_timeout,
ADD EVENT sqlserver.hadr_db_manager_seeding_request_msg,
ADD EVENT sqlserver.hadr_physical_seeding_backup_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_failure,
ADD EVENT sqlserver.hadr_physical_seeding_forwarder_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_forwarder_target_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_progress,
ADD EVENT sqlserver.hadr_physical_seeding_restore_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_submit_callback
ADD TARGET package0.event_file(
SET filename=N'autoseed.xel',
max_file_size=(5),
max_rollover_files=(4)
)
WITH (
MAX_MEMORY=4096 KB,
EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,
MAX_EVENT_SIZE=0 KB,
MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=ON
)
GO

ALTER EVENT SESSION AlwaysOn_autoseed ON SERVER STATE=START
GO

Name Description

hadr_db_manager_seeding_request_msg Message de demande d’amorçage.

hadr_physical_seeding_backup_state_change Modification d’état côté sauvegarde d’amorçage physique.

hadr_physical_seeding_restore_state_change Modification d’état côté restauration d’amorçage physique.

hadr_physical_seeding_forwarder_state_change Modification d’état côté redirecteur d’amorçage physique.

hadr_physical_seeding_forwarder_target_state_change Modification d’état côté cible du redirecteur d’amorçage physique.

hadr_physical_seeding_submit_callback Événement de rappel de soumission d’amorçage physique.

hadr_physical_seeding_failure Événement d’échec d’amorçage physique.

hadr_physical_seeding_progress Événement de progression d’amorçage physique.

hadr_physical_seeding_schedule_long_task_failure Événement d’échec de tâche longue de planification d’amorçage physique.

hadr_automatic_seeding_start Se produit quand une opération d’amorçage automatique est soumise.

hadr_automatic_seeding_state_transition Se produit quand une opération d’amorçage automatique change d’état.

hadr_automatic_seeding_success Se produit quand une opération d’amorçage automatique aboutit.

hadr_automatic_seeding_failure Se produit quand une opération d’amorçage automatique échoue.

hadr_automatic_seeding_timeout Se produit quand une opération d’amorçage automatique expire.

Créer le listener

Le listener est un nom et une adresse IP définie par la configuration du groupe de disponibilité, qui crée dans les faits une ressource VNN (Virtual Network Name) et VIP (Virtual IP) dans le rôle de cluster WSFC, pour la connexion et la bonne redirection des clients.

Le nom (VNN) ne peut contenir que des caractères alphanumériques, des tirets (-) et des caractères de soulignement (), dans n’importe quel ordre. Les noms d’hôte DNS ne respectent pas la casse. Longueur maximale de 63 caractères.

NetBIOS identifie les 15 premiers caractères du nom DNS. Si vous avez deux clusters WSFC qui sont contrôlés par le même Active Directory et que vous créez des listener dans les deux clusters avec un préfixe identique de 15 caractères, vous obtenez une erreur.

Configuration du routage en lecture

Réplica :

SECONDARY_ROLE ( READ_ONLY_ROUTING_URL = 'TCP://system-address:port' )

Principal :

PRIMARY_ROLE ( READ_ONLY_ROUTING_LIST = ( ‘server’ [ ,...n ] ) )

Connexion avec intent à read-only :

  • Si la liste est définie sur le principal, on route

  • On retourne au client l’URL du premier réplica disponible

Option ALLOW_CONNECTIONS

ALLOW_CONNECTIONS = { NO | READ_ONLY | ALL }

Spécifie si les bases de données d’un réplica secondaire peuvent accepter des connexions clientes.

NO – Aucune connexion utilisateur n’est autorisée aux bases de données secondaires de ce réplica. Elles ne sont pas disponibles pour l’accès en lecture. Il s’agit du comportement par défaut.

READ_ONLY – Seules sont autorisées les connexions aux bases de données dans le réplica secondaire où la propriété d’intention de l’application est définie sur ReadOnly. Pour plus d’informations sur cette propriété, consultez le lien d’aide suivant : https://docs.microsoft.com/fr-fr/sql/relational-databases/native-client/applications/using-connection-string-keywords-with-sql-server-native-client.

ALL – Toutes les connexions sont autorisées aux bases de données dans le réplica secondaire pour un accès en lecture seule.

Vérification de la configuration du routage

SELECT

ag.name as [Availability Group],

ar.replica_server_name as [When Primary Replica Is],

rl.routing_priority as [Routing Priority],

ar2.replica_server_name as [RO Routed To],

ar.secondary_role_allow_connections_desc, ar2.read_only_routing_url
FROM sys.availability_read_only_routing_lists rl
inner join sys.availability_replicas ar on rl.replica_id = ar.replica_id
inner join sys.availability_replicas ar2 on rl.read_only_replica_id = ar2.replica_id
inner join sys.availability_groups ag on ar.group_id = ag.group_id
ORDER BY ag.name, ar.replica_server_name, rl.routing_priority;19adapté de link:https://jbswiki.com/2017/09/27/alwayson-how-to-disable-read-only-routing-for-an-availability-group/[https://jbswiki.com/2017/09/27/alwayson-how-to-disable-read-only-routing-for-an-availability-group/]

Désactivation du routage en lecture seule

ALTER AVAILABILITY GROUP [MONAG]

MODIFY REPLICA ON N'NOM_DU_REPLICA' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=NONE));

Load balancing en round-robin

Load Balancing sur la redicrection en lecture, à partir de SQL Server 2016 :

ALTER AVAILABILITY GROUP MONAG
MODIFY REPLICA ON
N'SERVER1' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST= (('SERVER2','SERVER3')))
);

Verrouillage sur le secondaire

La copie des données sur un secondaire en lecture implique une opération de REDO

Elle doit respecter le niveau d’isolation par défaut

Les lectures pourraient donc bloquer les REDO

Les réplicas en lectures passent automatiquement les REDO en isolation snapshot

Attention à tempdb

Le secondaire en lecture peut créer des statistiques temporaires dans tempdb.

Permissions sur le principal

On peut aussi configurer le comportement lorsque le réplica est primaire, avec l’option PRIMARY_ROLE suivante :

ALLOW_CONNECTIONS = { READ_WRITE | ALL }

READ_WRITE – Les connexions avec ApplicationIntent = ReadOnly ne sont pas autorisées.

ALL – Toutes les connexions sont autorisées. Valeur par défaut.

Redirection sur le principal sans listener

Nouveauté SQL Server 2019.

Redirection automatique vers le réplica principal, même si la connexion est effectuée directement sur un réplica secondaire (sans passer par le listener).

Gestion des sauvegardes

N’importe lequel, synchrone ou asynchrone

Les sauvegardes sur le primaire sont bien sûr toujours possibles

Chaînage de sauvegardes de journaux inter-réplicas !

Une valeur de configuration de réplica indique une priorité de sauvegarde si vous avez plusieurs réplicas :

BACKUP_PRIORITY = n

n = Valeur entière 0 et 100. 1 indique la priorité la plus faible, 100 la priorité la plus élevée. Si BACKUP_PRIORITY = 0, ce réplica ne sera jamais choisi pour effectuer des sauvegardes.

Vérification d’intégrité

Vous pouvez utiliser le secondaire pour effectuer un DBCC CHECKDB. C’est utile pour toutes les vérifications d’intégrité non physiques. Les vérifications physiques ne présument pas de l’intégrité des pages sur les autres réplicas.

Vous pourriez effectuer un DBCC CHECKDB complet sur le secondaire, et un DBCC CHECKD physique sur le principal :

DBCC CHECKDB WITH PHYSICAL_ONLY

Gestion de la compression

ScénarioCompression par défaut

Réplica synchrone

NON

Réplica asynchrone

OUI

Automatic seeding

NON

Base de données TDE

NON

Activation ou désactivation de la compression

Par drapeau de trace (TF).

TFEffet

1469

Désactive la compression sur les réplicas asynchrones

9567

Active la compression pour l’automatic seeding

9592

Active la compression sur les réplicas synchrones

Pour activer ces drapeaux de trace, faites-le en global

DBCC TRACEON (XXX, -1)

Gestion des logins

Les logins SQL mappés à des users dans la base de données le sont grâce à un SID interne.

Si le SID n’est pas le même sur les serveurs, les users ne seront pas mappés après un basculement.

Il faut créer les logins sur les serveurs avec le même SID pour éviter tout problème. Vous avez deux solutions pour ce faire :

  • CREATE LOGIN avec l’option SID

  • DbaTools – Copy-DbaLogin

CREATE LOGIN avec SID

La commande CREATE LOGIN accepte l’option SID pour passer, sur les réplicas, le SID récupéré sur le réplica où vous avez créé le login SQL. C’est en général le réplica principal, car vous devez avoir accès à la base en lecture-écriture pour y créer le user.

Pour récupérer le SID après création du login, vous pouvez utiliser la fonction SUSER_SID().

SELECT SUSER_SID('nom du login');

Le résultat est converti en représentation hexadécimale par SSMS. Si vous récupérez cette information différemment, vous pourrez la convertir en hexadécimal à partir de sa valeur en VARBINARY à l’aide de la fonction CONVERT().

utilisation des bases contenus

Modifications du groupe de disponibilité

La commande ALTER AVAILABILITY GROUP est très riche et permet la gestion du groupe de disponibilité.

Ajouter de nouvelles bases de données

ALTER AVAILABILITY GROUP Pacha ADD DATABASE database_name;

Ou en PowerShell

Add-SqlAvailabilityDatabase `

-Path SQLSERVER:\SQL\PrimaryServer\InstanceName\AvailabilityGroups\MyAG `

-Database "MyDb"

La base de données ajoutée sera automatiquement copiée en seeding pour tous les réplicas où l’initialisation par défaut est le seeding automatique21https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/automatic-seeding-secondary-replicas.

Permissions ALTER AVAILABILITY GROUP sur le groupe, ou CONTROL AVAILABILITY GROUP, ou ALTER ANY AVAILABILITY GROUP, ou CONTROL SERVER sur l’instance.

Supprimer une base de données

Suppression de la base de données :

ALTER AVAILABILITY GROUP Pacha REMOVE DATABASE database_name;

Ajouter ou retirer un réplica

ALTER AVAILABILITY GROUP Pacha ADD REPLICA ON <server_instance>

WITH

(
ENDPOINT_URL = 'TCP://system-address:port',
AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT | ASYNCHRONOUS_COMMIT | CONFIGURATION_ONLY },
FAILOVER_MODE = { AUTOMATIC | MANUAL }
[ , <add_replica_option> [ ,...n ] ]
)
<add_replica_option>::=
SEEDING_MODE = { AUTOMATIC | MANUAL }
| BACKUP_PRIORITY = n
| SECONDARY_ROLE ( {
[ ALLOW_CONNECTIONS = { NO | READ_ONLY | ALL } ]
[,] [ READ_ONLY_ROUTING_URL = 'TCP://system-address:port' ]
} )
| PRIMARY_ROLE ( {
[ ALLOW_CONNECTIONS = { READ_WRITE | ALL } ]
[,] [ READ_ONLY_ROUTING_LIST = { ( '<server_instance>' [ ,...n ] ) | NONE } ]
[,] [ READ_WRITE_ROUTING_URL = { ( '<server_instance>' ) ]
} )

Donc par exemple, pour ajouter un réplica :

ALTER AVAILABILITY GROUP MyAG ADD REPLICA ON 'SQL03'
   WITH (
         ENDPOINT_URL = 'TCP://SQL03.pachadata.local:5022',
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
         FAILOVER_MODE = MANUAL
         );

Joindre le réplica

Lorsque le réplica est ajouté, vous devez ensuite, à partir de ce réplica, dans SQL Server, joindre ce réplica au groupe de disponibilité23https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/join-a-secondary-replica-to-an-availability-group-sql-server.

Pour activer l’ajout du réplica sur l’instance SQL Server de ce réplica, on utilise la commande JOIN :

ALTER AVAILABILITY GROUP Pacha JOIN;

à lancer donc sur le réplica secondaire.

Gérer les listener

ALTER AVAILABILITY GROUP Pacha

| ADD LISTENER 'dns_name' ( <add_listener_option> )
| MODIFY LISTENER 'dns_name' ( <modify_listener_option> )
| RESTART LISTENER 'dns_name'
| REMOVE LISTENER 'dns_name'
<add_listener_option> ::=
{
WITH DHCP [ ON ( <network_subnet_option> ) ]
| WITH IP ( { ( <ip_address_option> ) } [ , ...n ] ) [ , PORT = listener_port ]
}

Modifier un réplica

| MODIFY REPLICA ON <modify_replica_spec>
<modify_replica_spec>::=
<server_instance> WITH
(
ENDPOINT_URL = 'TCP://system-address:port'
| AVAILABILITY_MODE = { SYNCHRONOUS_COMMIT | ASYNCHRONOUS_COMMIT }
| FAILOVER_MODE = { AUTOMATIC | MANUAL }
| SEEDING_MODE = { AUTOMATIC | MANUAL }
| BACKUP_PRIORITY = n
| SECONDARY_ROLE ( {
ALLOW_CONNECTIONS = { NO | READ_ONLY | ALL }
| READ_ONLY_ROUTING_URL = 'TCP://system-address:port'
} )
| PRIMARY_ROLE ( {
ALLOW_CONNECTIONS = { READ_WRITE | ALL }
| READ_ONLY_ROUTING_LIST = { ( '<server_instance>' [ ,...n ] ) | NONE }
} )
| SESSION_TIMEOUT = seconds
)

Opérations

Basculement planifié

Aller sur le secondaire.

ALTER AVAILABILITY GROUP MonAg FAILOVER;

En PowerShell :

Switch-SqlAvailabilityGroup -Path SQLSERVER:\Sql\SecondaryServer\InstanceName\AvailabilityGroups\MyAg

Basculement forcé

On peut forcer un basculement sur un réplica qui se trouve dans le rôle SECONDARY ou RESOLVING.

Aller sur le secondaire.

ALTER AVAILABILITY GROUP MonAG FORCE_FAILOVER_ALLOW_DATA_LOSS;

En PowerShell :

Switch-SqlAvailabilityGroup `
-Path SQLSERVER:\Sql\SecondaryServer\InstanceName\AvailabilityGroups\MyAg `
-AllowDataLoss

Sur tous les réplicas secondaires restants, chaque base de données secondaire est suspendue jusqu’à ce qu’elle soit reprise manuellement. Lorsque le réplica principal précédent est disponible, il bascule sur le rôle secondaire, et ses bases de données deviennent des bases de données secondaires suspendues24https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/perform-a-forced-manual-failover-of-an-availability-group-sql-server .

Pour reprendre leur synchronisation en tant que rôle secondaire, vous devez reprendre la synchronisation :

ALTER DATABASE PachadataFormation SET HARD RESUME

Suspendre la synchronisation et la reprendre

Vous pouvez suspendre la synchronisation sur une réplica. Lorsque la synchronisation est suspendue sur un réplica, AlwaysOn indique quelle est la raison pour laquelle ce réplica est supendu. Il indique aussi que le réplica est dans un statut NOT_HEALTHY.

Aller sur le secondaire.

Pour suspendre :

ALTER DATABASE PachadataFormation SET HADR SUSPEND

En Powershell :

Suspend-SqlAvailabilityDatabase `
-Path SQLSERVER:\Sql\Computer\Instance\AvailabilityGroups\MyAg\Databases\Pacha

Pour reprendre :

ALTER DATABASE PachadataFormation SET HADR RESUME

En Powershell :

Resume-SqlAvailabilityDatabase `
-Path SQLSERVER:\Sql\Computer\Instance\AvailabilityGroups\MyAg\Databases\Pacha

Modifications de la base

Les modifications des propriétés de la base, comme tout DDL, sont synchronisées sur les secondaires.

La création de nouveau fichier fonctionne, mais le chemin doit exister sur les secondaires.

Fonctions utiles

sys.fn_hadr_is_primary_replica

Fonction scalaire. Retourne 1 si on se trouve sur le réplica principal pour la base de données passée en paramètre.

Permission VIEW SERVER STATE.

sys.fn_hadr_backup_is_preferred_replica

Indique, pour la base de données passée en paramètre, si le réplicas est le réplica préféré pour effectuer les sauvegardes.

sys.fn_hadr_backup_is_preferred_replica ( 'dbname' )

Exemple d’utilisation chez un client, dans une procédure d’archivage automatique :

IF sys.fn_hadr_is_primary_replica('db_prod') <> 1
BEGIN
RAISERROR(N'Not on the primary replica. Stopping', 0, 1) WITH NOWAIT;
EXEC sp_trace_generateevent @event_class = 82,
@userinfo = 'Not on the primary replica. Stopping';
RETURN;
END;

Maintenance des bases de données

La reconstruction d’index (rebuild) peut être interrompue et reprise.

ALTER INDEX { index_name | ALL } ON <object>

{

REBUILD { [ WITH ( <rebuild_index_option> [ ,…​n ] ) ]

}

| ONLINE = { ON [ ( <low_priority_lock_wait> )] | OFF }

| RESUMABLE = { ON | OFF }

| MAX_DURATION = <time> [MINUTES]

| RESUME [WITH (<resumable_index_options>,[…​n])]

| PAUSE

| ABORT

}

[ ; ]

<resumable_index_option> ::=

{

MAXDOP = max_degree_of_parallelism

| MAX_DURATION =<time> [MINUTES]

| <low_priority_lock_wait>

}

<low_priority_lock_wait>::=

{

WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,

ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )

}

Cette option s’applique aux reconstructions d’index en ligne (ONLINE), donc à l’édition Entreprise.

L’opération peut être reprise après une erreur ou une défaillance.

On peut mettre en pause manuellement une opération d’index avec reprise.

L’opération en pause n’empêche pas le journal de transaction de se tronquer.

Limitations

La fonctionnalité de reconstruction d’index avec reprise souffre des limitations suivantes :

  • Elle ne fonctionne que sur les index traditionnels en b-tree, pas sur les index ColumnStore ou XML.

  • Vous ne pouvez pas mentionner l’option SORT_IN_TEMPDB, parce que les pages de tri sont maintenues quand la reconstruction est interrompue, et il faut donc les conserver.

  • Cela ne fonctionne pas sur les index sur des colonnes calculées persistantes. Cela s’explique car lorsqu’une reconstruction est interrompue, SQL Server doit conserver une trace de toutes les modifications opérées sur la colonne indexée.

  • L’index ne peut pas être désactivé (disabled).

  • Vous ne pouvez pas déclencher une reconstruction avec reprise à l’intérieur d’une transaction utilisateur.

Commandes de gestion

PAUSE – mettre en pause une opération de reconstruction d’index en ligne pouvant être reprise.

ABORT – abandonne une opération d’index en cours d’exécution ou en pause qui a été déclarée comme pouvant être reprise. Vous devez exécuter explicitement une commande ABORT pour mettre fin à une opération de reconstruction d’index pouvant être reprise. L’échec ou la mise en pause d’une opération d’index pouvant être reprise n’arrête pas son exécution, mais la laisse dans un état de pause indéterminée.

Considérations

  • Vous pouvez suspendre et redémarrer une opération de création ou de reconstruction d’index à plusieurs reprises en fonction de vos fenêtres de maintenance.

  • Quand une opération d’index est en pause, l’index d’origine et celui qui vient d’être créé nécessitent de l’espace disque et doivent être mis à jour durant les opérations DML.

  • L’interruption permet de « dé-transactionnaliser » l’opération. Vous pouvez donc utiliser ce mécanisme pour permettre de vider le journal de transaction entre deux reprises de l’opération.

  • Microsoft indique qu’il n’y a aucune différence de performances entre l’opération avec reprise et sans reprise. La création d’index pouvant être repris impose une surcharge constante qui entraîne un petit écart de performances par rapport aux autres types d’index. Cette différence n’est sensible que pour les petites tables.

  • Lors de la mise à jour d’un index pouvant être repris alors qu’une opération d’index est en pause : Pour les charges de travail de lecture principalement, l’impact sur les performances est insignifiant. Pour les grosses charges de travail de mise à jour, dégradation du débit (tests de Microsoft : moins de 10 %).

  • Pour les charges de travail de lecture principalement, l’impact sur les performances est insignifiant.

  • Pour les grosses charges de travail de mise à jour, dégradation du débit (tests de Microsoft : moins de 10 %).

  • Microsoft indique qu’il n’y a pas de différence de qualité de défragmentation entre la création ou la reconstruction d’index en ligne avec et sans reprise.

Syntaxes

Reconstruire un index avec possibilité de reprise.

ALTER INDEX index_name ON table

REBUILD WITH (

ONLINE = ON , RESUMABLE ON, MAX_DURATION = X MINUTES

);

Reprendre une reconstruction interrompue.

ALTER INDEX index_name ON table

RESUME WITH (MAX_DURATION = X MINUTES );

Mettre en pause une reconstruction d’index.

ALTER INDEX index_name ON table PAUSE;

Annuler totalement une opération.

ALTER INDEX index_name ON table ABORT;

Option par défaut d’exécution avec reprise, SQL Server 2019

Option disponible en version préliminaire de SQL Server 2019.

Configuration des applications clientes

L’application cliente doit être résiliente pour bénéficier du basculement automatique. Comme un basculement provoque une coupure de connexion, l’objet de connexion de l’application cliente doit implémenter une logique de réessai.

Si vous utiliser une version d’ADO.NET qui contient cette fonctionnalité en préversion, vous devez explicitement activer la fonctionnalité.

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableRetryLogic", true);

Ensuite, dans votre code, vous définissez les paramètre de cette logique de réessai dans l’objet SqlRetryLogicOption.

// Define the retry logic parameters
var options = new SqlRetryLogicOption()
{
// Tries 5 times before throwing an exception
NumberOfTries = 5,
// Preferred gap time to delay before retry
DeltaTime = TimeSpan.FromSeconds(1),
// Maximum gap time for each delay time before retry
MaxTimeInterval = TimeSpan.FromSeconds(20)
};

Vous créez ensuite un fournisseur SqlRetryLogicBaseProvider, comme indiqué dans le code suivant.

// Create a retry logic provider
SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
Assign the SqlRetryLogicBaseProvider instance to the SqlConnection.RetryLogicProvider or SqlCommand.RetryLogicProvider.
In this sample, the connection open command will retry if it hits one of the transient errors in the SqlConfigurableRetryFactory internal list for a maximum of five times.
// Assumes that connection is a valid SqlConnection object
// Set the retry logic provider on the connection instance
connection.RetryLogicProvider = provider;
// Establishing the connection will retry if a transient failure occurs.
connection.Open();

Gestion des performances

Configurations de portée base de données

Depuis SQL Server 2016, un certain nombre de configurations auparavant non disponibles ou disponibles seulement à travers des drapeaux de trace (trace flag), sont disponibles clairement, par des options de configuration explicites, au niveau de la base de données.
La configuration est bien entendu contenue dans les métadonnées de la base de données, et sera donc conservée lors d’une sauvegarde et d’une restauration.

Syntaxe et permissions

ALTER DATABASE SCOPED CONFIGURATION

{

{ [ FOR SECONDARY] SET <set_options>}

}

| CLEAR PROCEDURE_CACHE

| SET < set_options >

[;]

< set_options > ::=

{

MAXDOP = { <value> | PRIMARY}

| LEGACY_CARDINALITY_ESTIMATION = { ON | OFF | PRIMARY}

| PARAMETER_SNIFFING = { ON | OFF | PRIMARY}

| QUERY_OPTIMIZER_HOTFIXES = { ON | OFF | PRIMARY}

| IDENTITY_CACHE = { ON | OFF }

| OPTIMIZE_FOR_AD_HOC_WORKLOADS = { ON | OFF }

| XTP_PROCEDURE_EXECUTION_STATISTICS = { ON | OFF }

| XTP_QUERY_EXECUTION_STATISTICS = { ON | OFF }

| ELEVATE_ONLINE = { OFF | WHEN_SUPPORTED | FAIL_UNSUPPORTED }

| ELEVATE_RESUMABLE = { OFF | WHEN_SUPPORTED | FAIL_UNSUPPORTED }

| GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

}

Différences sur le secondaire

FOR SECONDARY – Spécifie les paramètres pour les bases de données secondaires AlwaysOn ouverts en lecture seule. Toutes les bases de données secondaires auront la même valeur, on ne peut pas attribuer une valeur à un secondaire spécifique.

Si vous utilisez l’option FOR SECONDARY, la valeur de configuration peut aussi être PRIMARY, Cela signifie que la valeur pour les réplicas secondaires suivra dynamiquement la valeur du réplica principal.

Supervision

Compteurs de performances

Perfmon : SQLServer:Availability Replica
Bytes Received / sent
Messages Received / sent

Surveiller les parallel redo

Worker threads sur le secondaire

Pour connaître le nombre de worker threads actuels sur le secondaire :
SELECT SUM(dos.current_workers_count) as [workers]
FROM sys.dm_os_schedulers dos
WHERE dos.status = 'VISIBLE ONLINE';

Surveillance par DMV

Santé des réplicas

SELECT sadc.database_name,
ag.name AS ag_name,
dhrs.is_local,
dhrs.is_primary_replica,
dhrs.synchronization_state_desc,
dhrs.is_commit_participant,
dhrs.synchronization_health_desc
FROM sys.dm_hadr_database_replica_states AS dhrs
INNER JOIN sys.availability_databases_cluster AS sadc ON dhrs.group_id = sadc.group_id AND dhrs.group_database_id = sadc.group_database_id
INNER JOIN sys.availability_groups AS ag ON ag.group_id = dhrs.group_id
INNER JOIN sys.availability_replicas AS sar ON dhrs.group_id = sar.group_id
AND dhrs.replica_id = sar.replica_id;

Surveillance de la latence

Vous pouvez considérer trois types de latence :

  • La latence de copie des données en asynchrone ;

  • la latence transactionnelle en synchrone ;

  • la latence des opérations de REDO sur les réplicas ouverts en lecture seule.

Latence des REDO

La latence des REDO peut se mesurer sur les valeurs présentes dans la DMV sys.dm_hadr_database_replica_states. Les colonnes suivantes sont utiles :

Diagnostic

Basculements

Vous trouvez une requête d’historique de basculement à l’adresse suivante : https://github.com/rudi-bruchez/tsql-scripts/blob/master/hadr/failover-times.sql.

ERRORLOG

Indications intéressantes, à surveiller.

(Get-SQLErrorLog -Server SERVER/INSTANCE).Where{$_.Message -like '*Resolving*' -or $_.Message -like '*Failover*'}

Journal du cluster et verbosité

Les évènements d’AlwaysOn liés au cluster Windows (WSFC) sont journalisés dans le journal du cluster (cluster.log) que vous pouvez extraire à l’aide de commandes Windows ou Powershell (voir section « Interroger le log de WSFC », page 47).

Les évènements propres aux ressources AlwaysOn sont marquées [hadrag]. Elles sont aussi marquées [RES] pour indiquer qu’il s’agit d’un message provenant d’une ressource.

Exemple de message obtenu sur le journal de cluster d’un client :

00002bcc.00002940::2022/01/20-12:10:56.787 INFO  [RES] SQL Server Availability Group: [hadrag] SQL Server component 'query_processing' health state has been changed from 'clean' to 'warning' at 2022-01-20 12:10:56.770

Les types de messages sont en général INFO ou ERR.

Verbosité

Au besoin, vous pouvez augmenter le niveau de détail (de verbosité) de cette journalisation pour un groupe de disponibilité.

Vous pouvez le faire dans le gestionnaire de cluster, dans les propriétés de la ressource du groupe de disponibilité, sur l’onglet Propriétés.

L’option s’appelle VerboseLogging et sa valeur par défaut est 0.

Pour que l’option soit prise en compte, il faut mettre la ressource hors connexion, et en ligne à nouveau.

Évènements étendus

alwaysOn_health

Messages cryptiques

Messages de ce type :

2021-12-13 18:15:23.18 spid136s    DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint: 10D71626-3152-495C-9676-1322F7A88437:4
2021-12-13 18:15:23.19 spid136s    DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint: 10D71626-3152-495C-9676-1322F7A88437:1
2021-12-13 18:15:23.19 spid136s    DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint: 10D71626-3152-495C-9676-1322F7A88437:1
2021-12-13 18:15:23.19 spid136s    DbMgrPartnerCommitPolicy::SetSyncState: 10D71626-3152-495C-9676-1322F7A88437:1
  1. This message indicates the Synchronization state of an AlwaysOn partner: thus the " DbMgrPartnerCommitPolicy::SetSyncState"

  2. The long pointer-formatted hexadecimal number after the colon (:) is a pointer (memory address) to one of the AlwaysOn partners.

In the example above the value is 00000026BD96D330.

It certainly remains a mystery though which partner it is. This is not the GUID replica ID that is stored in many DMVs like sys.dm_hadr_database_replica_states. It is a memory address, so it is not particularly useful.

  1. The last component is the integer value at the end (one following the second colon). In this case the number is 4.

Here are the possible states:

0 - Not Joined to AG

1 - Not Synchronized

2 - Suspended

4 - Synchronized

8 - Redo (redoing log)

DMV pour le cluster

Une collection de requêtes de diagnostic est disponible à l’adresse suivante : https://github.com/rudi-bruchez/tsql-scripts/blob/master/hadr/alwayson-statuts.sql

sys.dm_hadr_cluster

Informations sur le cluster WSFC.

SELECT

c.cluster_name,

c.quorum_type_desc as quorum_type,

c.quorum_state_desc as quorum_state

FROM sys.dm_hadr_cluster c;

sys.dm_hadr_cluster_members

État du cluster.

SELECT

cm.member_name,

cm.member_type_desc as member_type,

cm.member_state_desc as member_state,

cm.number_of_quorum_votes

FROM sys.dm_hadr_cluster_members cm;

sys.dm_hadr_cluster_networks

DMV pour les endpoints

Métadonnées des endpoints

SELECT type_desc, port
FROM sys.tcp_endpoints
WHERE type_desc = 'DATABASE_MIRRORING';
SELECT type_desc, state_desc, role_desc, is_encryption_enabled
FROM sys.database_mirroring_endpoints;

sys.dm_tcp_listener_states

SELECT *
FROM sys.dm_tcp_listener_states
WHERE type_desc = 'DATABASE_MIRRORING';

Permissions

SELECT
e.name,

sp.state,

SUSER_NAME(SP.grantor_principal_id) as grantor,

sp.type as permission,

SUSER_NAME(SP.grantee_principal_id) as grantee

FROM sys.server_permissions sp
JOIN sys.endpoints e ON sp.major_id = e.endpoint_id
WHERE e.type_desc = 'DATABASE_MIRRORING'
ORDER BY permission, grantor, grantee;

DMV pour AlwaysOn

Métadonnées des AG

SELECT
g.name,

g.failure_condition_level,

g.health_check_timeout,

g.automated_backup_preference_desc as [automated_backup_preference],

gs.primary_recovery_health_desc as [primary_health],

gs.primary_replica,

gs.secondary_recovery_health_desc as [secondary_health],

gs.synchronization_health_desc as [synchronization_health]

FROM sys.availability_groups g
JOIN sys.dm_hadr_availability_group_states gs ON g.group_id = gs.group_id

Métadonnées des réplicas

SELECT

g.name as AG,

ar.replica_server_name,

ar.availability_mode_desc as [availability_mode],

ar.failover_mode_desc as [failover_mode],

ar.session_timeout,

ar.primary_role_allow_connections_desc as [primary_role_allow_connections],

ar.secondary_role_allow_connections_desc as [secondary_role_allow_connections],

CAST(ar.create_date as datetime2(0)) as create_date,

CAST(ar.modify_date as datetime2(0)) as modify_date,

ar.backup_priority,

ar.read_only_routing_url

FROM sys.availability_replicas ar
JOIN sys.availability_groups g ON ar.group_id = g.group_id
ORDER BY g.name, ar.replica_server_name;

Métadonnées des listeners

SELECT

g.name as AG,

agl.dns_name,

agl.is_conformant,

agl.port,

agl.ip_configuration_string_from_cluster,

aglip.ip_address,

aglip.ip_subnet_mask,

aglip.is_dhcp,

aglip.network_subnet_ip,

aglip.network_subnet_ipv4_mask,

aglip.network_subnet_prefix_length,

aglip.state_desc

FROM sys.availability_group_listeners agl
JOIN sys.availability_group_listener_ip_addresses aglip ON agl.listener_id = aglip.listener_id
JOIN sys.availability_groups g ON agl.group_id = g.group_id
ORDER BY g.name, agl.dns_name;

Métadonnées de routing

SELECT

g.name as AG,

ar.replica_server_name as [Replica],

ar2.replica_server_name as ReadOnly_Replica,

rorl.routing_priority

FROM sys.availability_read_only_routing_lists rorl
JOIN sys.availability_replicas ar ON rorl.replica_id = ar.replica_id
LEFT JOIN sys.availability_replicas ar2 ON rorl.read_only_replica_id = ar2.replica_id
JOIN sys.availability_groups g ON ar.group_id = g.group_id
ORDER BY g.name, ar.replica_server_name;

Métadonnées de bases dans les groupes

SELECT
g.name as AG,

dc.database_name,

dc.truncation_lsn

FROM sys.availability_databases_cluster dc
JOIN sys.availability_groups g ON dc.group_id = g.group_id
ORDER BY g.name, dc.database_name;

Informations sur les bases jointes

SELECT
g.name as AG,

ar.replica_server_name as [Replica],

rcs.database_name,

rcs.is_database_joined,

rcs.is_failover_ready,

rcs.is_pending_secondary_suspend,

rcs.truncation_lsn

FROM sys.dm_hadr_database_replica_cluster_states rcs
JOIN sys.availability_replicas ar ON rcs.replica_id = ar.replica_id
JOIN sys.availability_groups g ON ar.group_id = g.group_id
ORDER BY g.name, ar.replica_server_name, rcs.database_name;

Informations sur les pages auto-réparées

SELECT
DB_NAME(apr.database_id) as [database],

apr.file_id,

apr.page_id,

apr.error_type,

apr.page_status,

apr.modification_time

FROM sys.dm_hadr_auto_page_repair apr
ORDER BY [database];

sys.dm_hadr_database_replica_cluster_states

Donne l’état des réplicas.

sys.dm_hadr_database_replica_states

Retourne une ligne pour chaque base de données qui participe à un groupe de disponibilité pour lequel l’instance locale de SQL Server héberge un réplica.

last_sent_time – le dernier bloc de log envoyé sur le principal. Début de la synchro

last_received_time – le dernier bloc de log reçu par le secondaire

last_hardened_time – le dernier bloc de log écrit par le secondaire depuis le cache sur le disque

last_redone_time – le temps du dernier REDO sur le secondaire

last_commit_time – dernier commit du secondaire reporté au principal

Requête de statut des réplicas

SELECT
g.name as AG,

ar.replica_server_name as [Replica],

rs.is_local,

rs.role_desc as role,

rs.operational_state_desc as operational_state,

rs.connected_state_desc as connected_state,

rs.recovery_health_desc as recovery_health,

rs.synchronization_health_desc as synchronization_health

FROM sys.dm_hadr_availability_replica_states rs
JOIN sys.availability_replicas ar ON rs.replica_id = ar.replica_id
JOIN sys.availability_groups g ON ar.group_id = g.group_id
ORDER BY g.name, ar.replica_server_name, rs.role;

sys.dm_hadr_availability_replica_cluster_nodes

SELECT
cn.*,
cs.join_state_desc as join_state
FROM sys.dm_hadr_availability_replica_cluster_nodes cn

JOIN sys.dm_hadr_availability_replica_cluster_states cs

ON cn.replica_server_name = cs.replica_server_name;

sys.dm_hadr_availability_group_states

Donne le statut des groupes de disponibilité.

sys.dm_hadr_availability_replica_states

Donne le statut des réplicas.

According to MSDN documentation, suspend_reason in sys.dm_hadr_database_replica_states has below values

0 = User action

1 = Suspend from partner

2 = Redo

3 = Apply

4 = Capture

5 = Restart

6 = Undo

7 = Revalidation

8 = Error in the calculation of the secondary-replica synchronization point

was confirmed from other resource that The doc has "capture" and "apply" flipped, it should be:

0=USER

1=PARTNER

2=REDO

3=CAPTURE

4=APPLY

5=RESTART

6=UNDO

7=REVALIDATION

8=Error in calculation

and suspend_reason_desc

SUSPEND_FROM_USER = A user manually suspended data movement

SUSPEND_FROM_PARTNER = The database replica is suspended after a forced failover

SUSPEND_FROM_REDO = An error occurred during the redo phase

SUSPEND_FROM_APPLY = An error occurred when writing the log to file (see error log)

SUSPEND_FROM_CAPTURE = An error occurred while capturing log on the primary replica

SUSPEND_FROM_RESTART = The database replica was suspended before the database was restarted (see error log)

SUSPEND_FROM_UNDO = An error occurred during the undo phase (see error log)

SUSPEND_FROM_REVALIDATION = Log change mismatch is detected on reconnection (see error log)

SUSPEND_FROM_XRF_UPDATE = Unable to find the common log point (see error log)

sys.dm_tcp_listener_states

Donne le statut des listeners.

Problématiques courantes

Réplica déconnecté

C’est la commande à essayer si un réplica est dans un état déconnecté, essayez de redémarrer votre endpoint :

use master
alter endpoint endpoint_name state = stopped;
alter endpoint endpoint_name state = started;

Réplica hors connexion

Si un réplica secondaire est hors connexion, le principal passe automatiquement en mode asynchrone après la période de timeout, configurable par réplica. Le défaut est de dix secondes.

Le principal doit conserver toutes les opérations transactionnelles dans son journal, pour les envoyer au secondaire lorsque celui-ci sera disponible à nouveau.

Si le réplica reste trop longtemps hors connexion, le journal de transactions du principal risque de remplir le disque.

Vous ne pouvez pas vider le journal de transaction du principal, tant que le réplica secondaire ne peut pas se synchroniser. Le seul moyen de vous en sortir est de sortir le réplica du groupe de disponibilité.

ALTER AVAILABILITY GROUP [Pacha] REMOVE REPLICA ON N'SQL02';

Quand le réplica sera à nouveau disponible, vous pouvez l’ajouter à nouveau dans le groupe de disponibilité.

Les bases sur le réplica secondaire, devront être en restauration (Restoring, ou Recovery). Si ce n’est pas le cas, sur le réplica secondaire, supprimez le groupe de disponibilité :

DROP AVAILABILITY GROUP [Pacha];

Vous avez alors deux solutions pour reprendre la synchronisation :

  • vous pouvez supprimer au préalable la base sur le secondaire, et la réinitialiser en utilisant le seeding automatique. C’est la solution la plus simple si la base est de taille raisonnable.

  • Si la base est volumineuse, vous pouvez restaurer les sauvegardes de journaux de transactions sur les bases du réplica secondaire, pour l’initialiser au plus près dans le temps, et reprendre une synchronisation sans initialisation.

Synchronisation suspendue

Si la synchrnoisation d’un réplica est suspendue, vous pouvez savoir pourquoi en utilisant la DMV sys.dm_hadr_database_replica_states. La colonne is_suspended indique que la synchronisation sur cette base de ce réplica est suspendue, et les colonnes suspend_reason et suspend_reason_desc donnent plus d’information.

Valeurs de suspend_reason :

0User action

1

Suspend from partner

2

Redo

3

Capture

4

Apply

5

Restart

6

Undo

7

Revalidation

8

Error in the calculation of the secondary-replica synchronization point

Explication des cas :

0, SUSPEND_FROM_USERLa synchronisation a été manuellement suspendue en utilisant la commande ALTER DATABASE nom_base_de_données SET HADR SUSPEND; 25https://learn.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/suspend-an-availability-database-sql-server https://learn.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/suspend-an-availability-database-sql-server

1

Suspend from partner

2

Redo

3

Capture

4

Apply

5

Restart

6

Undo

7

Revalidation

8

Error in the calculation of the secondary-replica synchronization point

A user manually suspended data movement

SUSPEND_FROM_PARTNER = The database replica is suspended after a forced failover

SUSPEND_FROM_REDO = An error occurred during the redo phase

SUSPEND_FROM_APPLY = An error occurred when writing the log to file (see error log)

SUSPEND_FROM_CAPTURE = An error occurred while capturing log on the primary replica

SUSPEND_FROM_RESTART = The database replica was suspended before the database was restarted (see error log)

SUSPEND_FROM_UNDO = An error occurred during the undo phase (see error log)

SUSPEND_FROM_REVALIDATION = Log change mismatch is detected on reconnection (see error log)

SUSPEND_FROM_XRF_UPDATE = Unable to find the common log point (see error log)

Problèmes de lease

Le réplica principal maintient un bail, un « lease » avec WSFC. Il s’agit d’une communication régulière, une forme de ping, entre la DLL de ressource de WFSC et l’instance du réplica principal du groupe de disponibilité, sur le même nœud. Il s’agit donc d’une communication locale. Ce mécanisme offre une sécurité supplémentaire pour éviter le split brain. Seul le réplica principal maintient un bail avec le cluster.

Ce système de bail est indépednant du réseau. Il met en place une communication directe entre le gestionnaire de ressources de WSFC (RHS.exe) et SQL Server.

Si ce bail arrive à expiration, AlwaysOn perd son intégrité, et les secondaires peuvent arrêter de se synchroniser.

C’est un cas assez courant de problématique sur AlwaysOn.

Le lease timeout est à défaut à 20 secondes. Cela peut ne pas être suffisant, par exemple dans les AG créés sur Azures avec des zones différentes. Un lease timeout à 30 secondes améliore souvent les choses.

Pour changer le délai de bail :

Dans le gestionnaire de cluster de basculement, dans l’onglet Rôles, recherchez le rôle de groupe de disponibilité cible. Cliquez sur le rôle.

Cliquez avec le bouton droit sur la ressource Groupe de disponibilité au bas de la fenêtre, puis sélectionnez Propriétés.

Dans la fenêtre contextuelle, accédez à l’onglet Propriétés pour voir la liste des valeurs spécifiques au groupe de disponibilité. Cliquez sur la valeur LeaseTimeout pour la modifier.

La nouvelle valeur de la propriété « LeaseTimeout » prend effet une fois que la ressource est mise hors connexion puis remise en ligne.

Journaux de transaction des réplicas secondaires

Pour enlever une transaction du journal du principal, tous les REDO doivent être effectués

À la merci du réplica en lecture le plus lent

log_reuse_wait_desc = AVAILABILITY_REPLICA

SQL Server:Database Replica > Redo Bytes Remaining

Si un secondaire est NOT SYNCHRONIZING

Synchrone passe en asynchrone

Le secondaire est suspendu.

Nombre de threads de REDO

Si vous avez de multiples bases de données en AG, et que les REDO en parallèle sont activés, vous pourriez arriver à la limite de vos threads disponibles.

Si c’est le cas, vous devez ajuster la valeur de l’option MAX WORKER THREADS de l’instance.

Cas spéciaux

Multiples sous-réseaux

Si vos réplicas sont sur des sous-réseaux différents, vous devez définir une adresse IP par sous-réseau sur votre listener : un VNN, plusieurs VIP.

En cas de problème de connectivité dû à plusieurs adresses IP, référez-vous à cet article : https://www.mssqltips.com/sqlservertip/3422/how-to-resolve-connectivity-issues-with-sql-server-availability-groups/ .

MultiSubnetFailover=True

Si la recherche DNS du VNN retourne plusieurs adresses IP, comme c’est le cas dans une configuration de sous-réseaux, le client va essayer une adresse IP à la fois en round robin. Si vous spécifiez l’option MultiSubnetFailover=True dans la chaîne de connexion, les adresses IP sous toutes essayées simultanément.

MultiSubnetFailover :

  • Ne supporte pas les hostnames de plus de 64 caractères ;

  • est supporté en TCP seulement ;

  • ne peut pas se connecter sur une instance nommée. On l’utilise dans ce cas sur le listener, pas sur une adresse directe d’instance nommée.

AG + FCI

Dans le même WSFC

Pas de basculement automatique de l’AG

Un seul réplica

Plutôt en reprise sur incident

AG + Réplication

RéplicationÉditeurDistributeurAbonné

Transactionnelle

OUI

NON

Oui (sans basculement automatique)

Fusion

OUI

NON

Oui (sans basculement automatique)

Snapshot

OUI

NON

Oui (sans basculement automatique)

Une base de données de publication peut faire partie d’un groupe de disponibilité et partager un serveur de distribution commun

Un serveur secondaire AlwaysOn ne peut pas être un serveur de publication

Les publications transactionnelles point-à-point et bidirectionnelles ne sont pas prises en charge.

Une base de données pour laquelle la capture de données modifiées est activée peut faire partie d’un groupe de disponibilité.

Quatre nouvelles procédures stockées assurent la prise en charge de la réplication AlwaysOn.

  • sp_redirect_publisher

  • sp_get_redirected_publisher

  • sp_validate_redirected_publisher

  • sp_validate_replica_hosts_as_publishers

Événements étendus de réplication

La réplication prend en charge les événements étendus ; Mais pour l’instant, cette fonctionnalité est réservée à un usage interne.

Problèmes de synchronisation de la réplication suir des réplicas asynchrones.

Base de données en TDE

Supporté. Il faut copier le certificat dans la base master des réplicas.

Voici un exemple :

On doit d’abord créer la master key dans Master, et un certificat de chiffrement sur le serveur de la base principale (base non encore ajoutée à un groupe de disponibilité).

USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'coucou';
go
CREATE CERTIFICATE tdePacha WITH SUBJECT = 'tde pour pacha';
go

Ensuite, on chiffre la base de données :

USE PachaDataSecurise
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE tdePacha;
GO
ALTER DATABASE PachaDataSecurise
SET ENCRYPTION ON;
GO

On vérifie que la base de données est entièrement chiffrée (le chiffrement en tâche de fond est terminé) :

SELECT *
FROM sys.dm_database_encryption_keys

On sauvegarde le certificat, qu’on va copier sur le serveur secondaire (les deux fichiers : clé publique et clé privée) ;

BACKUP CERTIFICATE tdePacha
TO FILE = 'c:\sqldata\pacha.cer'
WITH PRIVATE KEY
(
FILE ='c:\sqldata\pacha.key',
ENCRYPTION BY PASSWORD ='coucou'
)

Sur le secondaire, vous devez restaurer le certificat :

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'coucou';
go

CREATE CERTIFICATE tdePacha
FROM FILE = 'c:\sqldata\pacha.cer'
WITH PRIVATE KEY
(
FILE ='c:\sqldata\pacha.key',
DECRYPTION BY PASSWORD ='coucou'
)

Enfin, sur le principal, vous pouvez ajouter la base au groupe de disponibilité. Si vous êtes en amorçage automatique, rien de plus à faire :

ALTER AVAILABILITY GROUP pacha2
ADD DATABASE [PachaDataSecurise]

Utiliser AlwaysOn sans cluster

SQL Server 2017 ajoute une option supplémentaire pour les groupes de disponibilités AlwaysOn. Nous pouvons maintenant créer un groupe de disponibilité sans cluster sous-jacent. La fonctionnalité est appelée en anglais clusterless. Cela vous permet de bénéficier de la copie d’une base de données vers un secondaire sans avoir besoin d’une architecture de basculement et de redirection des clients. Cela peut vous servir à créer un secondaire ouvert en lecture pour des rapports, ou à maintenir un environnement de secours dans le cadre d’un plan de PRA (Plan de Reprise d’Activité) ou PCA (Plan de Continuité d’Activité).

Vous pouvez aussi l’utiliser dans un scénario de migration.

Cela signifie également que vous n’avez pas besoin d’être dans un domaine, ce qui est pratique pour un PRA. La capacité de créer un groupe de disponibilité sans domaine existe déjà grâce aux possibilités de WSFC, mais dans le cas d’un groupe de disponibilité clusterless, c’est encore plus facile à mettre en place.

L’unique complexité vient de la configuration de la sécurité des points de terminaison pour la communication entre les nœuds. Cela doit se faire à l’aide de certificats échangés entre les nœuds.

Vous avez le droit de faire un basculement manuel entre les réplicas.

Création du groupe de disponibilité

La commande CREATE AVAILABILTY GROUP est enrichie de la façon suivante.

CREATE AVAILABILITY GROUP group_name

WITH ( CLUSTER_TYPE = { WSFC | EXTERNAL | NONE } )

La vue de catalogue sys.availability_groups est enrichie de deux nouvelles colonnes :

SELECT

name,

cluster_type,

cluster_type_desc

FROM sys.availability_groups;