Wprowadzenie do wysyłania dzienników w systemie Linux

Dotyczy:Program SQL Server w systemie Linux

Wysyłanie dzienników jest konfiguracją wysokiej dostępności SQL Server, w której baza danych z serwera podstawowego jest replikowana na co najmniej jeden serwer pomocniczy. Wysyłanie dzienników umożliwia przywracanie plików kopii zapasowej ze źródłowej bazy danych na serwer pomocniczy. Serwer podstawowy okresowo tworzy kopie zapasowe dziennika transakcji, a serwery pomocnicze je przywracają, aktualizując pomocniczą kopię bazy danych.

Diagram przepływu pracy wysyłania dziennika z kopii zapasowej serwera podstawowego do przywracania serwera pomocniczego.

Jak opisano na poprzednim diagramie, sesja wysyłania dziennika obejmuje następujące kroki:

  • Wykonywanie kopii zapasowej pliku dziennika transakcji na instancji podstawowej SQL Server
  • Kopiowanie pliku kopii zapasowej dziennika transakcji w sieci do jednego lub więcej pomocniczych instancji SQL Server
  • Przywracanie pliku kopii zapasowej dziennika transakcji w pomocniczych wystąpieniach programu SQL Server

Wymagania wstępne

Konfigurowanie udziału sieciowego na potrzeby wysyłania dzienników przy użyciu funkcji CIFS

Note

W tym samouczku do skonfigurowania udziału sieciowego jest używany wspólny internetowy system plików (CIFS) i Samba.

Konfigurowanie serwera podstawowego

  1. Zainstaluj program Samba przy użyciu następującego polecenia:

    • W przypadku systemu Red Hat Enterprise Linux (RHEL):

      sudo yum -y install samba
      
    • Dla systemu Ubuntu:

      sudo apt-get install samba
      
  2. Utwórz katalog do przechowywania dzienników na potrzeby wysyłania dzienników i nadaj użytkownikowi mssql wymagane uprawnienia:

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  3. Edytuj plik /etc/samba/smb.conf (potrzebujesz uprawnień głównych) i dodaj następującą sekcję:

    [tlogs]
    path=/var/opt/mssql/tlogs
    available=yes
    read only=yes
    browsable=yes
    public=yes
    writable=no
    
  4. Utwórz użytkownika mssql dla środowiska Samba:

    sudo smbpasswd -a mssql
    
  5. Uruchom ponownie usługi Samba:

    sudo systemctl restart smbd.service nmbd.service
    

Konfigurowanie serwera pomocniczego

  1. Zainstaluj klienta CIFS za pomocą następującego polecenia:

    • W przypadku systemu RHEL:

      sudo yum -y install cifs-utils
      
    • Dla systemu Ubuntu:

      sudo apt-get install cifs-utils
      
  2. Utwórz plik do przechowywania poświadczeń. W tym przykładzie używamy /var/opt/mssql/.tlogcreds. Użyj ostatnio ustawionego hasła dla konta mssql Samba i zastąp <domain>:

    username=mssql
    domain=<domain>
    password=<password>
    
  3. Uruchom następujące polecenia, aby utworzyć pusty katalog na potrzeby poprawnego instalowania i ustawiania uprawnień i własności:

    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. Dodaj wiersz do /etc/fstab, aby utrwał udział. Zastąp <ip_address_of_primary_server> odpowiednią wartością:

    //<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
    
  5. Zamontuj udział:

    sudo mount -a
    

Konfigurowanie wysyłania dzienników przy użyciu Transact-SQL

  1. Tworzenie kopii zapasowej bazy danych na serwerze podstawowym:

    BACKUP DATABASE SampleDB
        TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak';
    GO
    
  2. Skonfiguruj wysyłanie dzienników na serwerze podstawowym:

    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. Przywróć bazę danych na serwerze pomocniczym:

    RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
        WITH NORECOVERY;
    
  4. Skonfiguruj wysyłanie dzienników na serwerze pomocniczym:

    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
    

Sprawdź, czy log shipping działa

  1. Sprawdź, czy wysyłanie dziennika działa, uruchamiając następujące zadanie na serwerze podstawowym:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSBackup_SampleDB';
    GO
    
  2. Sprawdź, czy wysyłanie dziennika działa, uruchamiając następujące zadanie na serwerze pomocniczym:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSCopy_SampleDB';
    GO
    
    EXECUTE dbo.sp_start_job N'LSRestore_SampleDB';
    GO
    
  3. Sprawdź, czy przełączanie awaryjne kopiowania dziennika działa, wykonując następujące polecenie:

    Warning

    To polecenie przenosi pomocniczą bazę danych w tryb online i przerywa konfigurację wysyłania dziennika. Po uruchomieniu tego polecenia należy ponownie skonfigurować wysyłkę dziennika.

    RESTORE DATABASE SampleDB
        WITH RECOVERY;