LOGSHIPPING 事务日志传送。
顾名思义:传送事务日志,主要指在主服务器上数据库进行日志备份,将日志备份传送至辅助服务器上进行还原,以期实现容灾的一种方式。因为在还原过程中,允许用户设置还原日志备份的时间。
例如。设置还原日志备份的时间为24h。则我现在在主服务器上的数据库表中新添一条数据,如果是ALWAYSON配置,则该操作会直接同步到可用性副本的可用性数据库中。如果是logshipping,则会在24h后,该操作才会还原到辅助服务器的数据库中去。也就是说辅助服务器上的数据库是24小时前的主数据库的状态。如果在这24h期间,我发现进行了误操作,则可以将辅助数据库上的数据同步至主数据库,这样就实现了容灾的功能。
接下来我们利用SQL SERVER原生的图形化界面SSMS进行logshipping搭建。后续我们还将尝试使用脚本进行搭建。
服务器:
主库:WIN-P1 :192.168.237.139
备库:WIN-P4 :192.168.237.139
正常情况下可以有四个服务器,分别为主服务器,从服务器,监控服务器,共享服务器。
主从服务器分别用于共享及还原;监控服务器用于存放监控信息,共享服务器用于存放备份文件信息。现在我们仅用两台,即备份文件不放在单独的服务器上,监控信息也不单独部署在独立的服务器上。
正常情况下:日志传送主要由三个部分组成:
1.在主库上备份事务日志
2.将主库中备份的事务日志复制到备库中
3.按照事先设置的延迟时间还原至将事务日志还原至备库
由于需要进行事务日志备份与还原,所以主库上的目标数据库必须处于完全恢复模式或大容量日志恢复模式。
接下来我们开始进行搭建:
1.在主服务器与辅助服务器中设置同名用户,密码一样,添加为管理员权限。
点击工具-计算机管理–本地用户和组-新建用户。并将用户添加到administrators组。
在设置密码规则时,一定要勾选密码永不过期。以前由于在创建用户是忘记更改密码策略,作业运行三个月后由于密码问题导致用户登录失败,作业崩溃,实在是大坑。
2.在辅助服务器上进行相同操作。
3.在主服务器将新建用户加入数据库用户中,并设置admin权限。在辅助服务器中库中将该用户加入数据库用户中,授予admin权限,并设置为SQL SERVER 服务器的启动用户。这里我只以辅助服务器上进行的操作为例。
配置管理器-SQL SERVER 服务
4.在主服务器和辅助服务器上分别创建同路径同名文件夹,用于存放备份文件。
并将主服务器中的文件夹共享给everyone,权限为只读,用于读取备份文件并拷贝到辅助服务器中。共享路径为\WIN-P1\logshipping_log
在主库上将数据库全备,备份文件放在刚创建的文件夹下。注意,如果你的logshipping主库是ALWAYSON可用性组中的从库,则对logshipping主库是不能直接进行
全备的。此时可以使用ALWAYSON可用性组中的主库的全备。
BACKUP DATABASE [InsideTSQL2008] TO DISK = N'C:\logshipping_log\insidetsql2008.bak' WITH NOFORMAT, NOINIT, NAME = N'InsideTSQL2008-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
5.接下来正式开始配置LOGSHIPPING下列操作请在主库上进行
右击insidetsql数据库-属性-事务日志传送,勾选“将此数据库起用为日志传送配置中的主数据库”,。
单击备份设置,输入备份文件夹所在的网络路径(即我们设置共享的备份文件夹的网络路径)
即主机上的备份文件夹的本地路径。因为我们只使用两台服务器,所以我们的备份文件夹是放在主机上,所以第二个框框我们也要填写内容。
定时删除备份文件,报警机制,备份作业名称默认。点击计划,更改作业执行时间。这里修改智行间隔为30分钟,可以根据下方的说明来查看作业执行计划。
点击确定,回到事务日志传送页面,添加辅助服务器实例和数据库。
点击添加,连接辅助服务器实例。(注意,若主服务器和辅助服务器在同一域中,则使用域管理员帐号登录进行上述操作。不再同一域中,需要在两台服务器的数据库中建立同名登录名,并设置ADMIN权限)。
由于之前我们已经进行全备,所以这里我们选择“将主数据库的现有备份还原到辅助数据库中”,并填写网络路径。此时需要把备份文件一同写进路径中.
还原选项可以指定数据库的数据文件和日志文件的创建地址。
点击复制文件,选择备份文件将复制到辅助服务器的什么文件夹下。并确认备份文件的时效,确认作业计划。
在还原事务日志中,可以设置备份延迟还原时间。由于我对于该库的存在的目的在于灾备,无特殊情况不会使用,所以选择在还原时端来所有链接,设置为单用户模式。
信息填写完成后,点击确定,此时辅助数据库实例已添加.同时我们勾选使用监视服务器实例选项.点击设置,连接件事服务器实例.这里我们将WIN-P4选做监视服务器。
点击确定,配置日志传送。
此时我们登录WIN-P4实例查看实例上已经对insidetsql2008数据库进行了还原,数据库状态为(备用/只读),辅助数据库对应的数据文件和日志文件,也已按照我们之前设置的路径创建相应文件。
由于此处我使用的是ALWAYSON可用性组的可用性数据库副本做LOGSHIPPING的主库,所以我们在ALWAYSON可用性组的主库进行的操作可以同步至LOGSHIPPING的主库,然后按照我们设置的延迟1小时的配置同步至LOGSHIPPING的备库。
alwayson主库-WIN-P3
create table test(id int not null,name varchar(10) not null);
select * from test1
alwayson从库,LOGSHIPPING主库-WIN-P1
select * from test1
LOGSHIPPING从库-WIN-P4
select * from test1
–该表不存在
由于我是设置的是每天8点执行一次还原操作,所以在第二天8点之后可以查看到这张表
select * from test1
–查询为空表
SSMS对应的详细脚本如下:
-- 在主服务器上执行下列语句,以便为数据库 [WIN-P1].[InsideTSQL2008]
-- 配置日志传送。
-- 需要在主服务器上 [msdb] 数据库的上下文中运行该脚本。
-------------------------------------------------------------------------------------
-- 添加日志传送配置
-- ****** 开始: 要在主服务器 [WIN-P1] 上运行的脚本 ******
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'InsideTSQL2008'
,@backup_directory = N'c:\logshipping_log'
,@backup_share = N'\\WIN-P1\logshipping_log'
,@backup_job_name = N'LSBackup_InsideTSQL2008'
,@backup_retention_period = 4320
,@backup_compression = 1
,@monitor_server = N'WIN-P4'
,@monitor_server_security_mode = 0
,@monitor_server_login = N'**********'
,@monitor_server_password = N'**********'
,@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_WIN-P11'
,@enabled = 1
,@freq_type = 4
,@freq_interval = 1
,@freq_subday_type = 4
,@freq_subday_interval = 30
,@freq_recurrence_factor = 0
,@active_start_date = 20180205
,@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_primary_secondary
@primary_database = N'InsideTSQL2008'
,@secondary_server = N'WIN-P4'
,@secondary_database = N'InsideTSQL2008'
,@overwrite = 1
-- ****** 结束: 要在主服务器 [WIN-P1] 上运行的脚本 ******
-- 在辅助服务器上执行下列语句,以便为数据库 [WIN-P4].[InsideTSQL2008]
-- 配置日志传送。
-- 需要在辅助服务器上 [msdb] 数据库的上下文中运行该脚本。
-------------------------------------------------------------------------------------
-- 添加日志传送配置
-- ****** 开始: 要在辅助服务器 [WIN-P4] 上运行的脚本 ******
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'WIN-P1'
,@primary_database = N'InsideTSQL2008'
,@backup_source_directory = N'\\WIN-P1\logshipping_log'
,@backup_destination_directory = N'c:\logshipping_log'
,@copy_job_name = N'LSCopy_WIN-P1_InsideTSQL2008'
,@restore_job_name = N'LSRestore_WIN-P1_InsideTSQL2008'
,@file_retention_period = 4320
,@monitor_server = N'WIN-P4'
,@monitor_server_security_mode = 0
,@monitor_server_login = N'logshipping'
,@monitor_server_password = N'**********'
,@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 = 30
,@freq_recurrence_factor = 0
,@active_start_date = 20180206
,@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 = 1
,@freq_subday_interval = 30
,@freq_recurrence_factor = 0
,@active_start_date = 20180206
,@active_end_date = 99991231
,@active_start_time = 80000
,@active_end_time = 235959
,@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'InsideTSQL2008'
,@primary_server = N'WIN-P1'
,@primary_database = N'InsideTSQL2008'
,@restore_delay = 60
,@restore_mode = 1
,@disconnect_users = 1
,@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
-- ****** 结束: 要在辅助服务器 [WIN-P4] 上运行的脚本 ******