正在使用的数据库服务器机器名称为DB1,数据库系统是SqlServer2005,版本号:9.0.3042,实例名称Instance1,即DB1/Instance1(9.0.3042)。此实例下面有若干个数据库系统。在此举一个数据库UR(其它的数据库迁移同此一样)。
UR数据库上面有很多应用于不同App的role&login&user。
要迁移到的目标数据库服务器机器名称为DB2,其它的,像数据库系统,版本号,实例名称,和数据库名称都是一样的。App对数据库的访问是基于TCP/IP网络的,不使用机器名称。
考虑过的解决方案有:
1. 将DB1与DB2做一个镜像,将DB1的数据镜像到DB2上面,再对DB2上面的数据库做一个恢复,就可以直接使用。此方案由于之前DB1与另一台机器做了镜像,而无法(此时我想到可不可以一台机器有两个镜像呢?这个要试一下的,或者找到MSDN文档看一下)。总之,镜像这个方案没有实施。
2. 使用发布-订阅功能,使得两边的数据同步,但是,首先,master数据库上面保存的大量的role&login&user无法搞到DB2上面。其次,由于DB1上面并不是所有的表都有主键,所以发布-订阅这一方案流产。
其实要解决的问题主要是原先DB1上面大量基于App的role&login&user要迁移到DB2上面。即,不影响App的正常运行,哪怕App停下来一时半刻也不碍事(这个系统就是这样,别动App,但可以让它休息一会儿),想过将DB1上面的用户脚本让系统给创建出来,后来到DB2上面一运行,错误太多,由于脚本量实在太大,便没读下去。
现在想出来的法子是,将DB2上面的master数据库还原到DB1上面。再将其它的数据库也还原到DB1上面,就OK了。
Step 1.将Master数据还原
将DB2上面数据库系统以单用户模式启动。方法(我说的是SqlServer2005):
Win+R--->输入services.msc--->打开服务,选择SQL Server(Instance1)--->停止--->双击这个服务,打开一个对话框,如下图:
在启动参数一栏输入-f –c –m
其中:-c 可以缩短启动时间,SQL Server不作为Windows NT的服务启动;
-f 用最小配置启动SQL Server;
-m 单用户模式启动SQL Server。
启动以后,SqlServer Instance实例就在单用户模式下面运行了。
然后运行下面的脚本来还原DB1上面的Master数据库,(将这段脚本用*.sql文体保存下来,双击这个文件,即,以一个用户来运行这段脚本,不要打开Instance连接,然后再新建立查询,因为打开Instance是一个用户,而新建立查询又是另一个用户,现在SqlServer在单用户模式下面,后面那个新建立的查询是无法运行的!)
use master
go
restore database master
from disk='F:/master.bak'
with replace
运行完这段脚本后,服务器(Instance1实例)会自动停止服务。得再启动SqlServer Instance1的服务,这个时候就不要使用单用户模式了,就像平常那样启动SqlServer服务即可。
Step 2.将UR数据库还原(其它数据库也像UR数据库一样)
将Master数据库还原之后,创建UR数据库,然后还原,就像在一般的还原数据库一样。
我在做的时候,由于先还原了UR数据库,而后还原了Master数据库,导致UR数据库变成了数据库库快照。得再次将UR数据库还原才行,还原的时候得选择目标数据库(即,在DB2上面UR数据库)的mdf和ldf文件,要不然的话,系统会选择DB1上面的数据库路径进行还原,这个时候有可能不成功(如果DB1上面的数据库文件存储目录与DB2上面的数据库文件存储目录不一致,就不会成功)。
还有一点就是,我参考MSDN上面的文档,文档上说,在还原UR数据库的时候有两种方式,一种是使用附加数据库的方式,还有一种是使用还原数据库的方式,由于我之前是做的数据库备份(*.bak & *.trn)文件,所以我选择使用还原数据库的方式,不过MSDN文档库上面建议使用附加数据库的方式。
以上是个人在对实际中一些工作的小结,供自己查阅和大家参考(可能大家做的时候又是另一回事情了)。