Erste Schritte mit dem Protokollversand unter Linux

Gilt für:SQL Server – Linux

Der Protokollversand ist eine SQL Server-Hochverfügbarkeitskonfiguration, bei der eine Datenbank von einem primären Server auf einem oder mehreren sekundären Servern repliziert wird. Mit dem Protokollversand können Sicherungsdateien aus der Quelldatenbank auf dem sekundären Server wiederhergestellt werden. Der primäre Server erstellt regelmäßig Transaktionsprotokollsicherungen, die von den sekundären Servern wiederhergestellt werden, wobei die sekundäre Kopie der Datenbank aktualisiert wird.

Diagram showing the log shipping workflow.

Wie in der vorherigen Abbildung gezeigt, umfasst eine Protokollversandsitzung die folgenden Schritte:

  • Sichern der Transaktionsprotokolldatei auf der primären SQL Server-Instanz.
  • Kopieren der Transaktionsprotokoll-Sicherungsdatei über das Netzwerk in eine oder mehrere sekundäre SQL Server-Instanzen.
  • Wiederherstellen der Transaktionsprotokoll-Sicherungsdatei auf der sekundären SQL Server-Instanz.

Voraussetzungen

Einrichten einer Netzwerkfreigabe für den Protokollversand mithilfe von CIFS

Hinweis

In diesem Tutorial werden CIFS und Samba zum Einrichten der Netzwerkfreigabe verwendet.

Konfigurieren des primären Servers

  1. Installieren Sie Samba mithilfe des folgenden Befehls:

    • Für Red Hat Enterprise Linux (RHEL)

      sudo yum -y install samba
      
    • Für Ubuntu:

      sudo apt-get install samba
      
  2. Erstellen Sie ein Verzeichnis zum Speichern der Protokolle für den Protokollversand, und gewähren Sie dem mssql-Benutzer die erforderlichen Berechtigungen.

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  3. Bearbeiten Sie die Datei „/etc/samba/smb.conf“ (Sie benötigen Stammverzeichnisberechtigungen), und fügen Sie den folgenden Abschnitt hinzu:

    [tlogs]
    path=/var/opt/mssql/tlogs
    available=yes
    read only=yes
    browsable=yes
    public=yes
    writable=no
    
  4. Erstellen eines mssql-Benutzers für Samba

    sudo smbpasswd -a mssql
    
  5. Neustart der Samba-Dienste:

    sudo systemctl restart smbd.service nmbd.service
    

Konfigurieren des sekundären Servers

  1. Installieren Sie den CIFS-Client mit dem folgenden Befehl:

    • Für RHEL:

      sudo yum -y install cifs-utils
      
    • Für Ubuntu:

      sudo apt-get install cifs-utils
      
  2. Erstellen Sie eine Datei zum Speichern Ihrer Anmeldeinformationen. In diesem Beispiel verwenden wir /var/opt/mssql/.tlogcreds. Verwenden Sie das Kennwort, das Sie kürzlich für Ihr mssql-Samba-Konto festgelegt haben, und ersetzen Sie <domain>:

    username=mssql
    domain=<domain>
    password=<password>
    
  3. Führen Sie die folgenden Befehle aus, um ein leeres Verzeichnis zum Einbinden zu erstellen und Berechtigung und Besitz richtig festzulegen.

    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. Fügen Sie „etc/fstab“ die Zeile hinzu, um die Freigabe beizubehalten. Ersetzen Sie <ip_address_of_primary_server> durch den entsprechenden Wert:

    //<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
    
  5. Binden Sie die Freigaben ein:

    sudo mount -a
    

Einrichten des Protokollversands mit Transact-SQL

  1. Sichern Sie die Datenbank auf dem primären Server:

    BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    GO
    
  2. Konfigurieren des Protokollversands auf dem primären Server:

    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. Stellen Sie die Datenbank auf dem sekundären Server wieder her:

    RESTORE DATABASE SampleDB
    FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    WITH NORECOVERY;
    
  4. Konfigurieren des Protokollversands auf dem sekundären Server:

    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
    

Überprüfen der Funktion des Protokollversands

  1. Überprüfen Sie, ob der Protokollversand funktioniert, indem Sie den folgenden Auftrag auf dem primären Server starten:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSBackup_SampleDB';
    GO
    
  2. Überprüfen Sie, ob der Protokollversand funktioniert, indem Sie den folgenden Auftrag auf dem sekundären Server starten:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSCopy_SampleDB';
    GO
    
    EXECUTE dbo.sp_start_job N'LSRestore_SampleDB';
    GO
    
  3. Überprüfen Sie, ob das Failover für den Protokollversand funktioniert, indem Sie den folgenden Befehl ausführen:

    Warnung

    Mit diesem Befehl wird die sekundäre Datenbank online geschaltet, und die Protokollversandkonfiguration wird unterbrochen. Nach dem Ausführen dieses Befehls müssen Sie den Protokollversand neu konfigurieren.

    RESTORE DATABASE SampleDB WITH RECOVERY;