Introduzione al log shipping in Linux
Si applica a: SQL Server - Linux
Il log shipping è una configurazione a disponibilità elevata di SQL Server in cui un database di un server primario viene replicato in uno o più server secondari. Il log shipping consente sempre ai file di backup dal database di origine di eseguire il ripristino nel server secondario. Il server primario crea periodicamente backup del log delle transazioni e i server secondari li ripristinano, aggiornando la copia secondaria del database.
Come descritto nel diagramma precedente, una sessione di log shipping prevede i passaggi seguenti:
- Backup del file del log delle transazioni nell'istanza di SQL Server primaria
- Copia del file di backup del log delle transazioni attraverso la rete in una o più istanze di SQL Server secondarie
- Ripristino del file di backup del log delle transazioni nelle istanze di SQL Server secondarie
Prerequisiti
Configurare una condivisione di rete per il log shipping con CIFS
Nota
Questa esercitazione configura la condivisione di rete tramite CIFS + Samba.
Configurare il server primario
Installare Samba con il comando seguente:
Per Red Hat Enterprise Linux (RHEL):
sudo yum -y install samba
Per Ubuntu:
sudo apt-get install samba
Creare una directory per archiviare i log per il log shipping e concedere all’utente
mssql
le autorizzazioni necessariemkdir /var/opt/mssql/tlogs chown mssql:mssql /var/opt/mssql/tlogs chmod 0700 /var/opt/mssql/tlogs
Modificare il file
/etc/samba/smb.conf
(sono necessarie autorizzazioni root) aggiungendo la sezione seguente:[tlogs] path=/var/opt/mssql/tlogs available=yes read only=yes browsable=yes public=yes writable=no
Creare un utente
mssql
per Samba:sudo smbpasswd -a mssql
Riavviare i servizi Samba:
sudo systemctl restart smbd.service nmbd.service
Configurare il server secondario
Installare il client CIFS con il seguente comando:
Per RHEL:
sudo yum -y install cifs-utils
Per Ubuntu:
sudo apt-get install cifs-utils
Creare un file per archiviare le credenziali personali. In questo esempio, usiamo
/var/opt/mssql/.tlogcreds
. Usare la password impostata di recente per l'accountmssql
per Samba e sostituire<domain>
:username=mssql domain=<domain> password=<password>
Eseguire i comandi seguenti per creare una directory vuota per il montaggio e impostare correttamente le autorizzazioni e la proprietà
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
Aggiungere la riga a
etc/fstab
per rendere persistente la condivisione. Sostituire<ip_address_of_primary_server>
con il valore appropriato.//<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
Montare le condivisioni
sudo mount -a
Configurare il log shipping con Transact-SQL
Eseguire il backup del database sul server primario:
BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak'; GO
Configurare il log shipping nel server primario:
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;
Ripristinare il database nel server secondario:
RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak' WITH NORECOVERY;
Configurare il log shipping nel server secondario:
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
Verificare il funzionamento del log shipping
Verificare il funzionamento del log shipping avviando il processo seguente nel server primario:
USE msdb; GO EXECUTE dbo.sp_start_job N'LSBackup_SampleDB'; GO
Verificare il funzionamento del log shipping avviando il processo seguente nel server secondario:
USE msdb; GO EXECUTE dbo.sp_start_job N'LSCopy_SampleDB'; GO EXECUTE dbo.sp_start_job N'LSRestore_SampleDB'; GO
Verificare il funzionamento del failover del log shipping eseguendo il comando seguente:
Avviso
Questo comando porta online il database secondario e interrompe la configurazione del log shipping. Dopo aver eseguito questo comando, sarà necessario riconfigurare il log shipping.
RESTORE DATABASE SampleDB WITH RECOVERY;