logshipping批量创建脚本

Posted ls11736

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logshipping批量创建脚本相关的知识,希望对你有一定的参考价值。

注意事项:

  • 只适用于可以Windows认证登录的instance
  • 两边目录都要实现可以互相访问
  • 实例要有权限访问目录
    共享目录设置
    技术图片

主库脚本

exec sp_configure ‘show advanced_options‘,1
reconfigure
exec sp_configure ‘xp_cmdshell‘,1
reconfigure
exec sp_configure ‘show advanced_options‘,0
reconfigure
go
USE [master]
GO

/****** Object:  StoredProcedure [dbo].[pri_logshipping_create]    Script Date: 2020/06/17 周三 21:44:35 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE proc [dbo].[pri_logshipping_create](
@pri_server nvarchar(40),
@pri_port nvarchar(10),
@std_server nvarchar(40),
@std_port nvarchar(10),
@ls_dir nvarchar(60),  --主库共享目录 D:log..
@interval nvarchar(3),
@ls_Databases nvarchar(300)=null, --要做logshipping的数据库
@nonls_databases nvarchar(300)= null
)
as
begin
-- create shared folders which are logshiping databases in pri and std
declare @db_name nvarchar(40)
declare @pri_mkdir_stmt nvarchar(100)
declare @std_mkdir_stmt nvarchar(100)
--declare @create_drive_stmt nvarchar(200)
--declare @drop_drive_stmt nvarchar(200)
declare @backup_stmt nvarchar(800)
declare @restore_stmt nvarchar(400)
declare @bak_time nvarchar(20)
declare @pri_instance nvarchar(40)=@pri_server+‘,‘+@pri_port
declare @std_instance nvarchar(40)=@std_server+‘,‘+@std_port
declare @pri_shared_dir nvarchar(100)=N‘\\‘+@pri_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @std_shared_dir nvarchar(100)=N‘\\‘+@std_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @pri_job_stmt nvarchar(max)

-- logshipping databases 
if @ls_databases is null 
	begin
		declare c1 cursor for select name from sys.databases 
		where database_id >4 
		and recovery_model_desc=‘FULL‘
		and state_desc=‘ONLINE‘
		and name not in(select value from string_split(@nonls_Databases,‘,‘))
	end
else
	begin
		declare c1 cursor for select name from sys.databases 
		where database_id >4 
		and recovery_model_desc=‘FULL‘
		and state_desc=‘ONLINE‘
		and name in(select value from string_split(@ls_Databases,‘,‘))
	end
/*
set @create_drive_stmt = ‘net use ‘+@pri_shared_dir+‘ /user:test password‘
print @create_drive_stmt
print @pri_shared_dir
print @std_shared_dir
*/
create table #temp_restore(stmt nvarchar(200))

open c1
fetch next from c1 into @db_name
while @@FETCH_STATUS=0
begin
set @bak_time = format(getdate(),‘yyyyMMdd_HHmmss‘)
set @pri_mkdir_stmt=‘mkdir ‘+@ls_dir+‘‘+@db_name
set @std_mkdir_stmt=‘mkdir ‘+@std_shared_dir+‘‘+@db_name
set @backup_stmt=‘BACKUP DATABASE ‘+@db_name+‘ TO  disk = ‘‘‘+@std_shared_dir+‘‘+@db_name+‘‘+@db_name+‘_‘+@bak_time+
‘.bak‘‘ WITH NOFORMAT, NOINIT,  NAME = ‘‘‘+@db_name+‘-Full Database Backup‘‘, SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10‘
set @restore_stmt=‘RESTORE DATABASE ‘+@db_name+‘ FROM disk =‘‘‘+@std_shared_dir+‘‘+@db_name+‘‘+@db_name+‘_‘+@bak_time+‘.bak‘‘ with norecovery‘
set nocount on
exec xp_cmdshell @pri_mkdir_stmt,no_output
exec xp_cmdshell @std_mkdir_stmt,no_output
exec sp_executesql @backup_stmt
insert into #temp_restore values(@restore_stmt)
/*
print @pri_mkdir_stmt
print @std_mkdir_stmt
print @backup_stmt
print @restore_stmt
*/

set @pri_job_stmt=‘
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 = ‘‘‘+@db_name+‘‘‘ 
		,@backup_directory = ‘‘‘ +@ls_dir+‘‘+@db_name+‘‘‘
		,@backup_share = ‘‘‘+@pri_shared_dir+‘‘+@db_name+‘‘‘ 
		,@backup_job_name = N‘‘LSBackup_‘+@db_name+‘‘‘ 
		,@backup_retention_period = 4320
		,@backup_compression = 1
		,@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_‘+@pri_instance+‘_‘+@db_name+‘‘‘ 
		,@enabled = 1 
		,@freq_type = 4 
		,@freq_interval = 1 
		,@freq_subday_type = 4 
		,@freq_subday_interval = ‘+@interval+‘ 
		,@freq_recurrence_factor = 0 
		,@active_start_date = 20200615 
		,@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‘‘‘+@db_name+‘‘‘
		,@secondary_server = N‘‘‘+@std_instance+‘‘‘ 
		,@secondary_database = N‘‘‘+@db_name+‘‘‘ 
		,@overwrite = 1‘
--print @pri_job_stmt

exec sp_executesql @pri_job_stmt
fetch next from c1 into @db_name
end
close c1
deallocate c1

select * from #temp_restore
drop table #temp_restore
end
GO

--删除主库配置
USE [master]
GO

/****** Object:  StoredProcedure [dbo].[del_pri_logshipping]    Script Date: 2020/06/17 周三 21:46:18 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE proc [dbo].[del_pri_logshipping](
@pri_server nvarchar(40),
@pri_port nvarchar(10),
@std_server nvarchar(40),
@std_port nvarchar(10),
@ls_dir nvarchar(60),  --主库共享目录 D:log..
@is_del nvarchar(1)=0,  --0不删除文件夹,1删除文件夹,默认0
@ls_Databases nvarchar(300)=null, --指定要删除的库
@nonls_databases nvarchar(300)= null
)
as
begin
-- create shared folders which are logshiping databases in pri and std
declare @db_name nvarchar(40)
declare @pri_instance nvarchar(40)=@pri_server+‘,‘+@pri_port
declare @std_instance nvarchar(40)=@std_server+‘,‘+@std_port
declare @pri_shared_dir nvarchar(100)=N‘\\‘+@pri_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @std_shared_dir nvarchar(100)=N‘\\‘+@std_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @pri_dir_del_stmt nvarchar(100)
declare @std_dir_del_stmt nvarchar(100)

-- logshipping databases 
if @ls_databases is null 
	begin
		declare c1 cursor for select primary_database 
		from msdb..log_shipping_primary_databases
		where primary_database not in(select value from string_split(@nonls_Databases,‘,‘))
	end
else
	begin
		declare c1 cursor for select primary_database 
		from msdb..log_shipping_primary_databases
		where primary_database in(select value from string_split(@ls_Databases,‘,‘))
	end


open c1
fetch next from c1 into @db_name
while @@FETCH_STATUS=0
begin
	exec sp_delete_log_shipping_primary_secondary 
		@primary_database=@db_name,
		@secondary_server=@std_instance,
		@secondary_database=@db_name
	exec sp_delete_log_shipping_primary_database @database=@db_name

	if @is_del=‘1‘
		begin
		set @pri_dir_del_stmt=N‘rd /S /Q ‘+@ls_dir+‘‘+@db_name
		set @std_dir_del_stmt=N‘rd /S /Q ‘+@std_shared_dir+‘‘+@db_name
		exec xp_cmdshell @pri_dir_del_stmt,no_output
		exec xp_cmdshell @std_dir_del_stmt,no_output
		end
	fetch next from c1 into @db_name
end
close c1
deallocate c1


end
GO

备库脚本

--先使用主库产生的语句恢复备库数据库
create proc std_logshipping_create(
@pri_server nvarchar(40),
@pri_port nvarchar(10),
@std_server nvarchar(40),
@std_port nvarchar(10),
@ls_dir nvarchar(60),  --主库共享目录 c:logshipping
@interval nvarchar(3),
@ls_Databases nvarchar(300)=null, --要做logshipping的数据库
@nonls_databases nvarchar(300)= null
)
as
begin
if @ls_databases is null 
	begin
	declare c1 cursor for select name from sys.databases 
	where database_id >4
	and state_desc=‘RESTORING‘
	and name not in(select value from string_split(@nonls_Databases,‘,‘))
	end
else
	begin
	declare c1 cursor for select name from sys.databases 
	where database_id >4
	and state_desc=‘RESTORING‘
	and name in(select value from string_split(@ls_Databases,‘,‘))
	end
declare @db_name nvarchar(40)
--declare @create_drive_stmt nvarchar(200)
--declare @drop_drive_stmt nvarchar(200)
declare @pri_instance nvarchar(40)=@pri_server+‘,‘+@pri_port
declare @std_instance nvarchar(40)=@std_server+‘,‘+@std_port
declare @pri_shared_dir nvarchar(100)=N‘\\‘+@pri_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @std_shared_dir nvarchar(100)=N‘\\‘+@std_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @std_job_stmt nvarchar(max)

open c1
fetch next from c1 into @db_name
while @@FETCH_STATUS=0
begin
	set @std_job_stmt=‘
	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‘‘‘+@pri_instance+‘‘‘ 
			,@primary_database = N‘‘‘+@db_name+‘‘‘ 
			,@backup_source_directory = N‘‘‘+@pri_shared_dir+‘‘+@db_name+‘‘‘ 
			,@backup_destination_directory = N‘‘‘+@std_shared_dir+‘‘+@db_name+‘‘‘ 
			,@copy_job_name = N‘‘LSCopy_‘+@pri_instance+‘_‘+@db_name+‘‘‘ 
			,@restore_job_name = N‘‘LSRestore_‘+@pri_instance+‘_‘+@db_name+‘‘‘
			,@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‘‘LSCopySchedule_‘+@pri_instance+‘_‘+@db_name+‘‘‘ 
			,@enabled = 1 
			,@freq_type = 4 
			,@freq_interval = 1 
			,@freq_subday_type = 4 
			,@freq_subday_interval = ‘+@interval+‘ 
			,@freq_recurrence_factor = 0 
			,@active_start_date = 20200615 
			,@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‘‘LSRestoreSchedule_‘+@pri_instance+‘_‘+@db_name+‘‘‘ 
			,@enabled = 1 
			,@freq_type = 4 
			,@freq_interval = 1 
			,@freq_subday_type = 4 
			,@freq_subday_interval = ‘+@interval+‘ 
			,@freq_recurrence_factor = 0 
			,@active_start_date = 20200615 
			,@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‘‘‘+@db_name+‘‘‘ 
			,@primary_server = N‘‘‘+@pri_instance+‘‘‘
			,@primary_database = N‘‘‘+@db_name+‘‘‘ 
			,@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 

	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 ‘

	--print @std_job_stmt
	exec sp_executesql @std_job_stmt
fetch next from c1 into @db_name
end
close c1
deallocate c1
end

--删除备库配置
go
USE [master]
GO

/****** Object:  StoredProcedure [dbo].[del_std_logshipping]    Script Date: 2020/06/17 周三 00:42:06 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE proc [dbo].[del_std_logshipping](
@pri_server nvarchar(40),
@pri_port nvarchar(10),
@std_server nvarchar(40),
@std_port nvarchar(10),
@ls_dir nvarchar(60),  --主库共享目录 D:log..
@is_del nvarchar(1)=‘0‘,  --0不删除文件夹,1删除文件夹,默认0
@ls_Databases nvarchar(300)=null, --指定要删除的库
@nonls_databases nvarchar(300)= null
)
as
begin
-- create shared folders which are logshiping databases in pri and std
declare @db_name nvarchar(40)
declare @pri_instance nvarchar(40)=@pri_server+‘,‘+@pri_port
declare @std_instance nvarchar(40)=@std_server+‘,‘+@std_port
declare @pri_shared_dir nvarchar(100)=N‘\\‘+@pri_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @std_shared_dir nvarchar(100)=N‘\\‘+@std_server+‘‘+SUBSTRING(@ls_dir,4,len(@ls_dir)-3)
declare @drop_db_stmt nvarchar(60)
-- logshipping databases 
if @ls_databases is null 
	begin
		declare c1 cursor for select secondary_database 
		from msdb..log_shipping_secondary_databases
		where secondary_database  not in(select value from string_split(@nonls_Databases,‘,‘))
	end
else
	begin
		declare c1 cursor for select secondary_database 
		from msdb..log_shipping_secondary_databases
		where secondary_database  in(select value from string_split(@ls_Databases,‘,‘))
	end

open c1
fetch next from c1 into @db_name
while @@FETCH_STATUS=0
begin
	exec sp_delete_log_shipping_secondary_database @secondary_database=@db_name
	exec sp_delete_log_shipping_secondary_primary 
		@primary_server=@pri_instance,
		@primary_database=@db_name
	EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = @db_name
	if @is_del=‘1‘
	begin
		set @drop_db_stmt=‘drop database ‘+@db_name
		exec sp_executesql @drop_db_stmt
	end
	fetch next from c1 into @db_name
end
close c1
deallocate c1
end


GO

脚本使用

主库使用

exec pri_logshipping_create 
@pri_server=‘192.168.70.151‘,
@pri_port=‘1433‘,
@std_server=‘192.168.70.152‘,
@std_port=‘1433‘,
@ls_dir=‘C:logshipping‘, --主库共享目录
@interval=1,
@ls_Databases=null,  --逗号分隔
@nonls_Databases=null

--复制产生的恢复语句至备库执行

备库使用

--执行主库产生的恢复语句
exec std_logshipping_create 
@pri_server=‘192.168.70.151‘,
@pri_port=‘1433‘,
@std_server=‘192.168.70.152‘,
@std_port=‘1433‘,
@ls_dir=‘C:logshipping‘, --主库共享目录
@interval=1

删除配置

先备库执行

exec del_std_logshipping 
@pri_server=‘192.168.70.151‘,
@pri_port=‘1433‘,
@std_server=‘192.168.70.152‘,
@std_port=‘1433‘,
@ls_dir=‘C:logshipping‘, --主库共享目录
@is_del=‘1‘, --是否删除数据.0-否,默认.1-是
@ls_Databases=null,
@nonls_Databases=null

后主库执行

exec del_pri_logshipping 
@pri_server=‘192.168.70.151‘,
@pri_port=‘1433‘,
@std_server=‘192.168.70.152‘,
@std_port=‘1433‘,
@ls_dir=‘C:logshipping‘, --主库共享目录
@is_del=‘1‘,
@ls_Databases=null,
@nonls_Databases=null


以上是关于logshipping批量创建脚本的主要内容,如果未能解决你的问题,请参考以下文章

用shell脚本实现批量创建用户并修改密码

用shell脚本实现批量创建用户并修改密码

用shell脚本实现批量创建用户并修改密码

批量创建用户脚本

Shell脚本实战之文件批量创建和修改

shell 脚本(批量创建脚本)