如何将数据库还原到新位置并使其具有新名称 (Transact-SQL)

本主题介绍如何将完整数据库备份还原到新位置并使其具有新名称(可选)。本过程可以让您在同一服务器实例或不同服务器实例上移动数据库或者创建数据库的副本。有关移动数据库时的注意事项的信息,请参阅通过备份和还原来复制数据库

前提条件和建议

  • 若要还原已加密的数据库,您必须有权访问用于对数据库进行加密的证书或非对称密钥。如果没有证书或非对称密钥,数据库将无法还原。因此,只要需要该备份,就必须保留用于对数据库加密密钥进行加密的证书。有关详细信息,请参阅 SQL Server 证书和非对称密钥

  • 出于安全性考虑,我们建议您不要从未知或不信任的源附加或还原数据库。此类数据库可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构或物理数据库结构导致错误。在使用未知或不可信源中的数据库之前,请在非生产服务器上的数据库中运行 DBCC CHECKDB,同时检查数据库中的代码(例如,存储过程或其他用户定义代码)。

升级后的数据库兼容级别

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

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

注意注意

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

步骤

将数据库还原到新位置并使其具有新名称

  1. (可选)确定包含要还原的完整数据库备份的备份集中文件的逻辑名称和物理名称。此语句返回备份集内包含的数据库和日志文件的列表。基本语法如下:

    RESTORE FILELISTONLY FROM <backup_device> WITH FILE = backup_set_file_number

    注意注意

    您可以通过使用 RESTORE HEADERONLY 语句来获取备份集的 backup_set_file_number。

    此语句还支持多个 WITH 选项。有关详细信息,请参阅 RESTORE FILELISTONLY (Transact-SQL)

  2. 使用 RESTORE DATABASE 语句还原完整数据库备份。默认情况下,数据文件和日志文件还原到它们的原位置。若要重新定位数据库,请使用 MOVE 选项重新定位每个数据库文件并避免与现有文件发生冲突。

    将数据库还原到新位置并使其具有新名称的基本 Transact-SQL 语法如下:

    RESTORE DATABASE new_database_name

    FROM backup_device [ ,...n ]

    [ WITH

       {

            [ RECOVERY | NORECOVERY ]

       [ , ] [ FILE ={ backup_set_file_number | @backup_set_file_number } ]

       [ , ] MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [ ,...n ]

       }

    ;

    注意注意

    准备将数据库重新定位到其他磁盘上时,应当验证是否有足够的可用空间并确定与现有文件之间的任何潜在冲突。这涉及到使用 RESTORE VERIFYONLY 语句,该语句指定您计划在 RESTORE DATABASE 语句中使用的相同 MOVE 参数。

    下表介绍了此 RESTORE 语句在将数据库还原到新位置时所涉及的参数。有关这些参数的详细信息,请参阅 RESTORE (Transact-SQL)

    • new_database_name
      数据库的新名称。

      注意注意

      如果要将数据库还原到其他服务器实例,则可以使用原始数据库名称而不是新名称。

    • backup_device [ ,...n ]
      指定包含 1 到 64 个备份设备的逗号分隔的列表,数据库备份将从这些备份设备中还原。您可以指定物理备份设备,也可以指定对应的逻辑备份设备(如果已定义)。若要指定物理备份设备,请使用 DISK 或 TAPE 选项:

      { DISK | TAPE } **=**physical_backup_device_name

      有关详细信息,请参阅备份设备

    • { RECOVERY | NORECOVERY }
      如果数据库使用完整恢复模式,则可能需要在还原该数据库后应用事务日志备份。在这种情况下,请指定 NORECOVERY 选项。

      否则,请使用默认值 RECOVERY 选项。

    • FILE = { backup_set_file_number | @backup_set_file_number }
      标识要还原的备份集。例如,backup_set_file_number 为 1 指示备份介质中的第一个备份集,backup_set_file_number 为 2 指示第二个备份集。您可以通过使用 RESTORE HEADERONLY 语句来获取备份集的 backup_set_file_number。

      未指定此选项时,默认为使用备份设备上的第一个备份集。

      有关详细信息,请参阅 RESTORE 参数 (Transact-SQL) 中的“指定备份集”。

    • MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [ ,...n ]
      指定由 logical_file_name_in_backup 指定的数据文件或日志文件将还原到 operating_system_file_name 指定的位置。请为每个要从备份集还原到新位置的逻辑文件指定 MOVE 语句。

      选项

      说明

      logical_file_name_in_backup

      指定备份集中数据文件或日志文件的逻辑名称。创建备份集时,备份集中的数据文件或日志文件的逻辑文件名与其在数据库中的逻辑名称匹配。

      注意注意
      若要从备份集中获取逻辑文件列表,请使用 RESTORE FILELISTONLY

      operating_system_file_name

      指定由 logical_file_name_in_backup 指定的文件的新位置。文件将还原到此位置。

      或者,operating_system_file_name 指定已还原文件的新文件名。如果您在相同服务器实例上创建现有数据库的副本,则此操作是必需的。

      n

      是指示可以指定其他 MOVE 语句的占位符。

注意注意

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

示例

说明

此示例创建一个名为 MyAdvWorks 的新数据库。MyAdvWorks 是现有 AdventureWorks2008R2 数据库的一个副本,其中包括以下两个文件:AdventureWorks2008R2_Data 和 AdventureWorks2008R2_Log。此数据库使用简单恢复模式。AdventureWorks2008R2 数据库已经存在于服务器实例上,因此备份中的文件必须还原到一个新位置。RESTORE FILELISTONLY 语句用于确定待还原数据库内的文件数及名称。该数据库备份是备份设备上的第一个备份集。

注意注意

有关如何创建 AdventureWorks2008R2 数据库的完整数据库备份的示例,请参阅 如何创建完整数据库备份 (Transact-SQL)

注意注意

备份和还原事务日志的示例(包括时点还原)使用从 AdventureWorks2008R2 创建的 MyAdvWorks_FullRM 数据库的方式与下面的 MyAdvWorks 示例相同。但是,必须将所得的 MyAdvWorks_FullRM 数据库更改为使用完整恢复模式:ALTER DATABASE MyAdvWorks_FullRM SET RECOVERY FULL。

代码

USE master
GO
-- First determine the number and names of the files in the backup.
-- AdventureWorks2008R2_Backup is the name of the backup device.
RESTORE FILELISTONLY
   FROM AdventureWorks2008R2_Backup
-- Restore the files for MyAdvWorks.
RESTORE DATABASE MyAdvWorks
   FROM AdventureWorks2008R2_Backup
   WITH RECOVERY,
   MOVE 'AdventureWorks2008R2_Data' TO 'D:\MyData\MyAdvWorks_Data.mdf', 
   MOVE 'AdventureWorks2008R2_Log' TO 'F:\MyLog\MyAdvWorks_Log.ldf'
GO