Introducción al trasvase de registros en Linux

Se aplica a:SQL Server: Linux

El trasvase de registros es una configuración de SQL Server de alta disponibilidad (HA) donde una base de datos de un servidor principal se replica en uno o varios servidores secundarios. El trasvase de registros permite que los archivos de copia de seguridad de la base de datos de origen se restaure en el servidor secundario. El servidor principal crea copias de seguridad del registro de transacciones periódicamente y los servidores secundarios las restauran, lo que actualiza la copia secundaria de la base de datos.

Diagram showing the log shipping workflow.

Tal y como se describe en el diagrama anterior, una sesión de trasvase de registros consta de los siguientes pasos:

  • Realización de una copia de seguridad del archivo de registro de transacciones en la instancia principal de SQL Server
  • Copia del archivo de copia de seguridad del registro de transacciones a través de la red en una o varias instancias secundarias de SQL Server
  • Restauración del archivo de copia de seguridad del registro de transacciones en la instancia secundaria de SQL Server

Prerequisites

Configuración de un recurso compartido de red para el trasvase de registros mediante CIFS

Nota:

En este tutorial se usa CIFS + Samba para configurar el recurso compartido de red.

Configuración del servidor principal

  1. Instala Samba con el comando siguiente:

    • Para Red Hat Enterprise Linux (RHEL):

      sudo yum -y install samba
      
    • Para Ubuntu:

      sudo apt-get install samba
      
  2. Crea un directorio para almacenar los registros para el trasvase de registros y proporciona al usuario mssql los permisos necesarios:

    mkdir /var/opt/mssql/tlogs
    chown mssql:mssql /var/opt/mssql/tlogs
    chmod 0700 /var/opt/mssql/tlogs
    
  3. Edita el archivo /etc/samba/smb.conf (necesitas permisos de raíz) y agrega la siguiente sección:

    [tlogs]
    path=/var/opt/mssql/tlogs
    available=yes
    read only=yes
    browsable=yes
    public=yes
    writable=no
    
  4. Crea un usuario mssql para Samba:

    sudo smbpasswd -a mssql
    
  5. Reinicia los servicios de Samba:

    sudo systemctl restart smbd.service nmbd.service
    

Configuración del servidor secundario

  1. Instala el cliente CIFS con el siguiente comando:

    • Para RHEL:

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

      sudo apt-get install cifs-utils
      
  2. Cree un archivo para almacenar sus credenciales. En este ejemplo, usamos /var/opt/mssql/.tlogcreds. Usa la contraseña que has establecido recientemente para la cuenta Samba de mssql y reemplaza <domain>:

    username=mssql
    domain=<domain>
    password=<password>
    
  3. Ejecute los siguientes comandos para crear un directorio vacío para montar y establecer el permiso y la propiedad correctamente:

    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. Agrega la línea a etc/fstab para conservar el recurso compartido. Reemplaza <ip_address_of_primary_server> por el valor adecuado:

    //<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
    
  5. Monta los recursos compartidos:

    sudo mount -a
    

Configuración del trasvase de registros mediante Transact-SQL

  1. Haz una copia de seguridad de la base de datos en el servidor principal:

    BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    GO
    
  2. Configura el trasvase de registros en el servidor principal:

    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. Restaura la base de datos en el servidor secundario:

    RESTORE DATABASE SampleDB
    FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak'
    WITH NORECOVERY;
    
  4. Configura el trasvase de registros en el servidor secundario:

    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
    

Comprueba que el trasvase de registros funciona

  1. Comprueba que el trasvase de registros funciona al iniciar el siguiente trabajo en el servidor principal:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSBackup_SampleDB';
    GO
    
  2. Comprueba que el trasvase de registros funciona al iniciar el siguiente trabajo en el servidor secundario:

    USE msdb;
    GO
    
    EXECUTE dbo.sp_start_job N'LSCopy_SampleDB';
    GO
    
    EXECUTE dbo.sp_start_job N'LSRestore_SampleDB';
    GO
    
  3. Ejecuta el comando siguiente para comprobar que la conmutación por error del trasvase de registros funciona:

    Advertencia

    Este comando pondrá en línea la base de datos secundaria e interrumpirá la configuración de trasvase de registros. Tendrás que volver a configurar el trasvase de registros después de ejecutar este comando.

    RESTORE DATABASE SampleDB WITH RECOVERY;