月夜钓钱江鱼

醉后不知天在水,满船清梦压星河。
posts - 50,comments - 8,views - 29026

在主服务器上增加备份的存储过程,然后把备份文件存储在备份服务器上,备份服务器启动还原存储过程,实现了数据的还原

具体如下:

在主服务器上的数据库对要进行备份的数据库新建备份存储过程,并把备份文件复制到备份服务器上

主服务器上的备份存储过程如下所示:

复制代码
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:kingkie
-- Create date: 
-- Description:    
-- =============================================
ALTER PROCEDURE [dbo].[BackUpDataBaseTo] 
    -- Add the parameters for the stored procedure here
AS

declare @device varchar(255)
declare @path varchar(255)
declare @dbname varchar(255)
declare @filename varchar(255)
declare @cmd varchar(255)

BEGIN
--exec master..xp_cmdshell 'net use z: \\192.168.11.128\C$\BackUp 123456abcd /user:DataBaseP\ReplUser-P'

/*--说明: 
exec master..xp_cmdshell 'net use z: \\xz\c$ "密码" /user:xz\administrator' 

z:是映射网络路径对应本机的盘符, \\xz\c$是要映射的网络路径 
xz\administrator xz是远程的计算机名, administrator是登陆的用户名 
密码 面指定的administrator用户的密码 
--*/ 

set @dbname = 'SmartPas' 
set @path = 'D:\database\' 
set @filename = @dbname+'_Ts_'+ convert(char(8),getdate(),112)+substring(replace(convert(char(9),getdate(),114),':',''),0,3)+'.bak' 

set @device=@path + @filename
 
--备份;with init覆盖 ¦noinit添加 先备份到本机再复制过去.
backup database SmartPas to disk = @device with init 

set @cmd = 'copy '+ @device +' z:' 
--COPY 
exec master..xp_cmdshell @cmd 

--删除(这句可以去掉) 
--set @cmd = 'del ' +  @device 
--exec master..xp_cmdshell @cmd 

--完成后删除映射 
--exec master..xp_cmdshell 'net use z: /delete' 

---完全备份,覆盖原有文件
---BACKUP DATABASE @dbname TO  DISK = @device with init
---完全备份,在原有文件后面追加
---BACKUP DATABASE @dbname TO  DISK = @device 
---差异备份
---BACKUP DATABASE @dbname TO  DISK = @device WITH  DIFFERENTIAL
    SET NOCOUNT ON;

END
复制代码

使用映射时需要打开xp_cmdshell服务,可以使用代码打开配置增加这个功能,也可以在外围配置服务上增加,打开设置代码如下

EXEC sp_configure N'show advanced options',N'1'

RECONFIGURE WITH OVERRIDE

EXEC sp_configure N'xp_cmdshell',N'1'

RECONFIGURE WITH OVERRIDE

EXEC sp_configure N'show advanced options',N'0'

映射时备份服务器上需要设置共享文件夹给主服务器读写的权限,这一步是异地备份的关键。

在备份服务器上增加一个还原的存储过程,注意,这个存储过程不要建立在还原的数据库上,不然会被占用,无法还原

还原代码如下所示:

复制代码
 1 set ANSI_NULLS ON
 2 set QUOTED_IDENTIFIER ON
 3 go
 4 
 5 ALTER PROCEDURE [dbo].[DataBaseRestore] 
 6 AS
 7 
 8 declare @device varchar(255)
 9 declare @path varchar(255)
10 declare @dbname varchar(255)
11 declare @filename varchar(255)
12 declare @cmd varchar(255)
13 
14 set @dbname = 'SmartPas'
15 set @path = 'D:\database\' --备份文件存储位置
16 set @filename = @dbname+'_Ts_'+ convert(char(8),getdate(),112)+substring(replace(convert(char(9),getdate(),114),':',''),0,3)+'.bak' 
17 set @device=@path + @filename 
18 declare @sql nvarchar(4000),@par nvarchar(1000)
19 if not exists( 
20  select * from master..sysdatabases 
21   where name=@dbname
22   )
23  begin
24  --select @flag='db not exist'  /*数据库不存在*/
25     return 2
26  end
27 else
28  begin
29  --存在数据库就判断文件是否存在
30    declare @num int --申明一个接受返回值的变量
31    EXEC xp_fileexist @device ,@num output -- 执行文件存在否的验证 存在返回1 不存在返回0
32    if(@num = 1) --如果存在就执行还原
33    begin
34       --begin tran tDeal
35       --begin try
36 
37            exec ('alter database '+@dbname+' set offline WITH ROLLBACK IMMEDIATE;')
38 
39            select @sql='RESTORE DATABASE @db_name FROM DISK=@filename with '
40            select @sql=@sql +' replace'
41            select @par='@db_name nvarchar(128),@filename nvarchar(260)'
42            execute sp_executesql @sql,@par,@db_name=@dbname,@filename=@device 
43 
44            exec ('alter database '+@dbname+' set online with rollback IMMEDIATE;')
45           --删除备份文件(这句可以去掉) 
46           --set @cmd = 'del ' +  @device 
47           --exec master..xp_cmdshell @cmd 
48       --end try
49       --begin catch    
50           --rollback tran tDeal
51           --return 0
52       --end catch
53    end
54  end
复制代码

备份好后删除备份文件,如果不删除文件会越来越大,需要维护备份的文件。经过公司的项目测试可以实现,这种方法实现了数据库的同步,但实时性等比较差,需要更进一步方案才好,解决了临时的需求。

 

posted on   湘灵  阅读(187)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示