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

安全说明安全说明

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

在 SQL Server 2008 中,可以使用分离和附加操作将用户数据库从 SQL Server 2000 或 SQL Server 2005 升级。将 SQL Server 2005 或 SQL Server 2000 数据库附加到 SQL Server 2008 后,该数据库将立即变为可用,然后会自动进行升级。

但是,存在下列限制:

  • 不能附加使用 SQL Server 2000 或 SQL Server 2005 创建的 mastermodelmsdb 数据库的副本。

  • 附加复制的而不是分离的复制数据库时:

    • 如果将该数据库附加到同一服务器实例的升级版本中,则必须在附加操作完成后执行 sp_vupgrade_replication 来升级复制数据库。有关详细信息,请参阅 sp_vupgrade_replication (Transact-SQL)

    • 如果将该数据库附加到不同的服务器实例中(不考虑版本),则必须在附加操作完成后执行 sp_removedbreplication 来删除复制数据库。有关详细信息,请参阅 sp_removedbreplication (Transact-SQL)

  • 当对从 SQL Server 2000 升级到 SQL Server 2008 的数据库使用 APPLY、PIVOT、TABLESAMPLE 或 UNPIVOT 关键字时,必须将数据库的兼容级别设置为 100。若要设置数据库兼容级别,请参阅 sp_dbcmptlevel (Transact-SQL)

    重要说明重要提示

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

全文索引升级选项

注意注意

将 SQL Server 2005 或 SQL Server 2000 数据库附加到 SQL Server 2008 后,该数据库将立即变为可用,然后会自动进行升级。如果数据库具有全文索引,升级过程将导入、重置或重新生成它们,具体取决于 upgrade_option服务器属性的设置。如果将升级选项设置为“导入”(upgrade_option = 2) 或“重新生成”(upgrade_option = 0),在升级过程中将无法使用全文索引。根据编制索引的数据量,导入可能需要数小时,而重新生成最多可能需要十倍的时间。另请注意,如果将升级选项设置为“导入”,并且全文目录不可用,则会重新生成关联的全文索引。若要更改 upgrade_option 服务器属性的设置,请使用 sp_fulltext_service

步骤

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

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

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

    注意注意

    在 SQL Server 2005 中,此存储过程具有新的选项。有关详细信息,请参阅 sp_detach_db (Transact-SQL)

  2. (可选)移动所分离的数据库文件和日志文件。

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

    注意注意

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

  3. 使用带有 FOR ATTACH 或 FOR ATTACH_REBUILD_LOG 选项的 CREATE DATABASE 语句,将复制的文件附加到 SQL Server 2005 实例。

    注意注意

    有关如何使用对象资源管理器附加 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 联机丛书。

升级后的数据库兼容级别

升级后,tempdbmodelmsdbResource 数据库的兼容级别将设置为 100。master 系统数据库保留它在升级之前的兼容级别,除非该级别小于 80。如果 master 的兼容级别在升级前小于 80,升级后兼容级别将设置为 80。

如果升级前用户数据库的兼容级别为 80 或 90,升级后将保持相应级别。如果升级前兼容级别为 70 或更低,则在升级后的数据库中,兼容级别将设置为 80,该级别为 SQL Server 2008 支持的最低兼容级别。

注意注意

新的用户数据库将继承 model 数据库的兼容级别。

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

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

示例

下面的示例通过使用 Transact-SQL 语句分离和附加数据库,将 SQL Server 2000pubs 数据库升级为 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\MSSQL10.MSSQLSERVER\MSSQL\Data\(这是 SQL Server 2005 数据目录)。

    重要说明重要提示

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

    注意注意

    请使用远程位置的通用命名约定 (UNC) 名称,通过网络将文件复制到远程计算机上的磁盘中。UNC 名称采用以下格式:\\服务器名称\共享名称\路径\文件名。为了向本地硬盘中写入文件,SQL Server 使用的用户帐户必须被授予在远程磁盘上读取或写入文件所需的权限。

  3. 将复制的 pubs 数据库和(可选的)日志文件附加到 SQL Server 2005 实例(此示例使用相同的数据库名称)。在 SQL Server Management Studio 中,打开新的查询编辑器查询并连接到要附加该数据库的服务器实例。

    执行以下 CREATE DATABASE 语句。

    USE master;
    GO
    CREATE DATABASE pubs ON PRIMARY 
       (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\pubs.mdf')
       LOG ON (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\pubs_log.ldf')
       FOR ATTACH;
    GO
    
    注意注意

    在 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