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.
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
Instala Samba con el comando siguiente:
Para Red Hat Enterprise Linux (RHEL):
sudo yum -y install samba
Para Ubuntu:
sudo apt-get install samba
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
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
Crea un usuario
mssql
para Samba:sudo smbpasswd -a mssql
Reinicia los servicios de Samba:
sudo systemctl restart smbd.service nmbd.service
Configuración del servidor secundario
Instala el cliente CIFS con el siguiente comando:
Para RHEL:
sudo yum -y install cifs-utils
Para Ubuntu:
sudo apt-get install cifs-utils
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 demssql
y reemplaza<domain>
:username=mssql domain=<domain> password=<password>
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
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
Monta los recursos compartidos:
sudo mount -a
Configuración del trasvase de registros mediante Transact-SQL
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
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;
Restaura la base de datos en el servidor secundario:
RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak' WITH NORECOVERY;
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
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
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
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;