Aracılığıyla paylaş


Linux'ta günlük gönderimi kullanmaya başlama

Şunlar için geçerlidir:Linux üzerinde SQL Server

Log shipping, birincil sunucudan bir veritabanının bir veya daha fazla ikincil sunucuya kopyalandığı bir SQL Server yüksek erişilebilirlik (HA) yapılandırmasıdır. Log gönderimi, kaynak veritabanındaki yedekleme dosyalarının ikincil sunucuya yüklenmesini sağlar. Birincil sunucu düzenli aralıklarla işlem günlüğü yedekleri oluşturur ve ikincil sunucular bunları geri yükleyerek veritabanının ikincil kopyasını güncelleştirir.

günlük gönderim iş akışını gösteren Diyagramı.

Önceki diyagramda açıklandığı gibi, günlük gönderim oturumu aşağıdaki adımları içerir:

  • Birincil SQL Server örneğinde işlem günlüğü dosyasını yedekleme
  • İşlem günlüğü yedekleme dosyasını ağ üzerinden bir veya daha fazla ikincil SQL Server örneğine kopyalama
  • İkincil SQL Server örneklerinde işlem günlüğü yedekleme dosyasını geri yükleme

Önkoşullar

CIFS kullanarak log gönderimi için bir ağ paylaşımı ayarlayın

Not

Bu öğreticide ağ paylaşımını ayarlamak için Common Internet File System (CIFS) ve Samba kullanılır.

Birincil sunucuyu yapılandırma

  1. Samba'yi aşağıdaki komutla yükleyin:

    • Red Hat Enterprise Linux (RHEL) için:

      sudo yum -y install samba
      
    • Ubuntu için:

      sudo apt-get install samba
      
  2. Günlük gönderimi için logları depolamak amacıyla bir dizin oluşturun ve mssql kullanıcıya gerekli izinleri verin.

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  3. /etc/samba/smb.conf dosyasını düzenleyin (kök izinlere ihtiyacınız var) ve aşağıdaki bölümü ekleyin:

    [tlogs]
    path=/var/opt/mssql/tlogs
    available=yes
    read only=yes
    browsable=yes
    public=yes
    writable=no
    
  4. Samba için mssql bir kullanıcı oluşturun:

    sudo smbpasswd -a mssql
    
  5. Samba hizmetlerini yeniden başlatın:

    sudo systemctl restart smbd.service nmbd.service
    

İkincil sunucuyu yapılandırma

  1. CIFS istemcisini aşağıdaki komutla yükleyin:

    • RHEL için:

      sudo yum -y install cifs-utils
      
    • Ubuntu için:

      sudo apt-get install cifs-utils
      
  2. Kimlik bilgilerinizi depolamak için bir dosya oluşturun. Bu örnekte /var/opt/mssql/.tlogcredskullanırız. mssql Samba hesabınız için kısa süre önce ayarladığınız parolayı kullanın ve <domain>değiştirin:

    username=mssql
    domain=<domain>
    password=<password>
    
  3. Bağlama için boş bir dizin oluşturmak ve izinleri ve sahipliği doğru ayarlamak için aşağıdaki komutları çalıştırın

    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. Paylaşımı kalıcı hale getirmek için satırı etc/fstab'a ekleyin. <ip_address_of_primary_server> uygun değerle değiştirin:

    //<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
    
  5. Paylaşımları bağlayın:

    sudo mount -a
    

Transact-SQL kullanarak günlük gönderimini ayarlama

  1. Veritabanını birincil sunucuda yedekleyin:

    BACKUP DATABASE SampleDB
        TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak';
    GO
    
  2. Birincil sunucuda log göndermeyi yapılandırın:

    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. veritabanını ikincil sunucuya geri yükleyin:

    RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
        WITH NORECOVERY;
    
  4. İkincil sunucuda kayıt gönderimini ayarlayın:

    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
    

Log gönderiminin çalıştığını doğrula

  1. Birincil sunucuda aşağıdaki işi başlatarak log gönderiminin çalışıp çalışmadığını doğrulayın.

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSBackup_SampleDB';
    GO
    
  2. İkincil sunucuda aşağıdaki işi başlatarak günlük gönderiminin çalıştığını doğrulayın:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSCopy_SampleDB';
    GO
    
    EXECUTE dbo.sp_start_job N'LSRestore_SampleDB';
    GO
    
  3. Aşağıdaki komutu yürüterek günlük gönderim yük devretmesinin çalıştığını doğrulayın:

    Uyarı

    Bu komut ikincil veritabanını çevrimiçine getirir ve günlük gönderme yapılandırmasını bozar. Bu komutu çalıştırdıktan sonra günlük gönderimi yeniden yapılandırmanız gerekir.

    RESTORE DATABASE SampleDB
        WITH RECOVERY;