Commencez à utiliser le log shipping sur Linux

S’applique à :SQL Server sur Linux

La Copie des journaux de transaction est une configuration à haute disponibilité de SQL Server 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 d'être restaurés 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.

Diagramme du flux de travail de la Copie des journaux de transaction depuis la sauvegarde du serveur principal jusqu'à la restauration sur le serveur secondaire.

Comme décrit dans le diagramme précédent, une session de copie des journaux de transaction implique les étapes suivantes :

  • Sauvegarde du fichier journal des transactions sur l’instance de SQL Server principale
  • Copie du fichier de sauvegarde du journal des transactions sur l’ensemble du réseau vers une ou plusieurs instances de SQL Server secondaires
  • Restauration du fichier de sauvegarde du journal des transactions sur les instances de SQL Server secondaires

Prerequisites

Configurer un partage réseau pour la copie des journaux de transaction à l’aide de CIFS

Note

Ce tutoriel utilise Common Internet File System (CIFS) et Samba pour configurer le partage réseau.

Configurer le serveur principal

  1. Installez Samba avec la commande suivante :

    • Pour Red Hat Enterprise Linux (RHEL) :

      sudo yum -y install samba
      
    • Pour Ubuntu :

      sudo apt-get install samba
      
  2. Créer un répertoire pour stocker les journaux pour la copie des journaux de transaction et accorder les autorisations requises à l'utilisateur mssql :

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  3. 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
    
  4. Créer un utilisateur mssql pour Samba :

    sudo smbpasswd -a mssql
    
  5. Redémarrer les services Samba :

    sudo systemctl restart smbd.service nmbd.service
    

Configurer le serveur secondaire

  1. Installez le client CIFS avec la commande suivante :

    • Pour RHEL :

      sudo yum -y install cifs-utils
      
    • Pour Ubuntu :

      sudo apt-get install cifs-utils
      
  2. 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 Samba mssql, puis remplacez <domain> :

    username=mssql
    domain=<domain>
    password=<password>
    
  3. Exécutez les commandes suivantes pour créer un répertoire vide pour le montage et définir correctement l’autorisation et la propriété :

    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
    
  4. Ajouter la ligne à etc/fstab pour rendre le partage persistant. 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
    
  5. Monter les partages :

    sudo mount -a
    

Configurer la copie des journaux de transaction à l’aide de Transact-SQL

  1. Sauvegardez la base de données sur le serveur primaire :

    BACKUP DATABASE SampleDB
        TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak';
    GO
    
  2. Configurer 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;
    
  3. Restaurez la base de données sur le serveur secondaire :

    RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
        WITH NORECOVERY;
    
  4. Configurer 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

  1. 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
    
  2. 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
    
  3. Vérifier que le basculement de la copie des journaux de transaction fonctionne en exécutant la commande suivante :

    Warning

    Cette commande met en ligne la base de données secondaire et interrompt la configuration de la journalisation des transactions. Vous devrez reconfigurer la journalisation des transactions après avoir exécuté cette commande.

    RESTORE DATABASE SampleDB
        WITH RECOVERY;