Vill man använda Log-shipping för databaser som av någon anledning har samma logiska filnamn. Samtidigt…
Förenkla Log shipping uppsättningen med script
Att konfigurera Log shipping är en ganska enkel procedur när man har gjort det några gånger, vill man så kan man göra det med script så att man snabbt kan få upp Log shipping igen när man behöver. Grunderna till scriptet nedan kommer från generera script via SQL Management studio med några tillägg. Scriptet tar först Full backup av den primära databasen och gör restore till den sekundära servern. Sedan synkroniseras databasen och de tillhörande schemalagda jobben LS_Backup på den primära servern och LS_Copy och LS_Restore på den sekundära servern skapas.
Förbered scriptet
- För att sätta upp Log shipping måste man vara sysadmin på SQL Servern
- Databasen måste vara i full eller bulk-logged recovery mode
- Skapa en folder för backup på den primära servern eller nätverkshare och tilldela SQL Server Service kontot read/write behörighet
Dela ut mappen - Skapa en folder för den sekundära servern, tilldela SQL Server agent kontot på den sekundära servern read/write behörighet
Dela ut mappen - Editera variablerna i scriptet med relevant info
- Exekvera i SQLCMD mode
Observera!
Det är viktigt att man gör noggranna tester i testmiljö innan man använder det i produktionsmiljö.
/* LOG SHIPPING SCRIPT */
:ON ERROR exit
:setvar PrimaryServer "<PrimärServer>\<Instans>"
:setvar PrimaryDatabase "<Databas>"
:setvar PrimaryBackupDirectory "C:\Temp\logship\backup\"
:setvar PrimaryBackupShare "\\<PrimärServer>\Temp\logship\backup\"
:setvar SecondaryServer "<SekundärServer>\<Instans>"
:setvar SecondaryDatabase "<Databas>"
:setvar SecondaryBackupDirectory "\\<SekundärServer>\temp\logship\restore\"
--Full backup och restore
:setvar FullBackup "\\<PrimärServer>Temp\logship\backup\<Databas>.bak"
:setvar SecondaryDataPath "E:\Program Files\Microsoft SQL Server\MSSQL12.SQL2\MSSQL\DATA\<Databas>.mdf"
:setvar SecondaryLogPath "E:\Program Files\Microsoft SQL Server\MSSQL12.SQL2\MSSQL\DATA\<Databas>_Log.ldf"
:CONNECT $(PrimaryServer)
USE [master]
BACKUP DATABASE $(PrimaryDatabase) TO DISK = N'$(FullBackup)' WITH NOFORMAT, INIT, NAME = N'$(PrimaryDatabase)-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
:CONNECT $(SecondaryServer)
USE [master]
RESTORE DATABASE $(SecondaryDatabase) FROM DISK = N'$(FullBackup)' WITH FILE = 1, MOVE N'$(PrimaryDatabase)' TO N'$(SecondaryDataPath)', MOVE N'$(PrimaryDatabase)_log' TO N'$(SecondaryLogPath)', NORECOVERY, NOUNLOAD, REPLACE, STATS = 5
GO
SET NOCOUNT ON
/* Primary Server */
:CONNECT $(PrimaryServer)
BEGIN
USE msdb;
/* Check to see if the backup folder exists */
RAISERROR('Checking to see if $(PrimaryBackupDirectory) exists...',0,1) WITH NOWAIT
DECLARE @CheckDir NVARCHAR(2000)
DECLARE @ErrorMsg NVARCHAR(200)
DECLARE @DirInfo TABLE
(
FileExists BIT ,
FileIsADirectory BIT ,
ParentDirectoryExists BIT
)
SET @CheckDir = '$(PrimaryBackupDirectory)'
INSERT INTO @DirInfo
( FileExists ,
FileIsADirectory ,
ParentDirectoryExists
)
EXECUTE [master].dbo.xp_fileexist @CheckDir
IF NOT EXISTS ( SELECT *
FROM @DirInfo
WHERE FileExists = 0
AND FileIsADirectory = 1
AND ParentDirectoryExists = 1 )
BEGIN
SET @ErrorMsg = 'The primary backup directory $(PrimaryBackupDirectory) does not exist...quitting'
RAISERROR(@ErrorMsg,16,1) WITH NOWAIT
RETURN
END
RAISERROR('$(PrimaryBackupDirectory) exists, continuing...',0,1) WITH NOWAIT
RAISERROR('Enabling log shipping for $(PrimaryDatabase) on $(PrimaryServer)...',0,1) WITH NOWAIT
------
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'$(PrimaryDatabase)'
,@backup_directory = N'$(PrimaryBackupDirectory)'
,@backup_share = N'$(PrimaryBackupShare)'
,@backup_job_name = N'LSBackup_$(PrimaryDatabase)'
,@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_$(PrimaryServer)'
,@enabled = 1
,@freq_type = 4
,@freq_interval = 1
,@freq_subday_type = 4
,@freq_subday_interval = 15
,@freq_recurrence_factor = 0
,@active_start_date = 20160128
,@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'$(PrimaryDatabase)'
,@secondary_server = N'$(SecondaryServer)'
,@secondary_database = N'$(SecondaryDatabase)'
,@overwrite = 1
--
RAISERROR('Log shipping enabled for $(PrimaryDatabase) on $(PrimaryServer)...',0,1) WITH NOWAIT
END
GO
/* Secondary Server */
:CONNECT $(SecondaryServer)
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'$(PrimaryServer)'
,@primary_database = N'$(PrimaryDatabase)'
,@backup_source_directory = N'$(PrimaryBackupShare)'
,@backup_destination_directory = N'$(SecondaryBackupDirectory)'
,@copy_job_name = N'LSCopy_$(PrimaryServer)_$(PrimaryDatabase)'
,@restore_job_name = N'LSRestore_$(PrimaryServer)_$(PrimaryDatabase)'
,@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 = 20160128
,@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 = 20160128
,@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'$(SecondaryDatabase)'
,@Primary_server = N'$(PrimaryServer)'
,@Primary_database = N'$(PrimaryDatabase)'
,@restore_delay = 0
,@restore_mode = 0
,@disconnect_users = 0
,@restore_threshold = 45
,@threshold_alert_enabled = 1
,@history_retention_period = 5760
,@overwrite = 0
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
RAISERROR('Setup of log shipping from database $(PrimaryDatabase) on server $(PrimaryServer) to database $(SecondaryDatabase) on $(SecondaryServer) complete!',0,1) WITH NOWAIT

