使用SQLServer复制数据库

原因:两个项目同时操作同一个数据库

项目1:操作数据(CRUD)Create(创建)、ReadRetrieve(读取)、Update(更新)、Delete(删除)

项目2:使用中间件Redis,并只执行ReadRetrieve(读取)。

结果:项目1操作数据,项目二数据里外不一致。

解决办法将展示数据的项目连接数据库前一天的数据,就是将数据库拷贝到一个新的数据库中,单独只供展示的项目连接查询。

准备工作

在这里我是用手动创建了一个database1的数据库,然后创建了一张表user,并添加了2条数据:

我们需要复制到一个全新的数据库 database2中

第一条命令:

BACKUP DATABASE database1 TO DISK = 'd:\database1.bak'

注释:这里的database1就是需要复制的数据库名称,末尾的功能是将数据库bak文件复制到磁盘的路径,这里我是复制到d根目录:

第二条命令:

RESTORE FILELISTONLY FROM DISK = 'd:\database1.bak'

注释:这是获取database1的得到逻辑文件信息,等会会用到LogicalName、PhysicalName这两个的值。

第三条命令:

RESTORE DATABASE database2 
FROM DISK ='d:\database1.bak
WITH MOVE 'database1' TO 'D:\work\databases\sqlserver2012\实例根目录\MSSQL11.MSSQLSERVER\MSSQL\DATA\database2.mdf',
MOVE 'database1_log' TO 'D:\work\databases\sqlserver2012\实例根目录\MSSQL11.MSSQLSERVER\MSSQL\DATA\database2_log.ldf'

注释:

1:这是新数据库的名称,我们取名database2。

2:这是执行第一条命令时,产生的数据库备份文件的路径。

3、4:这是执行第二条命令的LogicalName,也就是在database1.bak中的LogicalName所对应的名字。

5、6:这个是新数据库PhysicalName的对应的名字,将第二条命令得到的PhysicalName复制过来,再将文件名前缀改成database2(这里我们使用的是sqlserver安装过程中悬着的实例根目录,将新复制的数据的实例也放在默认目录中,方便管理)。

执行完后,我们可以看见不光表结构有,数据也一并复制过来了:

最后将上面的命令封装到SQL server的代理中,让它定时执行:

发现的问题:因为每次执行前面第一条命令时,生成的database1.bak文件大小会累加,所以执行之前需要删除它。而且数据库如果不删除的话,新数据库的数据不会更新。所以这里我们需要:先删除.bak文件,再删除数据库,最后在复制数据库。

鼠标右键启动SQL Server 代理,然后鼠标右键作业,选择新建作业,输入作业名称:复制数据库databse1。

                                         

创建步骤:

步骤一:

      点击新建作业窗口左边的步骤,然后点击窗口底部的新建,输入步骤名称:删除bak文件。需注意的是,我们使用windows的命令del来删除文件。所以类型需要选择操作系统。命令:del D:\database1.bak,最后点击确定。

步骤二:

      再次新建一个步骤,输入步骤名称:删除新数据库database2。需注意的是数据库一直被项目连接着的,所以使用drop database database2肯定会报错。所以使用下面的代码,先将进程杀掉然后在删除数据库。命令:

USE MASTER    
GO    
     
DECLARE @dbname SYSNAME    
SET @dbname = 'database2' --这个是要删除的数据库库名    
     
DECLARE @s NVARCHAR(1000)    
DECLARE tb CURSOR LOCAL   
FOR  
    SELECT s = 'kill   ' + CAST(spid AS VARCHAR)  
    FROM   MASTER..sysprocesses  
    WHERE  dbid = DB_ID(@dbname)    
     
OPEN   tb      
FETCH   NEXT   FROM   tb   INTO   @s    
WHILE @@fetch_status = 0  
BEGIN  
    EXEC (@s)   
    FETCH NEXT FROM tb INTO @s  
END    
CLOSE   tb    
DEALLOCATE   tb    
  
EXEC ('drop   database   [' + @dbname + ']')

步骤三:

     再次新建一个步骤,步骤名:复制数据库,然后将第一条和第三条命令复制到命令中:

最后,设置三个步骤的流程:比如步骤一执行成功后应该执行步骤二,而步骤二执行成功后需要执行步骤三,步骤三执行成功后就退出。三个步骤都有执行成功和执行失败,也就是6种可能。应该考虑这六种可能的情况设置执行流程。

双击一个步骤,点击高级,然后设置成功的操作和失败的操作:

我这里设置的是:

最后设置计划:

完工!

 
发布了47 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42428264/article/details/102764031
今日推荐