很少摸 Windows 环境下的东西,最近被个 MS SQL Server 的数据库搞得头大。实在不像 MySQL 那样用起来轻车熟路, OrZ ...
本来以为企业管理器里面既然提供了 DTS 数据导入/导出 的功能,直接使用 DTS 指定源和目标库就可以完全复制数据库到远程服务器上了。结果发现除了表的基本结构和数据,字段约束、键值、默认值等都没过去。最终还是要靠直接磁盘拷贝数据文件了事。
如果数据库服务可以停下来的话,最快的方法是直接拷贝对应的 .mdf 和 .ldf 文件(在企业管理器选择数据库右键看属性的“数据文件”项确定文件名);然后执行T-SQL命令(比如新的目标数据库名为 test ):
-- 如果 test 数据库已经存在,需要先把其分离。
-- 如果已经有应用连接到该数据库的话,使用以下语句强制断开现有连接
ALTER DATABASE testSET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
-- 分离tst数据库
EXEC sp_detach_db
@dbname = 'test',
@skipchecks = 'true'-- 把拷贝出来的 .mdf 文件和 .ldf 文件作为 test 数据库的数据文件挂上去
EXEC sp_attach_db@dbname = 'test',
@filename1 = 'e:\db\test.mdf',
@filename2 = 'e:\db\test.ldf'-- 如果不想使用原来的 .ldf 文件,也可以单独挂 .mdf 文件
EXEC sp_attach_single_file_db@dbname = 'test',
@physname = 'e:\db\test.mdf'如果当前数据库处于生产环境不允许关闭服务的话,可以使用 BACKUP / RESTORE 的方法来完成复制工作:
-- 把数据库名为realdb的数据库备份到指定的磁盘文件
-- 用 WITH FORMAT 参数对bak文件进行格式化,以便进行完整重写
BACKUP DATABASE realdb TO DISK = 'E:\db\BAK_FOR_realdb.bak' WITH FORMAT
-- 用 RESTORE FILELISTONLY 命令查看数据库备份文件里面的
-- 数据文件和日志文件的逻辑名称,用于下一步的命令
RESTORE FILELISTONLY FROM DISK = 'E:\db\BAK_FOR_realdb.bak'-- 使用备份文件创建一个新的数据库, realdb_dat 和 realdb_log
-- 分别是上面使用 RESTORE FILELISTONLY 命令查出的数据文件逻辑
-- 名称
RESTORE DATABASE test
FROM DISK = 'E:\db\BAK_FOR_realdb.bak'
WITH MOVE 'realdb_dat' TO 'E:\db\test.mdf',
MOVE 'realdb_log' TO 'E:\db\test.ldf'
GO