Prise en main de la copie des journaux de transaction sur Linux
S’applique à : SQL Server - Linux
La copie des journaux de transaction SQL Server est une configuration à haute disponibilité où une base de données d’un serveur principal est répliquée sur un ou plusieurs serveurs secondaires. La copie des journaux de transaction permet aux fichiers de sauvegarde de la base de données source de restaurer sur le serveur secondaire. Ensuite, le serveur principal crée régulièrement des sauvegardes du journal des transactions et les serveurs secondaires les restaurent, en mettant à jour la copie secondaire de la base de données.
Comme décrit dans le diagramme précédent, une session de copie des journaux de transaction comprend les étapes suivantes :
- Sauvegarde du fichier des journaux des transactions au niveau de l'instance principale
- Copie du fichier de sauvegarde du journal des transactions sur le réseau vers une ou plusieurs instances secondaires
- Restauration du fichier de sauvegarde du journal des transactions sur les instances secondaires
Conditions préalables requises
Configurer un partage réseau pour la copie des journaux de transaction à l’aide de CIFS
Remarque
Ce didacticiel utilise CIFS + Samba pour configurer le partage réseau.
Configurer le serveur principal
Installez Samba avec la commande suivante :
Pour Red Hat Enterprise Linux (RHEL) :
sudo yum -y install samba
Pour Ubuntu :
sudo apt-get install samba
Créez un répertoire pour stocker les journaux de la copie des journaux de transaction et accordez à
mssql
les autorisations requises :mkdir /var/opt/mssql/tlogs chown mssql:mssql /var/opt/mssql/tlogs chmod 0700 /var/opt/mssql/tlogs
Modifiez le fichier
/etc/samba/smb.conf
(vous avez besoin d’autorisations racine) et ajoutez la section suivante :[tlogs] path=/var/opt/mssql/tlogs available=yes read only=yes browsable=yes public=yes writable=no
Créer un utilisateur
mssql
pour Samba :sudo smbpasswd -a mssql
Redémarrer les services Samba :
sudo systemctl restart smbd.service nmbd.service
Configurer le serveur secondaire
Installez le client CIFS avec la commande suivante :
Pour RHEL :
sudo yum -y install cifs-utils
Pour Ubuntu :
sudo apt-get install cifs-utils
Créez un fichier pour stocker vos informations d’identification. Dans cet exemple, nous utilisons
/var/opt/mssql/.tlogcreds
. Utilisez le mot de passe que vous avez récemment défini pour votre compte Sambamssql
, puis remplacez<domain>
:username=mssql domain=<domain> password=<password>
Exécutez les commandes suivantes pour créer un répertoire vide pour le montage et définir l’autorisation et de la propriété correctement
mkdir /var/opt/mssql/tlogs sudo chown root:root /var/opt/mssql/tlogs sudo chmod 0550 /var/opt/mssql/tlogs sudo chown root:root /var/opt/mssql/.tlogcreds sudo chmod 0660 /var/opt/mssql/.tlogcreds
Ajouter la ligne à etc/fstab pour conserver le partage. Remplacez
<ip_address_of_primary_server>
par la valeur appropriée ://<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
Monter les partages :
sudo mount -a
Configurez la copie des journaux de transaction à l’aide de Transact-SQL
Sauvegardez la base de données sur le serveur primaire :
BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak' GO
Configurez la copie des journaux de transaction sur le serveur principal :
DECLARE @LS_BackupJobId AS UNIQUEIDENTIFIER; DECLARE @LS_PrimaryId AS UNIQUEIDENTIFIER; DECLARE @SP_Add_RetCode AS INT; EXECUTE @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database @database = N'SampleDB', @backup_directory = N'/var/opt/mssql/tlogs', @backup_share = N'/var/opt/mssql/tlogs', @backup_job_name = N'LSBackup_SampleDB', @backup_retention_period = 4320, @backup_compression = 2, @backup_threshold = 60, @threshold_alert_enabled = 1, @history_retention_period = 5760, @backup_job_id = @LS_BackupJobId OUTPUT, @primary_id = @LS_PrimaryId OUTPUT, @overwrite = 1; IF (@@ERROR = 0 AND @SP_Add_RetCode = 0) BEGIN DECLARE @LS_BackUpScheduleUID AS UNIQUEIDENTIFIER; DECLARE @LS_BackUpScheduleID AS INT; EXECUTE msdb.dbo.sp_add_schedule @schedule_name = N'LSBackupSchedule', @enabled = 1, @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @freq_recurrence_factor = 0, @active_start_date = 20170418, @active_end_date = 99991231, @active_start_time = 0, @active_end_time = 235900, @schedule_uid = @LS_BackUpScheduleUID OUTPUT, @schedule_id = @LS_BackUpScheduleID OUTPUT; EXECUTE msdb.dbo.sp_attach_schedule @job_id = @LS_BackupJobId, @schedule_id = @LS_BackUpScheduleID; EXECUTE msdb.dbo.sp_update_job @job_id = @LS_BackupJobId, @enabled = 1; END EXECUTE master.dbo.sp_add_log_shipping_alert_job; EXECUTE master.dbo.sp_add_log_shipping_primary_secondary @primary_database = N'SampleDB', @secondary_server = N'<ip_address_of_secondary_server>', @secondary_database = N'SampleDB', @overwrite = 1;
Restaurez la base de données sur le serveur secondaire :
RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak' WITH NORECOVERY;
Configurez la copie des journaux de transaction sur le serveur secondaire :
DECLARE @LS_Secondary__CopyJobId AS UNIQUEIDENTIFIER; DECLARE @LS_Secondary__RestoreJobId AS UNIQUEIDENTIFIER; DECLARE @LS_Secondary__SecondaryId AS UNIQUEIDENTIFIER; DECLARE @LS_Add_RetCode AS INT; EXECUTE @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary @primary_server = N'<ip_address_of_primary_server>', @primary_database = N'SampleDB', @backup_source_directory = N'/var/opt/mssql/tlogs/', @backup_destination_directory = N'/var/opt/mssql/tlogs/', @copy_job_name = N'LSCopy_SampleDB', @restore_job_name = N'LSRestore_SampleDB', @file_retention_period = 4320, @overwrite = 1, @copy_job_id = @LS_Secondary__CopyJobId OUTPUT, @restore_job_id = @LS_Secondary__RestoreJobId OUTPUT, @secondary_id = @LS_Secondary__SecondaryId OUTPUT IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) BEGIN DECLARE @LS_SecondaryCopyJobScheduleUID AS UNIQUEIDENTIFIER; DECLARE @LS_SecondaryCopyJobScheduleID AS INT; EXECUTE msdb.dbo.sp_add_schedule @schedule_name = N'DefaultCopyJobSchedule', @enabled = 1, @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @freq_recurrence_factor = 0, @active_start_date = 20170418, @active_end_date = 99991231, @active_start_time = 0, @active_end_time = 235900, @schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT, @schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT; EXECUTE msdb.dbo.sp_attach_schedule @job_id = @LS_Secondary__CopyJobId, @schedule_id = @LS_SecondaryCopyJobScheduleID; DECLARE @LS_SecondaryRestoreJobScheduleUID AS UNIQUEIDENTIFIER; DECLARE @LS_SecondaryRestoreJobScheduleID AS INT; EXECUTE msdb.dbo.sp_add_schedule @schedule_name = N'DefaultRestoreJobSchedule', @enabled = 1, @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @freq_recurrence_factor = 0, @active_start_date = 20170418, @active_end_date = 99991231, @active_start_time = 0, @active_end_time = 235900, @schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT, @schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT; EXECUTE msdb.dbo.sp_attach_schedule @job_id = @LS_Secondary__RestoreJobId, @schedule_id = @LS_SecondaryRestoreJobScheduleID; END DECLARE @LS_Add_RetCode2 AS INT; IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) BEGIN EXECUTE @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database @secondary_database = N'SampleDB', @primary_server = N'<ip_address_of_primary_server>', @primary_database = N'SampleDB', @restore_delay = 0, @restore_mode = 0, @disconnect_users = 0, @restore_threshold = 45, @threshold_alert_enabled = 1, @history_retention_period = 5760, @overwrite = 1; END IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) BEGIN EXECUTE msdb.dbo.sp_update_job @job_id = @LS_Secondary__CopyJobId, @enabled = 1; EXECUTE msdb.dbo.sp_update_job @job_id = @LS_Secondary__RestoreJobId, @enabled = 1; END
Vérifier le bon fonctionnement de la copie des journaux de transaction
Vérifier que la copie des journaux de transaction fonctionne en démarrant la tâche suivante sur le serveur principal :
USE msdb; GO EXECUTE dbo.sp_start_job N'LSBackup_SampleDB'; GO
Vérifier que la copie des journaux de transaction fonctionne en démarrant la tâche suivante sur le serveur secondaire :
USE msdb; GO EXECUTE dbo.sp_start_job N'LSCopy_SampleDB'; GO EXECUTE dbo.sp_start_job N'LSRestore_SampleDB'; GO
Vérifiez que le basculement de la copie des journaux de transaction fonctionne en exécutant la commande suivante :
Avertissement
Cette commande met en ligne la base de données secondaire et interrompt la configuration de la copie des journaux de transaction. Vous devrez reconfigurer la copie des journaux de transaction après avoir exécuté cette commande.
RESTORE DATABASE SampleDB WITH RECOVERY;