(转载自http://support.microsoft.com/kb/224071/zh-cn) 如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置
参考 概要 本文描述如何更改任何 SQL Server 7.0、SQL Server 2000 或 SQL Server 2005 数据库的数据和日志文件的位置。
更改某些 SQL Server 系统数据库的位置必须遵循的步骤与更改用户数据库的位置必须遵循的步骤不同。将分别对这些特殊情况给予说明。 注意:SQL Server 7.0 系统数据库与 SQL Server 2000 不兼容。不要将 SQL Server 7.0 master、model、msdb 或分发数据库附加到 SQL Server 2000。如果您使用的是 SQL Server 2005,则只能将 SQL Server 2005 数据库附加到一个实例。 本文的所有示例都假设 SQL Server 安装在 D:\Mssql7 目录中,而且所有数据库和日志文件都位于默认目录 D:\Mssql7\Data 中。这些示例将所有数据库的数据和日志文件都移到 E:\Sqldata。 先决条件 • 从数据库的当前位置备份当前所有数据库,尤其是 master 数据库。 • 必须具有系统管理员 (sa) 权限。 • 必须知道数据库的所有数据文件和日志文件的名称及当前位置。注意:可以使用存储过程 sp_helpfile 来确定数据库所使用的所有文件的名称和当前位置:use <database_name>
go sp_helpfile go • 应可以以独占方式访问被移动的数据库。如果在此过程中出现问题并且无法访问已经移动的数据库,或无法启动 SQL Server,则需要查看 SQL Server 错误日志和 SQL Server 联机丛书以获取这些错误的更多信息。
移动用户数据库
以下示例将移动一个名为 mydb 的数据库,该数据库包含一个数据文件 Mydb.mdf 和一个日志文件 Mydblog.ldf。如果您要移动的数据库还有其他数据或日志文件,请在存储过程 sp_attach_db 中用一个逗号分隔的列表将它们全部列出。无论数据库包含多少文件,存储过程 sp_detach_db 都不会更改,原因是它不会列出这些文件。 1. 按如下所示分离数据库:use master go sp_detach_db 'mydb' go 2. 然后,将数据和日志文件从当前位置 (D:\Mssql7\Data) 复制到新位置 (E:\Sqldata)。 3. 按如下所示重新附加指向新位置中这些文件的数据库:use master go sp_attach_db 'mydb','E:\Sqldata\mydbdata.mdf','E:\Sqldata\mydblog.ldf' go 使用 sp_helpfile 确认文件位置的更改:use mydb go sp_helpfile go filename 列的值应当反映出新的位置。
移动 pubs 和 Northwind
使用与移动用户数据库相同的步骤。 移动 MSDB (SQL Server 7.0) 注意:如果您在移动 msdb 和 model 数据库的同时结合使用此过程,则重新附加的顺序必须首先是 model,然后是 msdb。如果首先重新附加的是 msdb,则必须将它分离,等到附加完 model 后再重新附加。 1. 确保 SQL Server 代理当前没有运行。 2. 使用与移动用户数据库相同的步骤。 注意:如果 SQL Server 代理正在运行,则 sp_detach_db 存储过程将会失败,并返回以下消息: 服务器:消息 3702,级别 16,状态 1,行 0 无法删除数据库 'msdb',因为该数据库当前正在使用。 DBCC 执行完毕。如果 DBCC 输出了错误消息,请与系统管理员联系。 移动 MSDB 数据库(SQL Server 2000 和 SQL Server 2005) 注意:如果您在移动 msdb 和 model 数据库的同时结合使用此过程,则重新附加的顺序必须首先是 model,然后是 msdb。如果首先重新附加的是 msdb,则必须将它分离,等到附加完 model 后再重新附加。在 SQL Server 2000 和 SQL Server 2005 中,不能使用 sp_detach_db 存储过程分离系统数据库。运行 sp_detach_db 'msdb' 将会失败并返回以下消息:
服务器:消息 7940,级别 16,状态 1,行 1 无法分离系统数据库 master、model、msdb 和 tempdb。 要在 SQL Server 2000 上移动 MSDB 数据库,请按照下列步骤操作: 1. 在 SQL Server 企业管理器中,右键单击服务器名,然后单击属性。 2. 在常规选项卡上,单击启动参数。 3. 添加一个新参数“-T3608”(不带引号)。 添加跟踪标记 3608 后,按照下列步骤操作: 1. 停止并重新启动 SQL Server。 2. 确保 SQL Server 代理服务当前没有运行。 3. 按如下所示分离 msdb 数据库:use master go sp_detach_db 'msdb' go 4. 将 Msdbdata.mdf 和 Msdblog.ldf 文件从当前位置 (D:\Mssql8\Data) 移到新位置 (E:\Mssql8\Data)。 5. 在企业管理器中,从启动参数框中删除 -T3608 跟踪标记。 6. 停止并重新启动 SQL Server。 7. 按如下所示重新附加 MSDB 数据库:use master go sp_attach_db 'msdb','E:\Mssql8\Data\msdbdata.mdf','E:\Mssql8\Data\msdblog.ldf' go 注意:如果您试图通过使用跟踪标记 -T3608 启动 SQL Server 来重新附加 msdb 数据库,会收到以下错误: 服务器:消息 615,级别 21,状态 1,行 1 未能找到 ID 为 3,名称为 'model' 的数据库表。
如果您使用的是 SQL Server 2005
可以使用 SQL Server 配置管理器来更改 SQL Server 服务的启动参数。有关如何更改启动参数的更多信息,请访问以下 Microsoft Developer Network 网站: http://msdn2.microsoft.com/zh-cn/library/ms190737.aspx (http://msdn2.microsoft.com/zh-cn/library/ms190737.aspx) 移动 MSDB 数据库后,可能会收到以下错误消息: 错误 229:拒绝了对对象 'ObjectName' (数据库 'master',所有者 'dbo')的执行权限。 发生此问题的原因是所有权链断裂。MSDB 数据库和 master 数据库的所有者不相同。因此,MSDB 数据库的所有权已经发生更改。要解决此问题,请在 Isql.exe 命令行实用工具或 Osql.exe 命令行实用工具中运行以下命令: USE MSDB Go EXEC sp_changedbowner 'sa' Go 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 272424 (http://support.microsoft.com/kb/272424/) INF:数据库范围内的对象所有权链检查取决于映射至对象所有者的登录信息 移动 master 数据库 1. 在 SQL Server 企业管理器中,更改 master 数据和日志文件的路径。注意:您也可以在此更改错误日志的位置。
2. 在企业管理器中,右键单击 SQL Server,然后单击属性。 3. 单击启动参数,将会显示以下条目:-dD:\MSSQL7\data\master.mdf -eD:\MSSQL7\log\ErrorLog -lD:\MSSQL7\data\mastlog.ldf -d 是 master 数据库数据文件的完全限定路径。-e 是错误日志文件的完全限定路径。
-l 是 master 数据库日志文件的完全限定路径。
4. 按如下所示更改这些值: a. 删除 Master.mdf 和 Mastlog.ldf 文件的当前条目。 b. 添加指定新位置的新条目:-dE:\SQLDATA\master.mdf -lE:\SQLDATA\mastlog.ldf 5. 停止 SQL Server。 6. 将 Master.mdf 和 Mastlog.ldf 文件复制到新位置 (E:\Sqldata)。 7. 重新启动 SQL Server。
移动 model 数据库
要移动 model 数据库,必须用跟踪标记 3608 启动 SQL Server,这样它不会恢复除 master 之外的任何数据库。注意:此时,您不能立即访问任何用户数据库。使用此跟踪标记时,除下列步骤外,不要执行其他任何操作。要将跟踪标记 3608 添加为 SQL Server 启动参数,请按照下列步骤操作: 1. 在 SQL Server 企业管理器中,右键单击服务器名,然后单击“属性”。
2. 在“常规”选项卡上,单击“启动参数”。 3. 添加一个新参数“-T3608”(不带引号)。添加跟踪标记 3608 后,按照下列步骤操作: 1. 停止并重新启动 SQL Server。
2. 按如下所示分离“model”数据库:use master go sp_detach_db 'model' go 3. 将 Model.mdf 和 Modellog.ldf 文件从 D:\Mssql7\Data 移到 E:\Sqldata。 4. 按如下所示重新附加 model 数据库:use master go sp_attach_db 'model','E:\Sqldata\model.mdf','E:\Sqldata\modellog.ldf' go 5. 在企业管理器中,从启动参数框中删除 -T3608 跟踪标记。 6. 停止并重新启动 SQL Server。您可以使用 sp_helpfile 确认文件位置的更改:use model go sp_helpfile go
移动 tempdb
您可以使用 ALTER DATABASE 语句来移动 tempdb 文件。 1. 按如下所示使用 sp_helpfile 确定 tempdb 数据库的逻辑文件名:use tempdb go sp_helpfile go 每个文件的逻辑名均包含在名称列中。该示例使用了默认文件名 tempdev 和 templog。 2. 按如下所示使用 ALTER DATABASE 语句指定逻辑文件名:use master go Alter database tempdb modify file (name = tempdev, filename = 'E:\Sqldata\tempdb.mdf') go Alter database tempdb modify file (name = templog, filename = 'E:\Sqldata\templog.ldf') go 应当收到以下确认更改的消息: 文件“tempdev”在 sysaltfiles 中被修改。重新启动 SQL Server 后会删除旧文件。文件“templog”在 sysaltfiles 中被修改。重新启动 SQL Server 后会删除旧文件。
3. 在 tempdb 中使用 sp_helpfile 将会在重新启动 SQL Server 后才确认这些更改。 4. 停止并重新启动 SQL Server。