Linux에서 로그 전달 작업 시작Get started with Log Shipping on Linux

이 항목 적용 대상: 예(Linux에만 해당) SQL Server없습니다Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스없는병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL Server (Linux only)noAzure SQL DatabasenoAzure SQL Data WarehousenoParallel Data Warehouse

SQL Server 로그 전달이를 하나 이상의 보조 서버는 주 서버에서 데이터베이스는 복제 하는 HA 구성.SQL Server Log shipping is a HA configuration where a database from a primary server is replicated onto one or more secondary servers. 간단히 말해서 원본 데이터베이스의 백업은 보조 서버에 복원 됩니다.In a nutshell, a backup of the source database is restored onto the secondary server. 그런 다음 주 서버 트랜잭션 로그 백업을 주기적으로 만들고 보조 서버 복원할 데이터베이스의 보조 복사본을 업데이트 합니다.Then the primary server creates transaction log backups periodically, and the secondary servers restore them, updating the secondary copy of the database.

로그 전달

위 그림에 표시 된 것과 같이 로그 전달 세션에는 다음 단계가 포함 됩니다.As described in the picture above, a log shipping session involves the following steps:

  • 주 SQL Server 인스턴스에서 트랜잭션 로그 파일 백업Backing up the transaction log file on the primary SQL Server instance
  • 하나 이상의 보조 SQL Server 인스턴스를 네트워크를 통해 트랜잭션 로그 백업 파일을 복사Copying the transaction log backup file across the network to one or more secondary SQL Server instances
  • 보조 SQL Server 인스턴스에서 트랜잭션 로그 백업 파일 복원Restoring the transaction log backup file on the secondary SQL Server instances

필수 구성 요소Prerequisites

로그 전달이 CIFS를 사용 하 여 네트워크 공유 설치Setup a network share for Log Shipping using CIFS

참고

이 자습서를 사용 하 여 CIFS + Samba 네트워크 공유를 설정 합니다.This tutorial uses CIFS + Samba to setup the network share. NFS를 사용 하려는 명령을 남길 및 문서에 추가 됩니다.If you want to use NFS, leave a comment and we will add it to the doc.

주 서버를 구성 합니다.Configure Primary Server

  • Samba를 설치 하려면 다음을 실행 합니다.Run the following to install Samba

    sudo apt-get install samba #For Ubuntu
    sudo yum -y install samba #For RHEL/CentOS
    
  • 로그 전달에 대 한 로그를 저장 하 고 mssql 필요한 권한을 부여 하려면 디렉터리 만들기Create a directory to store the logs for Log Shipping and give mssql the required permissions

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  • (루트 권한이 필요 하에 대 한) /etc/samba/smb.conf 파일을 편집한 다음 섹션을 추가 합니다.Edit the /etc/samba/smb.conf file (you need root permissions for that) and add the following section:

    [tlogs]
    path=/var/opt/mssql/tlogs
    available=yes
    read only=yes
    browsable=yes
    public=yes
    writable=no
    
  • Samba 위한 mssql 사용자 만들기Create a mssql user for Samba

    sudo smbpasswd -a mssql
    
  • Samba 서비스를 다시 시작Restart the Samba services

    sudo systemctl restart smbd.service nmbd.service
    

보조 서버를 구성 합니다.Configure Secondary Server

  • CIFS 클라이언트를 설치 하려면 다음을 실행 합니다.Run the following to install the CIFS client

    sudo apt-get install cifs-utils #For Ubuntu
    sudo yum -y install cifs-utils #For RHEL/CentOS
    
  • 자격 증명을 저장할 파일을 만듭니다.Create a file to store your credentials. 최근에 프로그램 mssql Samba 계정에 대해 설정한 암호 사용Use the password you recently set for your mssql Samba account

    vim /var/opt/mssql/.tlogcreds
    #Paste the following in .tlogcreds
    username=mssql
    domain=<domain>
    password=<password>
    
  • 탑재에 대 한 빈 디렉터리를 만들고 사용 권한 및 소유권을 올바르게 설정 하려면 다음 명령을 실행 합니다.Run the following commands to create an empty directory for mounting and set permission and ownership correctly

    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
    
  • 공유를 지 속하는 등/fstab에 줄을 추가 합니다.Add the line to etc/fstab to persist the share

    //<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
    
  • 공유 폴더에 탑재Mount the shares

    sudo mount -a
    

설치 로그 T-SQL을 통해 전달 합니다.Setup Log Shipping via T-SQL

  • 주 서버에서이 스크립트를 실행 합니다.Run this script from your primary server

    BACKUP DATABASE SampleDB
    TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    GO
    
    DECLARE @LS_BackupJobId AS uniqueidentifier 
    DECLARE @LS_PrimaryId   AS uniqueidentifier 
    DECLARE @SP_Add_RetCode As int 
    EXEC @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 
    
    EXEC 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 
    
    EXEC msdb.dbo.sp_attach_schedule 
            @job_id = @LS_BackupJobId 
            ,@schedule_id = @LS_BackUpScheduleID  
    
    EXEC msdb.dbo.sp_update_job 
            @job_id = @LS_BackupJobId 
            ,@enabled = 1 
    
    END 
    
    EXEC master.dbo.sp_add_log_shipping_alert_job 
    
    EXEC 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 
    
  • 보조 서버에서이 스크립트를 실행 합니다.Run this script from your secondary server

    RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    WITH NORECOVERY;
    
    DECLARE @LS_Secondary__CopyJobId    AS uniqueidentifier 
    DECLARE @LS_Secondary__RestoreJobId AS uniqueidentifier 
    DECLARE @LS_Secondary__SecondaryId  AS uniqueidentifier 
    DECLARE @LS_Add_RetCode As int 
    
    EXEC @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 
    
    EXEC 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 
    
    EXEC msdb.dbo.sp_attach_schedule 
            @job_id = @LS_Secondary__CopyJobId 
            ,@schedule_id = @LS_SecondaryCopyJobScheduleID  
    
    DECLARE @LS_SecondaryRestoreJobScheduleUID  As uniqueidentifier 
    DECLARE @LS_SecondaryRestoreJobScheduleID   AS int 
    
    EXEC 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 
    
    EXEC 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 
    
    EXEC @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 
    
    EXEC msdb.dbo.sp_update_job 
            @job_id = @LS_Secondary__CopyJobId 
            ,@enabled = 1 
    
    EXEC msdb.dbo.sp_update_job 
            @job_id = @LS_Secondary__RestoreJobId 
            ,@enabled = 1 
    
    END 
    

로그 전달 작동 하는지 확인Verify Log Shipping works

  • 주 서버에서 다음 작업을 시작 하 여 로그 전달에서 작동 하는지 확인Verify that Log Shipping works by starting the following job on the primary server

    USE msdb ;  
    GO  
    
    EXEC dbo.sp_start_job N'LSBackup_SampleDB' ;  
    GO  
    
  • 보조 서버에서 다음 작업을 시작 하 여 로그 전달에서 작동 하는지 확인Verify that Log Shipping works by starting the following job on the secondary server

    USE msdb ;  
    GO  
    
    EXEC dbo.sp_start_job N'LSCopy_SampleDB' ;  
    GO  
    EXEC dbo.sp_start_job N'LSRestore_SampleDB' ;  
    GO  
    RESTORE DATABASE SampleDB WITH RECOVERY;