RESTORE(Transact-SQL)

还原使用BACKUP命令进行的备份。此命令使您能够执行以下恢复场景:

  • 从完整的数据库备份中恢复整个数据库(完全恢复)。

  • 还原数据库的一部分(部分还原)。

  • 将特定文件或文件组还原到数据库(文件还原)。

  • 将特定页面还原到数据库(页面还原)。

  • 将事务日志还原到数据库中(事务日志还原)。

  • 将数据库还原到数据库快照捕获的时间点。

有关SQL Server恢复方案的详细信息,请参阅还原和恢复概述(SQL Server)实施SQL Server数据库的恢复方案.

注释

有关参数描述的更多信息,请参见RESTORE参数(Transact-SQL).

主题链接图标Transact-SQL语法惯例

语法

--要从完整数据库备份还原整个数据库(完全还原),请执行以下操作:恢复数据库{DATABASE_name |@DATABASE_name_var}[来自<backup_device>[,…n]][带有   {[RECOVERY|NORECOVERY|STANDBY={备用文件名|@standby_file_name_var}       ]|,<general_WITH_options>[,…n]|,<replication_WITH_option>|,<change_data_capture_WITH_option>|,<service_broker_WITH选项>|,<point_in_time_WITH_options-RESTORE_DATABASE>}[,…n] ][;]--要执行逐段还原的初始还原序列的第一步,请执行以下操作:恢复数据库{DATABASE_name |@DATABASE_name_var}<files_or_filegroups>[,…n][来自<backup_device>[,…n]]部分,NORECOVERY[,<general_WITH_options>[,…n]|,<point_in_time_WITH_options-RESTORE_DATABASE>][,…n][;]--要还原特定文件或文件组,请执行以下操作:恢复数据库{DATABASE_name |@DATABASE_name_var}<file_or_filegroup>[,…n][来自<backup_device>[,…n]]   {[恢复|NORECOVERY][,<general_WITH_options>[,…n]]}[,…n][;]--要还原特定页面:恢复数据库{DATABASE_name |@DATABASE_name_var}PAGE='文件:第[,…n]页'[,<file_or_filegroups>][,…n][来自<backup_device>[,…n]]NORECOVERY公司[,<general_WITH_options>[,…n]][;]--要恢复事务日志,请执行以下操作:恢复日志{database_name |@database_name_var}[<file_or_filegroup_or_pages>[,…n]][来自<backup_device>[,…n]][带有   {[RECOVERY|NORECOVERY|STANDBY={备用文件名|@standby_file_name_var}       ]|,<general_WITH_options>[,…n]|,<replication_WITH_option>复制|,<point_in_time_WITH_options-RESTORE_LOG>}[,…n] ] [;]--要将数据库还原为数据库快照,请执行以下操作:恢复数据库{DATABASE_name |@DATABASE_name_var}FROM DATABASE_SNAPSHOT=数据库快照名称<备份设备>:={ {逻辑备份设备名称|@logical_backup_device_name_var}|{DISK|TAPE}={'物理备份设备名称'|@physical_backup_device_name_var}} <文件或文件组>::={ 文件={逻辑文件名_in_backup|@logical_FILE_name_in_bakup_var}|FILEGROUP={逻辑文件组名称|@logical_FILEGROUP_name_var}|READ_WRITE_FILEGROUPS(读取_写入_文件组)} <general_WITH_options>[,…n]::=--还原操作选项将“logical_file_name_in_backup”移动到“operating_system_file_name”[,…n]|替换|重新启动|限制用户--备份集选项|文件={backup_set_FILE_number|@backup_set_FILE_number}|PASSWORD={PASSWORD|@PASSWORD_variable}--媒体集选项|MEDIANAME={media_name |@media_name_variable}|MEDIAPASSWORD={MEDIAPASSWORD|@mediapasword_variable}|BLOCKSIZE={块大小|@BLOCKSIZE_variable}--数据传输选项|BUFFERCOUNT={缓冲计数|@BUFFERCOUNT_variable}|MAXTRANSFERSIZE={MAXTRANSFERSIZE|@MAXTRANSFERSIZE_variable}--错误管理选项|{校验和|NO_CHECKSUM}|{STOP_ON_ERROR|CONTINUE_AFTER_ERROR}--监视选项|STATS[=百分比]--磁带选项|{倒带|NOREWIND}|{UNLOAD|NOUNLOAD}<replication_WITH_option>::=|保持复制<change_data_capture_WITH_option>::=| KEEP_CDC(保持_控制中心)<service_broker_WITH_options>::=|ENABLE_BROKER(启用_浏览器)|ERROR_BROKER_CONVERSIONS(错误_浏览器_版本)|新经纪人<point_in_time_WITH_optionsRESTORE_DATABASE>::= | {STOPAT={“日期时间”|@datetime_var}|STOPATMARK={“lsn:lsn_number”}[在“日期时间”之后]|STOPBEFOREMARK={“lsn:lsn_number”}[在“日期时间”之后]   } <point_in_time_WITH_options-RESTORE_LOG>::= | {STOPAT={“日期时间”|@datetime_var}|STOPATMARK={“标记名”|“lsn:lsn_number”}[在“日期时间”之后]| STOPBEFOREMARK={'mark_name'|'lsn:lsn_number'}[在“日期时间”之后]   }

论据

有关参数的描述,请参见RESTORE参数(Transact-SQL).

评论

在脱机还原期间,如果指定的数据库正在使用中,restore会在短暂延迟后强制用户退出。对于非主文件组的在线还原,数据库可以继续使用,除非要还原的文件组处于脱机状态。指定数据库中的任何数据都将被还原的数据替换。

有关数据库恢复的更多信息,请参阅了解备份的恢复和恢复在SQL Server中的工作方式实施SQL Server数据库的恢复方案.

只要操作系统支持数据库的排序,就可以执行跨平台还原操作,即使是在不同的处理器类型之间。

出现错误后,可以重新启动RESTORE。此外,您可以指示RESTORE在出现错误的情况下继续,并且它会还原尽可能多的数据(请参阅continue_AFTER_ERROR选项)。有关更多信息,请参阅响应由损坏的备份导致的SQL Server还原错误.

在显式或隐式事务中不允许RESTORE。

修复损坏的主人数据库是使用特殊过程执行的。有关更多信息,请参阅恢复主数据库的注意事项.

使用Microsoft SQL Server创建的备份无法还原到SQL Server的早期版本。

还原数据库会清除SQL Server实例的计划缓存。清除计划缓存会导致所有后续执行计划的重新编译,并可能导致查询性能的突然暂时下降。自SQL Server 2005 Service Pack 2起,对于计划缓存中每个已清除的缓存,SQL Server错误日志包含以下信息性消息:“由于某些数据库维护或重新配置操作,SQL Server遇到%d次“%s”缓存(计划缓存的一部分)的缓存刷新”。只要在该时间间隔内刷新缓存,就会每隔五分钟记录一次此消息。

要还原到SQL Server 2008 R2,要还原的数据库必须至少为版本80(SQL Server 2000)。兼容性级别小于80的SQL Server 2000或SQL Server 2005数据库在恢复时将设置为兼容性80。

注释

将SQL Server 2005或SQL Server 2000数据库还原到SQL Server 2008 R2后,该数据库立即可用,然后自动升级。如果数据库具有全文索引,则升级过程会导入、重置或重建它们,具体取决于upgrade_option(升级选项) 服务器属性。如果升级选项设置为导入(upgrade_option(升级选项)=2)或重建(upgrade_option(升级选项)=0),则全文索引在升级期间将不可用。根据被索引的数据量,导入可能需要几个小时,而重建可能需要十倍的时间。当升级选项设置为导入时,如果没有全文目录可用,则会重建关联的全文索引。要更改upgrade_option(升级选项)服务器属性,使用sp_fulltext_服务.

恢复方案

SQL Server支持多种还原方案:

停止的RESTORE关键字

SQL Server 2008中不再使用以下关键字:

已中断的关键字

替换为…

替换关键字示例

LOAD(负载)

恢复

恢复数据库

交易

日志

恢复日志

仅DBO_

限制_用户

恢复数据库。。。使用受限用户

恢复加密数据库的要求

要还原加密的数据库,您必须能够访问用于加密数据库的证书或非对称密钥。如果没有证书或非对称密钥,则无法还原数据库。因此,只要需要备份,就必须保留用于加密数据库加密密钥的证书。有关更多信息,请参阅SQL Server证书和非对称密钥.

为vardecimal存储格式启用的数据库

使用vardecimal存储格式,备份和恢复可以正常工作。有关vardecimal存储格式的更多信息,请参阅将十进制数据存储为可变长度.

恢复与NORECOVERY的比较

回滚由RESTORE语句通过[RECOVERY | NORECOVERY]选项控制:

  • NORECOVERY指定不进行回滚。这允许前滚继续序列中的下一条语句。

    在这种情况下,恢复序列可以恢复其他备份并将其前滚。

  • RECOVERY(默认值)表示应在当前备份的前滚完成后执行回滚。

    恢复数据库需要恢复的整个数据集(前滚集)与数据库一致。如果前滚集没有前滚到与数据库一致的程度,并且指定了RECOVERY,则数据库引擎会发出错误。

重做还原

无法撤消恢复的效果;然而,您可以通过每个文件重新开始来抵消数据复制和前滚的影响。要重新开始,请恢复所需的文件并再次执行前滚。例如,如果意外地恢复了太多的日志备份并超出了预期的停止点,则必须重新启动序列。

通过还原受影响文件的全部内容,可以中止并重新启动还原序列。

恢复全文数据

在完全恢复期间,全文数据与其他数据库数据一起恢复。使用常规RESTORE DATABASE DATABASE_name FROM backup_device语法,全文文件将作为数据库文件还原的一部分进行还原。

RESTORE语句还可用于执行到备用位置的还原、差异还原、文件和文件组还原,以及全文数据的差异文件和文件集还原。此外,RESTORE只能还原全文文件以及数据库数据。

注释

从SQL Server 2005或SQL Server 2000导入的全文目录仍被视为数据库文件。对于这些目录,SQL Server 2005备份全文目录的过程仍然适用,只是不再需要在备份操作期间暂停和恢复。有关更多信息,请参阅备份和恢复全文目录在SQL Server 2005联机丛书中。

数据库设置和还原

在恢复期间,可以使用ALTER database设置的大多数数据库选项都会重置为备份结束时的有效值。

注释

此行为与SQL Server 2000之前的SQL Server版本不同。

但是,使用WITH RESTRICTED_USER选项会覆盖用户访问选项设置的此行为。此设置始终在包含WITH RESTRICTED_USER选项的RESTORE语句之后设置。

备份和还原历史表

SQL Server包含备份和还原历史表,用于跟踪每个服务器实例的备份和还原活动。执行还原时,备份历史记录表也会被修改。有关这些表的信息,请参阅查看有关备份的信息.

恢复日志

RESTORE LOG可以包含一个文件列表,以便在前滚期间创建文件。当日志备份包含在将文件添加到数据库时写入的日志记录时,将使用此选项。

注释

对于使用完整或大容量日志恢复模式的数据库,在大多数情况下,您必须在恢复数据库之前备份日志的尾部。除非RESTORE database语句包含WITH REPLACE或WITH STOPAT子句,否则在不首先备份日志尾部的情况下还原数据库会导致错误,该子句必须指定数据备份结束后发生的时间或事务。有关尾长备份的更多信息,请参阅尾日志备份.

联机还原

注释

只有SQL Server 2005 Enterprise Edition和更高版本才允许联机还原。

如果支持联机还原,则如果数据库处于联机状态,则文件还原和页面还原将自动进行联机还原,并且在逐段还原的初始阶段之后还将恢复辅助文件组。

注释

在线恢复可能涉及递延交易.

有关更多信息,请参阅执行联机还原.

分段还原

SQL Server 2005中新增的逐段还原功能增强了Microsoft SQL Server 2000的部分还原。逐段还原允许在对主文件组和一些辅助文件组进行初始部分还原后恢复文件组。未还原的文件组被标记为脱机,无法访问。但是,脱机文件组可以稍后通过文件恢复进行恢复。为了允许在不同的时间分阶段还原整个数据库,逐段还原会维护检查以确保数据库最终保持一致。

注释

在SQL Server 2000中,只能从完整数据库备份执行部分还原。SQL Server 2005中删除了此限制。

如果部分恢复序列排除了文件流文件组,不支持点时间恢复。您可以强制恢复顺序继续。但是,RESTORE语句中省略的FILESTREAM文件组永远无法恢复。要强制进行时间点还原,请将CONTINUE_AFTER_ERROR选项与STOPAT、STOPATMARK或STOPBEFOREMARK选项一起指定,您还必须在随后的restore LOG语句中指定这些选项。如果指定CONTINUE_AFTER_ERROR,则部分还原序列将成功,FILESTREAM文件组将不可恢复。

有关逐段还原的详细信息,请参阅执行逐段还原.

将数据库还原为数据库快照

还原数据库操作(使用database_SNAPSHOT选项指定)通过将完整的源数据库还原为数据库快照的时间,即使用指定数据库快照中维护的时间点的数据覆盖源数据库,从而使其返回时间。当前只能存在要还原到的快照。然后,还原操作将重建日志(因此,您以后无法将还原的数据库前滚到用户错误点)。

数据丢失仅限于创建快照后对数据库的更新。还原数据库的元数据与创建快照时的元数据相同。但是,还原为快照会删除所有全文目录。

从数据库快照还原不用于媒体恢复。与常规备份集不同,数据库快照是数据库文件的不完整副本。如果数据库或数据库快照损坏,则很可能无法从快照恢复。此外,即使在可能的情况下,如果发生腐败,恢复原状也不太可能解决问题。

还原的限制

在以下情况下不支持还原:

  • 源数据库包含任何只读或压缩文件组。

  • 创建快照时联机的所有文件都处于脱机状态。

  • 当前存在多个数据库快照。

有关更多信息,请参阅还原到数据库快照.

权限

如果要还原的数据库不存在,则用户必须具有CREATE database权限才能执行RESTORE。如果数据库存在,RESTORE权限默认为系统管理员数据库创建者固定服务器角色和所有者(数据库管理员)数据库的(对于FROM database_SNAPSHOT选项,数据库始终存在)。

RESTORE权限授予成员身份信息始终可供服务器使用的角色。由于只有在数据库可访问且未损坏时才能检查固定数据库角色成员身份,因此在执行RESTORE时数据库所有者固定数据库角色没有RESTORE权限。

备份操作可以选择指定媒体集、备份集或两者的密码。在媒体集或备份集上定义密码后,必须在RESTORE语句中指定正确的密码。这些密码可防止使用SQL Server工具进行未经授权的还原操作和将备份集未经授权附加到介质。但是,BACKUP语句的FORMAT选项可以覆盖受密码保护的媒体。

安全说明安全注意事项

此密码提供的保护较弱。它旨在防止授权或未经授权的用户使用SQL Server工具进行不正确的还原。它不会阻止通过其他方式读取备份数据或替换密码。Microsoft SQL Server的未来版本中将删除此功能。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。保护备份的最佳做法是将备份磁带存储在安全的位置,或备份到受足够的访问控制列表(ACL)保护的磁盘文件。应在创建备份的目录根上设置ACL。

示例

注释

图示为AdventureWorks2008R2数据库。AdventureWorks2008R2是SQLServer中的示例数据库之一。AdventureWorksCycles是一家虚构的制造公司,用于演示数据库概念和场景。有关此数据库的详细信息,请参阅AdventureWorks2008R2示例数据库.

所有示例都假定已执行了完整的数据库备份。

RESTORE示例包括以下内容:

  • A.恢复完整数据库

  • B.恢复完整和差异数据库备份

  • C.使用RESTART语法恢复数据库

  • D.恢复数据库并移动文件

  • E.使用BACKUP和RESTORE复制数据库

  • F.使用STOPAT恢复到点时间

  • G.将事务日志恢复到标记

  • H.使用TAPE语法恢复

  • I.使用FILE和FILEGROUP语法恢复

  • J.从数据库快照还原

注释

有关其他示例,请参见几种还原场景的还原顺序示例以及中列出的恢复操作主题备份和恢复操作指南主题(Transact-SQL).

A.恢复完整数据库

以下示例从AdventureWorks2008R2Backups逻辑备份设备还原完整数据库备份。有关创建此设备的示例,请参阅备份设备.

RESTORE DATABASE AdventureWorks2008R2来自AdventureWorks2008R2备份

注释

对于使用完整或大容量恢复模型的数据库,SQL Server在大多数情况下都要求在恢复数据库之前备份日志尾部。有关更多信息,请参阅尾日志备份.

[示例顶部]

B.恢复完整和差异数据库备份

以下示例从包含这两个备份的Z:\SQLServerBackups\AdventureWorks2008R2.bak备份设备还原完整数据库备份,然后还原差异备份。要还原的完整数据库备份是设备上的第六个备份集(FILE=6),差异数据库备份是设备上的第九个备份集(FILE=9)。一旦差异备份恢复,数据库就会恢复。

RESTORE DATABASE AdventureWorks2008R2FROM DISK='Z:\SQLServerBackups\AdventureWorks2008R2.bak'文件=6NORECOVERY公司;RESTORE DATABASE AdventureWorks2008R2FROM DISK='Z:\SQLServerBackups\AdventureWorks2008R2.bak'文件=9恢复;

[示例顶部]

C.使用RESTART语法恢复数据库

以下示例使用RESTART选项重新启动因服务器电源故障中断的RESTORE操作。

--由于电源故障,此数据库RESTORE过早停止。RESTORE DATABASE AdventureWorks2008R2来自AdventureWorks2008R2备份--这是RESTORE RESTART操作。RESTORE DATABASE AdventureWorks2008R2FROM AdventureWorks2008R2使用RESTART进行备份

[示例顶部]

D.恢复数据库并移动文件

以下示例还原完整的数据库和事务日志,并将还原的数据库移动到C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data目录中。

RESTORE DATABASE AdventureWorks2008R2来自AdventureWorks2008R2备份使用NORECOVERY,将“AdventureWorks2008R2_Data”移至“C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\NewAdvWorks2008R2.mdf”,移动“AdventureWorks2008R2_Log”转到“C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\NewAdvWorks2008R2.ldf”RESTORE LOG AdventureWorks2008R2来自AdventureWorks2008R2备份带恢复功能

[示例顶部]

E.使用BACKUP和RESTORE复制数据库

以下示例使用BACKUP和RESTORE语句制作AdventureWorks2008R2数据库的副本。MOVE语句会将数据和日志文件还原到指定的位置。RESTORE FILELISTONLY语句用于确定要还原的数据库中文件的数量和名称。数据库的新副本名为TestDB。有关更多信息,请参阅RESTORE FILELISTONLY(Transact-SQL).

备份数据库AdventureWorks2008R2TO AdventureWorks2008R2备份;恢复文件FROM AdventureWorks2008R2备份;恢复数据库测试数据库来自AdventureWorks2008R2备份将“AdventureWorks2008R2_Data”移动到“C:\MySQLServer\testdb.mdf”,将“AdventureWorks2008R2_Log”移动到“C:\MySQLServer\testdb.ldf”;GO(开始)

[示例顶部]

F.使用STOPAT恢复到点时间

以下示例将数据库恢复到2020年4月15日上午12:00时的状态,并显示了涉及多个日志备份的恢复操作。在备份设备AdventureWorks2008R2Backups上,要还原的完整数据库备份是设备上的第三个备份集(FILE=3),第一个日志备份是第四个备份集中(FILE=4),第二个日志备份则是第五个备份集。

RESTORE DATABASE AdventureWorks2008R2来自AdventureWorks2008R2备份当文件=3时,NORECOVERY;RESTORE LOG AdventureWorks2008R2来自AdventureWorks2008R2备份文件=4,NORECOVERY,STOPAT='2020年4月15日12:00 AM';RESTORE LOG AdventureWorks2008R2来自AdventureWorks2008R2备份文件=5,NORECOVERY,STOPAT='2020年4月15日12:00 AM';RESTORE DATABASE AdventureWorks2008R2 WITH RECOVERY(恢复数据库冒险);

[示例顶部]

G.将事务日志恢复到标记

以下示例将事务日志恢复到名为ListPriceUpdate的标记事务中的标记。

USE AdventureWorks2008R2;GO(开始)开始交易列表价格更新带有标记“更新产品清单价格”;GO(开始)更新生产。产品SET ListPrice=ListPrice*1.10WHERE ProductNumber类似于“BK-%”;GO(开始)COMMIT TRANSACTION ListPriceUpdate;GO(开始)--时间流逝。常规数据库--进行日志备份。--数据库中发生错误。USE主控形状GO(开始)RESTORE DATABASE AdventureWorks2008R2来自AdventureWorks2008R2备份文件=3,NORECOVERY;GO(开始)RESTORE LOG AdventureWorks2008R2来自AdventureWorks2008R2备份文件=4时,恢复,STOPATMARK='更新产品列表价格';

[示例顶部]

H.使用TAPE语法恢复

以下示例从磁带备份设备恢复完整数据库备份。

RESTORE DATABASE AdventureWorks2008R2来自磁带='\\。\磁带0'

[示例顶部]

I.使用FILE和FILEGROUP语法恢复

以下示例还原名为MyDatabase的数据库,该数据库包含两个文件、一个辅助文件组和一个事务日志。数据库使用完整恢复模型。

数据库备份是名为MyDatabaseBackups的逻辑备份设备上的媒体集中的第九个备份集。接下来,使用WITH NORECOVERY恢复MyDatabaseBackups设备上接下来三个备份集(10、11和12)中的三个日志备份。恢复最后一次日志备份后,将恢复数据库。

注释

恢复是作为单独的步骤执行的,以减少在还原所有日志备份之前过早恢复的可能性。

在RESTORE DATABASE中,注意有两种类型的FILE选项。备份设备名称之前的FILE选项指定要从备份集中还原的数据库文件的逻辑文件名;例如,FILE=“MyDatabase_data_1”。此备份集不是媒体集中的第一个数据库备份;因此,它在媒体集中的位置是通过使用WITH子句中的FILE选项来指示的,FILE=9。

恢复数据库MyDatabase文件=“MyDatabase_data_1”,文件=“MyDatabase_data_2”,FILEGROUP='新客户'来自MyDatabaseBackups文件=9,NORECOVERY公司;GO(开始)--还原日志备份。恢复日志MyDatabase来自MyDatabaseBackups在文件=10的情况下,NORECOVERY公司;GO(开始)恢复日志MyDatabase来自MyDatabaseBackups文件=11,NORECOVERY公司;GO(开始)恢复日志MyDatabase来自MyDatabaseBackups文件=12,NORECOVERY公司;GO(开始)--恢复数据库:使用恢复功能恢复数据库MyDatabase;GO(开始)

[示例顶部]

J.从数据库快照还原

以下示例将数据库还原为数据库快照。该示例假设数据库中当前只存在一个快照。有关如何创建此数据库快照的示例,请参阅如何:创建数据库快照(Transact-SQL).

注释

恢复到快照会删除所有全文目录。

USE主控形状从DATABASE_SNAPSHOT恢复DATABASE AdventureWorks2008R2=“AdventureWorks2008R2_dbss1800”;GO(开始)

有关更多信息,请参阅还原到数据库快照.

[示例顶部]