CREATE ENDPOINTAlwaysOn Availability Groups (AG)
44 minutes à lire
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
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
| État | Description |
|---|---|
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 :
| timestamp | current_state | previous_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 PachadataFormationConfiguration 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);Utiliser Powershell
Les différentes cmdlet sont documentées ici : https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/create-an-availability-group-sql-server-powershell.
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 DATABASEActivation 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 NULLSuivi 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
GOName 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
Les sauvegardes peuvent être faites à partir d’un réplica20https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/active-secondaries-backup-on-secondary-replicas-always-on-availability-groups .
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_ONLYGestion de la compression
| Scénario | Compression 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).
| TF | Effet |
|---|---|
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
La commande est assez simple22https://docs.microsoft.com/fr-fr/sql/database-engine/availability-groups/windows/add-a-secondary-replica-to-an-availability-group-sql-server.
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
Utilisation du dashboard
Basculement planifié
Aller sur le secondaire.
ALTER AVAILABILITY GROUP MonAg FAILOVER;En PowerShell :
Switch-SqlAvailabilityGroup -Path SQLSERVER:\Sql\SecondaryServer\InstanceName\AvailabilityGroups\MyAgBasculement 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 `
-AllowDataLossSur 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 RESUMESuspendre 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 SUSPENDEn Powershell :
Suspend-SqlAvailabilityDatabase `
-Path SQLSERVER:\Sql\Computer\Instance\AvailabilityGroups\MyAg\Databases\PachaPour reprendre :
ALTER DATABASE PachadataFormation SET HADR RESUMEEn Powershell :
Resume-SqlAvailabilityDatabase `
-Path SQLSERVER:\Sql\Computer\Instance\AvailabilityGroups\MyAg\Databases\PachaModifications 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.
Mise à jour des versions de SQL Server
Application de patchs (CU)
Ajouter un nouveau nœud
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 / sentSurveiller 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.770Les 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:1This message indicates the Synchronization state of an AlwaysOn partner: thus the " DbMgrPartnerCommitPolicy::SetSyncState"
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.
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_idMé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.
Documentation : https://docs.microsoft.com/fr-fr/sql/relational-databases/system-dynamic-management-views/sys-dm-hadr-database-replica-states-transact-sql
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 disponible à l’adresse suivante : https://github.com/rudi-bruchez/tsql-scripts/blob/master/hadr/database-replica-states.sql
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 cnJOIN 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;Comme indiqué dans l’aide suivante : https://docs.microsoft.com/fr-FR/troubleshoot/sql/database-mirroring/mirrored-databases-disconnected.
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 :
| 0 | User 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_USER | La 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. |
|---|
Gestion de la session
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.
groupe de disponibilité distribué
Prise en charge des transactions distribuées
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 | Éditeur | Distributeur | Abonné |
|---|---|---|---|
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.
Voir cet article pour plus de détails : https://www.red-gate.com/simple-talk/sql/database-administration/expanding-alwayson-availability-groups-with-replication-publishers/
Problèmes de synchronisation de la réplication suir des réplicas asynchrones.
AG et Service Broker
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';
goEnsuite, 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;
GOOn 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_keysOn 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;