Mulai menggunakan pengiriman log di Linux

Berlaku untuk:SQL Server - Linux

Pengiriman log adalah konfigurasi ketersediaan tinggi (HA) SQL Server di mana database dari server utama direplikasi ke satu atau beberapa server sekunder. Pengiriman log memungkinkan file cadangan dari database sumber untuk dipulihkan ke server sekunder. Server utama membuat cadangan log transaksi secara berkala, dan server sekunder memulihkannya, memperbarui salinan sekunder database.

Diagram showing the log shipping workflow.

Seperti yang dijelaskan dalam diagram sebelumnya, sesi pengiriman log melibatkan langkah-langkah berikut:

  • Mencadangkan file log transaksi pada instans SQL Server utama
  • Menyalin file cadangan log transaksi di seluruh jaringan ke satu atau beberapa instans SQL Server sekunder
  • Memulihkan file cadangan log transaksi pada instans SQL Server sekunder

Prasyarat

Menyiapkan berbagi jaringan untuk pengiriman log menggunakan CIFS

Catatan

Tutorial ini menggunakan CIFS + Samba untuk menyiapkan berbagi jaringan.

Mengonfigurasi server utama

  1. Instal Samba dengan perintah berikut:

    • Untuk Red Hat Enterprise Linux (RHEL):

      sudo yum -y install samba
      
    • Untuk Ubuntu:

      sudo apt-get install samba
      
  2. Buat direktori untuk menyimpan log untuk pengiriman log, dan beri mssql pengguna izin yang diperlukan:

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  3. /etc/samba/smb.conf Edit file (Anda memerlukan izin root), dan tambahkan bagian berikut:

    [tlogs]
    path=/var/opt/mssql/tlogs
    available=yes
    read only=yes
    browsable=yes
    public=yes
    writable=no
    
  4. Buat mssql pengguna untuk Samba:

    sudo smbpasswd -a mssql
    
  5. Mulai ulang layanan Samba:

    sudo systemctl restart smbd.service nmbd.service
    

Mengonfigurasi server sekunder

  1. Instal klien CIFS dengan perintah berikut:

    • Untuk RHEL:

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

      sudo apt-get install cifs-utils
      
  2. Buat file untuk menyimpan kredensial Anda. Dalam contoh ini, kita menggunakan /var/opt/mssql/.tlogcreds. Gunakan kata sandi yang baru-baru ini Anda tetapkan untuk akun Samba Anda mssql , dan ganti <domain>:

    username=mssql
    domain=<domain>
    password=<password>
    
  3. Jalankan perintah berikut untuk membuat direktori kosong untuk memasang dan mengatur izin dan kepemilikan dengan benar

    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. Tambahkan baris ke etc/fstab untuk mempertahankan berbagi. Ganti <ip_address_of_primary_server> dengan nilai yang sesuai:

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

    sudo mount -a
    

Menyiapkan pengiriman log menggunakan Transact-SQL

  1. Cadangkan database di server utama:

    BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    GO
    
  2. Konfigurasikan pengiriman log di server utama:

    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. Pulihkan database di server sekunder:

    RESTORE DATABASE SampleDB
    FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    WITH NORECOVERY;
    
  4. Konfigurasikan pengiriman log di server sekunder:

    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
    

Memverifikasi pekerjaan pengiriman log

  1. Verifikasi bahwa pengiriman log berfungsi dengan memulai pekerjaan berikut di server utama:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSBackup_SampleDB';
    GO
    
  2. Verifikasi bahwa pengiriman log berfungsi dengan memulai pekerjaan berikut di server sekunder:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSCopy_SampleDB';
    GO
    
    EXECUTE dbo.sp_start_job N'LSRestore_SampleDB';
    GO
    
  3. Verifikasi bahwa failover pengiriman log berfungsi dengan menjalankan perintah berikut:

    Peringatan

    Perintah ini akan membawa database sekunder online dan memutus konfigurasi pengiriman log. Anda perlu mengonfigurasi ulang pengiriman log setelah menjalankan perintah ini.

    RESTORE DATABASE SampleDB WITH RECOVERY;