如何通过分离和附加来移动数据库 (Transact-SQL)

重要说明重要提示

我们建议您使用 ALTER DATABASE 计划重定位过程(而不使用分离和附加操作)移动数据库。有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)

您可以将分离的数据库移至其他位置,并将其重新附加到相同或不同的服务器实例。

安全说明安全说明

建议您不要从未知或不可信来源附加或还原数据库。此类数据库可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构或物理数据库结构导致错误。使用来自未知或不可信来源的数据库前,请在非生产服务器上针对数据库运行 DBCC CHECKDB,然后检查数据库中的代码,例如存储过程或其他用户定义代码。

将包含全文目录文件的 SQL Server 2005 数据库附加到 SQL Server 2008 服务器实例上时,会将目录文件从以前的位置与其他数据库文件一起附加,与在 SQL Server 2005 中一样。有关详细信息,请参阅全文搜索升级。当从 SQL Server 2008 服务器实例上分离升级的包含全文目录文件的 SQL Server 2005 数据库时,这些目录文件及其他数据库文件将保持不变,与在 SQL Server 2005 中一样。

注意注意

也可以使用分离和附加操作将 SQL Server 2000 或 SQL Server 2005 数据库升级到 SQL Server 2008。有关详细信息,请参阅如何使用分离和附加来升级数据库 (Transact-SQL)

过程

通过分离和附加来复制数据库

  1. 使用 sp_detach_db 存储过程分离该数据库。

  2. 在 Windows 资源管理器或 Windows“命令提示符”窗口中,将分离的数据库文件和日志文件移至新位置。

    注意注意

    移动单文件数据库时,如果文件小到可以通过电子邮件发送,则可以通过电子邮件来移动该数据库。

    即使打算创建新的日志文件,也应该移动日志文件。在某些情况下,重新附加数据库需要使用其现有的日志文件。因此,除非在不使用分离日志文件的情况下可以成功附加数据库,否则,请始终保留所有分离的日志文件。

    注意注意

    如果尝试在不指定日志文件的情况下附加数据库,则附加操作会在日志文件的原始位置中查找文件。如果原始位置还有一份日志,则附加该日志。若要避免使用原始日志文件,请指定新日志文件的路径,或在日志文件复制到新位置之后,删除其原始副本。

  3. 使用包含 FOR ATTACH [WITH <Service Broker 选项>] 子句或 FOR ATTACH_REBUILD_LOG 子句的 CREATE DATABASE Transact-SQL 语句来附加复制的文件(有关详细信息,请参阅 CREATE DATABASE (Transact-SQL))。每个数据库都包含用于将 Service Broker 消息路由到该数据库的唯一标识符。如果数据库使用了 Service Broker,请参阅管理 Service Broker 标识

    注意注意

    有关使用对象资源管理器来附加数据库的信息,请参阅如何附加数据库 (SQL Server Management Studio)

示例

以下示例创建名为 MyAdventureWorks 的 AdventureWorks2008R2 数据库副本。AdventureWorks2008R2 附加到服务器实例,Transact-SQL 语句即在与该服务器实例连接的查询编辑器窗口中执行。

  1. 执行以下 Transact-SQL 语句以分离 AdventureWorks2008R2 数据库:

    USE master;
    GO
    EXEC sp_detach_db @dbname = N'AdventureWorks2008R2';
    GO
    
  2. 使用您选择的方法,将数据库文件(AdventureWorks2008R2_Data.mdf 和 AdventureWorks2008R2_log)分别复制到:C:\MySQLServer\AdventureWorks2008R2_Data.mdf 和 C:\MySQLServer\AdventureWorks2008R2_Log.ldf。

    重要说明重要提示

    对于生产数据库,请将数据库和事务日志存放在不同的磁盘上。

    若要通过网络将文件复制到远程计算机的磁盘上,请使用远程位置的通用命名约定 (UNC) 名称。UNC 名称采用以下格式:**\\服务器名称\共享名\路径\**文件名。将文件写入至本地硬盘时,必须对 SQL Server 实例使用的用户帐户授予读写远程磁盘文件所需的相应权限。

  3. 通过执行以下 Transact-SQL 语句来附加移动的数据库及其日志(可选):

    USE master;
    GO
    CREATE DATABASE MyAdventureWorks 
        ON (FILENAME = 'C:\MySQLServer\AdventureWorks2008R2_Data.mdf'),
        (FILENAME = 'C:\MySQLServer\AdventureWorks2008R2_Log.ldf')
        FOR ATTACH;
    GO
    
    注意注意

    在 SQL Server Management Studio 中,新附加的数据库在对象资源管理器中不是立即可见的。若要查看数据库,请在对象资源管理器中,单击“查看”,再单击“刷新”。在对象资源管理器中展开“数据库”节点后,新附加的数据库即显示在数据库列表中。