如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置(转载)

转载 2008年05月26日 16:34:00

(载自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。


相关文章推荐

sql server 数据牵移到MySQL中

SQL Server 迁移数据到MySQL 2013-08-05 11:59 by 听风吹雨, 29379 阅读, 20 评论, 收藏, 编辑 今天将数据转换成功了,感谢听风吹雨。博客转载...

SQL Server数据库ROW_NUMBER()函数使用详解

SQL Server数据库ROW_NUMBER()函数的使用是本文我们要介绍的内容,接下来我们就通过几个实例来一一介绍ROW_NUMBER()函数的使用。 实例如下: 1.使用row_...
  • zgyhh
  • zgyhh
  • 2013年04月16日 17:23
  • 464

数据库之SQL SERVER中使用函数去掉结果数据中的空格

SQLSERVER中使用函数去掉数据中的空格 某天查询两个表的数据,用一个inner join联接来找出两个表中NAME相同的记录,但是在查找过程中发现 有一些记录select不出来 ...
  • lqhed
  • lqhed
  • 2016年05月24日 18:03
  • 182

SQL Server数据库Substring函数使用方法小结

在SQL Server数据库操作中,我们常常会用到Substring函数,本文我们对Substring函数的使用方法进行了总结,并通过例子对它的使用方法加以说明。接下来就让我们来一起了解一下Subst...

向SQL Server 数据库中使用SQL Script向表添加列并指定添加列的位置

使用SQL语句向数据表中添加列,我想大家都清楚该如何做,示例如下: use test go alter table testadd add testid int not null defau...

在SQL Server数据库中,格式转换可以使用CAST()函数和CONVERT()函数

SQL Server数据库:在SQL Server数据库中,格式转换可以使用CAST()函数和CONVERT()函数,在这里主要介绍CONVERT()函数。 1. SelectCONVERT(var...

配置RTX腾讯通升级使用SQL Server数据库(转载后,重新编辑)

RTX数据库默认为Access,但可以根据自己需求转换为其他支持ODBC驱动的数据库,必须注意,RTX数据库的数据只允许通过RTXServer SDK接口来更新,不能直接操作数据库,直接操作数据将导致...

SQL Server 中如何移动tempdb到新的位置

SQL Server 中如何移动tempdb到新的位置 操作步骤; 1、检查tempdb的逻辑名字和它的存在位置。可以使用下面语句: SELECT name, physical_name...
  • kxjrzyk
  • kxjrzyk
  • 2015年02月28日 14:24
  • 327

SQL Server判断数据库、表、存储过程、函数是否存在

--1.判断数据库是否存在 IF EXISTS ( SELECT * FROM sys.databases WHERE NAME = '[数据库名]' ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置(转载)
举报原因:
原因补充:

(最多只允许输入30个字)