如何使用分离和附加来升级数据库 (Transact-SQL)

更新日期: 2005 年 12 月 5 日

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

在 SQL Server 2005 中,可以使用分离和附加操作将用户数据库从 SQL Server 7.0 版或 SQL Server 2000 升级到更高版本。但是,存在下列限制:

  • 使用 SQL Server 7.0 或 SQL Server 2000 创建的 mastermodelmsdb 数据库的备份不能附加到 SQL Server 2005 中。
  • 包含创建索引操作的 SQL Server 7.0 日志文件不能附加到 SQL Server 2000 或 SQL Server 2005 中。
ms189625.note(zh-cn,SQL.90).gif重要提示:
使用 SQL Server 6.5 或更早版本创建的数据库备份采用的格式不兼容,不能附加到 SQL Server 2005 中。
  • 附加复制的而不是分离的复制数据库时:
    • 如果将该数据库附加到同一服务器实例的升级版本中,则必须在附加操作完成后执行 sp_vupgrade_replication 来升级复制数据库。有关详细信息,请参阅 sp_vupgrade_replication (Transact-SQL)
    • 如果将该数据库附加到不同的服务器实例中(不考虑版本),则必须在附加操作完成后执行 sp_removedbreplication 来删除复制数据库。有关详细信息,请参阅 sp_removedbreplication (Transact-SQL)

对已经升级到 SQL Server 2005 的数据库使用 APPLYPIVOTTABLESAMPLEUNPIVOT 关键字时,必须将数据库的兼容级别设置为 90。若要设置数据库兼容级别,请参阅 sp_dbcmptlevel (Transact-SQL)

ms189625.note(zh-cn,SQL.90).gif重要提示:
在 SQL Server 2000 Service Pack 3 (SP3) 和 SQL Server 的更高版本中,附加和分离操作可以通过将数据库的 cross db ownership chaining 选项设置为 0 来禁用数据库的跨数据库所有权链接。有关禁用链接的信息,请参阅 cross db ownership chaining 选项

过程

使用分离和附加来升级数据库

  1. 使用 sp_detach_db 存储过程从 SQL Server 7.0 或 SQL Server 2000 实例分离数据库。

    有关详细信息,请参阅该版本 SQL Server 的 SQL Server 联机丛书。

    ms189625.note(zh-cn,SQL.90).gif注意:
    在 SQL Server 2005 中,此存储过程具有新的选项。有关详细信息,请参阅 sp_detach_db (Transact-SQL)
  2. (可选)移动所分离的数据库文件和日志文件。

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

    ms189625.note(zh-cn,SQL.90).gif注意:
    如果尝试在不指定日志文件的情况下附加数据库,则附加操作将会在日志文件的原始位置中查找文件。如果该位置仍存在日志文件的原始副本,则附加该副本。若要避免使用原始日志文件,请指定新日志文件的路径,或在日志文件复制到新位置之后,删除其原始副本。
  3. 使用带有 FOR ATTACH 或 FOR ATTACH_REBUILD_LOG 选项的 CREATE DATABASE 语句,将复制的文件附加到 SQL Server 2005 实例。

    ms189625.note(zh-cn,SQL.90).gif注意:
    有关如何使用对象资源管理器附加 SQL Server 2005 数据库的信息,请参阅如何附加数据库 (SQL Server Management Studio)
  4. 建议您对已升级的数据库运行 DBCC UPDATEUSAGE。

    在 SQL Server 的早期版本中,用于表和索引行计数以及页计数的值可能不正确。因此,根据 SQL Server 2005 之前的版本创建的数据库可能包含错误的计数。将数据库升级到 SQL Server 2005 之后,建议您运行 DBCC UPDATEUSAGE 以更正所有无效的计数。此 DBCC 语句可更正表或索引中每个分区的行数、已用页数、保留页数、叶级页数以及数据页数。有关详细信息,请参阅 DBCC UPDATEUSAGE (Transact-SQL)

  5. (可选)如果是复制数据库(而不是移动数据库),则可以使用 sp_attach_dbsp_attach_single_file_db 存储过程重新附加 SQL Server 7.0 或 SQL Server 2000 实例上的原始数据库。

    有关详细信息,请参阅该版本 SQL Server 的 SQL Server 联机丛书。

管理已升级服务器实例上的元数据

将数据库附加到其他服务器实例时,为了给用户和应用程序提供一致的体验,您可能需要在其他服务器实例上为数据库重新创建部分或全部元数据(例如登录名、作业和权限)。有关详细信息,请参阅当数据库在其他服务器实例上可用时管理元数据

示例

下面的示例通过使用 Transact-SQL 语句分离和附加数据库,将 SQL Server 2000 pubs 数据库升级为 SQL Server 2005 数据库。

  1. 将 SQL Server 2000 查询分析器连接到附加了 pubs 的服务器实例,并使用 sp_detach_db 存储过程分离数据库。

    USE master;
    GO
    EXEC sp_detach_db @dbname = N'pubs';
    GO
    
  2. 此示例的目的在于,使用您选择的方法将 pubs 文件(pubs.mdf 和 pubs_log.ldf) 从 C:\Program Files\Microsoft SQL Server\MSSQL\Data\(这是 SQL Server 2000 中 pubs 的默认位置)复制到 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\(这是 SQL Server 2005 数据目录)。

    ms189625.note(zh-cn,SQL.90).gif重要提示:
    对于生产数据库,请将数据库和事务日志存放在不同的磁盘上。
    ms189625.note(zh-cn,SQL.90).gif注意:
    请使用远程位置的通用命名约定 (UNC) 名称,通过网络将文件复制到远程计算机上的磁盘中。UNC 名称采用以下格式:\\服务器名称\共享名称\路径\文件名。为了向本地硬盘中写入文件,SQL Server 使用的用户帐户必须被授予在远程磁盘上读取或写入文件所需的权限。
  3. 将复制的 pubs 数据库和(可选的)日志文件附加到 SQL Server 2005 实例(此示例使用相同的数据库名称)。在 SQL Server Management Studio 中,打开新的查询编辑器查询并连接到要附加该数据库的服务器实例。

    ms189625.note(zh-cn,SQL.90).gif注意:
    有关详细信息,请参阅 SQL Server Management Studio Transact SQL 查询

    执行以下 CREATE DATABASE 语句。

    USE master;
    GO
    CREATE DATABASE pubs ON PRIMARY 
       (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\pubs.mdf')
       LOG ON (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\pubs_log.ldf')
       FOR ATTACH;
    GO
    
    ms189625.note(zh-cn,SQL.90).gif注意:
    在 SQL Server Management Studio 中,新附加的数据库在对象资源管理器中不是立即可见的。若要查看数据库,请单击“对象资源管理器”窗口,并选择“视图”>“刷新”。如果展开“数据库”节点,新附加的数据库现在就会显示在数据库列表中。
  4. (可选)使用 sp_attach_db 存储过程将原始 pubs 数据库重新附加到 SQL Server 2000 实例。在查询分析器中,输入以下语句:

    USE master;
    Go
    EXEC sp_attach_db @dbname = N'pubs', 
       @filename1 = 
          N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', 
       @filename2 = 
          N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf';
    GO
    

请参阅

任务

如何附加数据库 (SQL Server Management Studio)
如何使用复制数据库向导升级至 SQL Server 2005

概念

分离数据库和附加数据库
保护数据和日志文件的安全

其他资源

CREATE DATABASE (Transact-SQL)
使用升级顾问来准备升级

帮助和信息

获取 SQL Server 2005 帮助