Linux에서 로그 전달 시작

적용 대상:SQL Server - Linux

로그 전달은 주 서버의 데이터베이스가 하나 이상의 보조 서버에 복제본(replica) SQL Server HA(고가용성) 구성입니다. 로그 전달을 사용하면 원본 데이터베이스의 백업 파일을 보조 서버로 복원할 수 있습니다. 주 서버는 정기적으로 트랜잭션 로그 백업을 만들고 보조 서버는 이를 복원하여 데이터베이스의 보조 복사본을 업데이트합니다.

Diagram showing the log shipping workflow.

이전 다이어그램에 설명된 대로 로그 전달 세션에는 다음 단계가 포함됩니다.

  • 주 SQL Server 인스턴스에서 트랜잭션 로그 파일 백업
  • 네트워크를 통해 하나 이상의 보조 SQL Server 인스턴스에 트랜잭션 로그 백업 파일 복사
  • 보조 SQL Server 인스턴스에서 트랜잭션 로그 백업 파일 복원

필수 조건

CIFS를 사용하여 로그 전달을 위한 네트워크 공유 설정

참고 항목

이 자습서에서는 CIFS + Samba를 사용하여 네트워크 공유를 설치합니다.

주 서버 구성

  1. 다음 명령을 사용하여 Samba를 설치합니다.

    • RHEL(Red Hat Enterprise Linux)의 경우:

      sudo yum -y install samba
      
    • Ubuntu의 경우:

      sudo apt-get install samba
      
  2. 로그 전달을 위한 로그를 저장할 디렉터리를 만들고 사용자에게 필요한 권한을 부여 mssql 합니다.

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  3. 파일을 편집하고 /etc/samba/smb.conf (루트 권한이 필요함) 다음 섹션을 추가합니다.

    [tlogs]
    path=/var/opt/mssql/tlogs
    available=yes
    read only=yes
    browsable=yes
    public=yes
    writable=no
    
  4. mssql Samba에 대한 사용자를 만듭니다.

    sudo smbpasswd -a mssql
    
  5. Samba 서비스를 다시 시작합니다.

    sudo systemctl restart smbd.service nmbd.service
    

보조 서버 구성

  1. 다음 명령을 사용하여 CIFS 클라이언트를 설치합니다.

    • RHEL의 경우:

      sudo yum -y install cifs-utils
      
    • Ubuntu의 경우:

      sudo apt-get install cifs-utils
      
  2. 자격 증명을 저장할 파일을 만듭니다. 이 예시에서는 /var/opt/mssql/.tlogcreds를 사용합니다. Samba 계정에 대해 최근에 설정한 암호를 사용하고 다음을 mssql 바꿉다 <domain>.

    username=mssql
    domain=<domain>
    password=<password>
    
  3. 다음 명령을 실행하여 탑재할 빈 디렉터리를 만들고 권한 및 소유권을 올바르게 설정합니다.

    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. etc/fstab에 줄을 추가하여 공유를 유지합니다. 적절한 값으로 바꿉다 <ip_address_of_primary_server> .

    //<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
    
  5. 공유를 탑재합니다.

    sudo mount -a
    

Transact-SQL을 사용하여 로그 전달 설정

  1. 주 서버에서 데이터베이스를 백업합니다.

    BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    GO
    
  2. 주 서버에서 로그 전달을 구성합니다.

    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. 보조 서버에서 데이터베이스를 복원합니다.

    RESTORE DATABASE SampleDB
    FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    WITH NORECOVERY;
    
  4. 보조 서버에서 로그 전달을 구성합니다.

    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
    

로그 전달이 작동하는지 확인

  1. 주 서버에서 다음 작업을 시작하여 로그 전달이 작동하는지 확인합니다.

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSBackup_SampleDB';
    GO
    
  2. 보조 서버에서 다음 작업을 시작하여 로그 전달이 작동하는지 확인합니다.

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSCopy_SampleDB';
    GO
    
    EXECUTE dbo.sp_start_job N'LSRestore_SampleDB';
    GO
    
  3. 다음 명령을 실행하여 로그 전달 장애 조치(failover)가 작동하는지 확인합니다.

    Warning

    이 명령은 보조 데이터베이스를 온라인 상태로 만들고 로그 전달 구성을 중단합니다. 이 명령을 실행한 후 로그 전달을 다시 구성해야 합니다.

    RESTORE DATABASE SampleDB WITH RECOVERY;