SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

时间:2021-09-13 17:20:02

SQL Server的合并复制,是可以备份发布端和订阅端数据库为BAK文件的,但是问题是合并复制在数据库中自动创建的系统表、触发器、表中的RowGuid列等也会被一起备份。

这里我们举个例子,下面图中的EFDemo数据库就是由一个合并复制发布端的备份BAK文件还原的:

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

我们可以看到合并复制自动创建的系统表也被自动还原了。。。

 

我们再来看看数据库中的其它用户表,例如下面的[dbo].[Person]表,其中合并复制自动创建的RowGuid列、约束、触发器等也被还原了:

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

 

最大的问题是,SQL Server的Instance中,居然合并复制也被自动还原了。在还原数据库EFDemo前,Replication下的Local Publications文件夹是空的,但是还原后现在自动多了一个合并复制发布端。。。

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

而且最关键的是这个发布端实际上是坏的,无法使用,也无法删除。。。。,如下所示:

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

 

然后我想尝试去删除刚才还原的数据库EFDemo,结果也删不掉,提示Replication正在使用该数据库。。。

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

 

而且数据库EFDemo还莫名其妙的变为了SINGLE_USER模式,点击这里查看怎么将数据库使用的线程Kill掉,再变为MULTI_USER

 

 

解决办法

究其根本还是因为SQL Server在还原数据库EFDemo时,将数据库上的合并复制对象(系统表、触发器、表中的RowGuid列等)也一起还原了,那么我们就要想办法在数据库EFDemo被还原后,移除合并复制对象,其实很简单,运行下面的存储过程即可(关于怎么用存储过程来移除数据库的合并复制,可以查看这篇文章):

USE master
EXEC sp_removedbreplication @dbname='EFDemo'
GO

运行该存储过程后,我们再查看EFDemo数据库:

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

可以看到,合并复制自动创建的系统表、触发器、表中的RowGuid列等都被移除了,EFDemo瞬间变为了一个没有使用合并复制的数据库。

再看看Replication下的Local Publications文件夹,也空了:

SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库

 

好了现在数据库EFDemo总算顺利被还原了~