T-SQL语言里提供了RESTORE DATABASE语句来恢复数据库备份,用该语句可以恢复完整备份、差异备份、文件和文件组备份。如果要还原事务日志备份则还可以用RESTORE LOG语句。虽然RESTORE DATABASE语句可以恢复完整备份、差异备份、文件和文件组备份,但是在恢复完整备份、差异备份与文件和文件组备份的语法上有一点点出入,下面分别介绍几种类型备份的还原方法。
一、  还原完整备份
还原完整备份的语法如下:
RESTORE DATABASE { database_name | @database_name_var }                  --数据库名
[ FROM <backup_device> [ ,...n ] ]                                                --备份设备
[ WITH
   [ { CHECKSUM | NO_CHECKSUM } ]                                        --是否校检和
   [ [ , ] { CONTINUE_AFTER_ERROR | STOP_ON_ERROR } ]             --还原失败是否继续
   [ [ , ] ENABLE_BROKER ]                                           --启动Service Broker
   [ [ , ] ERROR_BROKER_CONVERSATIONS ]                              --对束所有会话
   [ [ , ] FILE = { backup_set_file_number | @backup_set_file_number } ]        --用于还原的文件
   [ [ , ] KEEP_REPLICATION ]                            --将复制设置为与日志传送一同使用
   [ [ , ] MEDIANAME = { media_name | @media_name_variable } ]                    --媒体名
   [ [ , ] MEDIAPASSWORD = { mediapassword |                                  --媒体密码
                    @mediapassword_variable } ]
   [ [ , ] MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' ]     --数据还原为
                [ ,...n ]
   [ [ , ] NEW_BROKER ]                                  --创建新的service_broker_guid值
   [ [ , ] PASSWORD = { password | @password_variable } ]                     --备份集的密码
   [ [ , ] { RECOVERY | NORECOVERY | STANDBY =                              --恢复模式
          {standby_file_name | @standby_file_name_var }
   } ]
   [ [ , ] REPLACE ]                                                      --覆盖现有数据库
   [ [ , ] RESTART ]                                            --重新启动被中断的还原操作
   [ [ , ] RESTRICTED_USER ]                                      --限制访问还原的数据库
   [ [ , ] { REWIND | NOREWIND } ]                                    --是否释放和重绕磁带
   [ [ , ] { UNLOAD | NOUNLOAD } ]                                    --是否重绕并卸载磁带
   [ [ , ] STATS [ = percentage ] ]                       --还原到其在指定的日期和时间时的状态
   [ [ , ] { STOPAT = { date_time | @date_time_var }                  --还原到指定的日期和时间
    |  STOPATMARK = { 'mark_name' | 'lsn:lsn_number' }    --恢复为已标记的事务或日志序列号
              [ AFTER datetime ]
    |  STOPBEFOREMARK = { 'mark_name' | 'lsn:lsn_number' }
             [ AFTER datetime ]
   } ]
]
[;]
<backup_device> ::=
{
   { logical_backup_device_name |
            @logical_backup_device_name_var }
   | { DISK | TAPE } = { 'physical_backup_device_name' |
              @physical_backup_device_name_var }
}
其中大多参数在备份数据时已经介绍过了,下面介绍一些没有介绍过的参数:
l  ENABLE_BROKER:启动Service Broker以便消息可以立即发送。
l  ERROR_BROKER_CONVERSATIONS:发生错误时结束所有会话,并产生一个错误指出数据库已附加或还原。此时Service Broke将一直处于禁用状态直到此操作完成,然后再将其启用。
l  KEEP_REPLICATION:将复制设置为与日志传送一同使用。设置该参数后,在备用服务器上还原数据库时,可防止删除复制设置。该参数不能与NORECOVERY参数同时使用。
l  MOVE:将逻辑名指定的数据文件或日志文件还原到所指定的位置,相当于图18.14中所示的【将数据库文件还原为】功能。
l  NEW_BROKER:使用该参数在会在databases数据库和还原数据库中都创建一个新的service_broker_guid值,并通过清除结束所有会话端点。Service Broker已启用,但未向远程会话端点发送消息。
l  RECOVERY:回滚未提交的事务,使数据库处于可以使用状态。无法还原其他事务日志
l  NORECOVERY:不对数据库执行任何操作,不回滚未提交的事务。可以还原其他事务日志。
l  STANDBY:使数据库处于只读模式。撤消未提交的事务,但将撤消操作保存在备用文件中,以便可以恢复效果逆转。
l  standby_file_name | @standby_file_name_var:指定一个允许撤消恢复效果的备用文件或变量。
l  REPLACE:会覆盖所有现有数据库以及相关文件,包括已存在的同名的其他数据库或文件。
l  RESTART:指定SQL Serve 应重新启动被中断的还原操作。RESTAR从中断点重新启动还原操作。
l  RESTRICTED_USER:还原后的数据库仅供db_owner、dbcreator或sysadmin的成员才能使用。
l  STOPAT:将数据库还原到其在指定的日期和时间时的状态。
l  STOPATMARK:恢复为已标记的事务或日志序列号。恢复中包括带有已命名标记或 LSN 的事务,仅当该事务最初于实际生成事务时已获得提交,才可进行本次提交。
l  TOPBEFOREMARK:恢复为已标记的事务或日志序列号。恢复中不包括带有已命名标记或LSN的事务,在使用WITH RECOVERY时,事务将回滚。
 
例、
backup database oracle to disk='d:\oracle.bak'
BACKUP LOG oracle to disk='d:\oralce_log.bak' WITH NORECOVERY
restore database  oracle from disk='d:\oracle.bak'
 
在本例中,默认操作的数据库名为ORACLE,还原前必须先备份尾日志。
没有使用指定备份设备里的哪一个备份集来还原数据库备份,那么默认使用备份设备里的第一个备份集还原数据库。如果要指定用哪个备份集来还原数据库,则要使用file参数指定。
 
二、  还原差异备份
还原差异备份的语法与还原完整备份的语法是一样的,只是在还原差异备份时,必须要先还原完整备份再还原差异备份,因此还原差异备份必须要分为两步完成。完整备份与差异备份数据在同一个备份文件或备份设备中,也有可能是在不同的备份文件或备份设备中。如果在同一个备份文件或备份设备中,则必须要用file参数来指定备份集。无论是备份集是不是在同一个备份文件(备份设备)中,除了最后一个还原操作,其他所有还原操作都必须要加上NORECOVERY或STANDBY参数。
 
例、先用备份设备的第一个备份集来还原数据库的完整备份,再用第三个备份集来还原差异备份,其代码如下:
BACKUP LOG oracle to disk='d:\oralce_log2.bak' WITH NORECOVERY
RESTORE DATABASE oracle FROM disk='d:\oracle.bak' WITH FILE = 1,NORECOVERY
RESTORE DATABASE oracle FROM disk='d:\oracle_2.bak' WITH FILE = 2,NORECOVERY
 
如果单独还原差异备份或在本例中完整备份代码里没有加上NORECOVERY参数,都会出现提示无法还原差异备份信息。
 
 
三、 还原事务日志备份
SQL Server 2005中已经将事务日志备份看成和完整备份、差异备份一样的备份集,因此,还原事务日志备份也可以和还原差异备份一样,只要知道它在备份文件或备份设备里是第几个文件集即可。
与还原差异备份相同,还原事务日志备份必须要先还原在其之前的完整备份,除了最后一个还原操作,其他所有还原操作都必须要加上NORECOVERY或STANDBY参数。
 
restore log oracle from disk='d:\oralce_log.bak' WITH FILE = 1, NORECOVERY
restore log oracle from disk='d:\oralce_log2.bak' WITH FILE = 2
 
使用RESTORE LOG语句也可以用来还原事务日志备份,
 
四、 还原文件和文件组备份
还原文件和文件组备份也可以使用RESTORE DATABASE语句,但是必须要在数据库名与FROM之间加上“FILE”或“FILEGROUP”参数来指定要还原的文件或文件组。通常来说,在还原文件和文件组备份之后,还要再还原其他备份来获得最近的数据库状态。
 
 
五、  将数据库还原到某个时间点
技巧:在SQL Server Management Studio里也可以完成同样的操作,设置好【目标时间点】即可。
 
六、 将文件还原到新位置上
使用RESTORE DATABASE语句也可以利用备份文件创建一个新的数据库。
 
 
说明 所有的示例均假定已执行了完整数据库备份。


A. 还原完整数据库


说明 MyNwind 数据库仅供举例说明。


下例显示还原完整数据库备份。

RESTORE DATABASE MyNwind
FROM MyNwind_1

B. 还原完整数据库备份和差异备份
下例还原完整数据库备份后还原差异备份。另外,下例还说明如何还原媒体上的另一个备份集。差异备份追加到包含完整数据库备份的备份设备上。

RESTORE DATABASE MyNwind
FROM MyNwind_1
WITH NORECOVERY
RESTORE DATABASE MyNwind
FROM MyNwind_1
WITH FILE = 2

C. 使用 RESTART 语法还原数据库
下例使用 RESTART 选项重新启动因服务器电源故障而中断的 RESTORE 操作。

-- This database RESTORE halted prematurely due to power failure.
RESTORE DATABASE MyNwind
FROM MyNwind_1
-- Here is the RESTORE RESTART operation.
RESTORE DATABASE MyNwind
FROM MyNwind_1 WITH RESTART

D. 还原数据库并移动文件
下例还原完整数据库和事务日志,并将已还原的数据库移动到 C:\Program Files\Microsoft SQL Server\MSSQL\Data 目录下。

RESTORE DATABASE MyNwind
FROM MyNwind_1
WITH NORECOVERY,
    MOVE 'MyNwind' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewNwind.mdf',
    MOVE 'MyNwindLog1' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewNwind.ldf'
RESTORE LOG MyNwind
FROM MyNwindLog1
WITH RECOVERY

E. 使用 BACKUP 和 RESTORE 创建数据库的复本
下例显示使用 BACKUP 和 RESTORE 语句创建 Northwind 数据库的复本。MOVE 语句使数据和日志文件还原到指定的位置。RESTORE FILELISTONLY 语句用于确定待还原数据库内的文件数及名称。该数据库的新复本称为 TestDB。有关更多信息,请参见 RESTORE FILELISTONLY。

BACKUP DATABASE Northwind
TO DISK = 'c:\Northwind.bak'
RESTORE FILELISTONLY
FROM DISK = 'c:\Northwind.bak'
RESTORE DATABASE TestDB
FROM DISK = 'c:\Northwind.bak'
WITH MOVE 'Northwind' TO 'c:\test\testdb.mdf',
MOVE 'Northwind_log' TO 'c:\test\testdb.ldf'
GO

F. 使用 STOPAT 语法还原到即时点和使用多个设备进行还原
下例将数据库还原到其在 1998 年 4 月 15 日中午 12 点时的状态,并显示涉及多个日志和多个备份设备的还原操作。

RESTORE DATABASE MyNwind
FROM MyNwind_1, MyNwind_2
WITH NORECOVERY
RESTORE LOG MyNwind
FROM MyNwindLog1
WITH NORECOVERY
RESTORE LOG MyNwind
FROM MyNwindLog2
WITH RECOVERY, STOPAT = 'Apr 15, 1998 12:00 AM'

G. 使用 TAPE 语法还原
下例显示从 TAPE 备份设备还原完整数据库备份。

RESTORE DATABASE MyNwind
FROM TAPE = '\\.\tape0'

H. 使用 FILE 和 FILEGROUP 语法还原
下例还原一个包含两个文件、一个文件组和一个事务日志的数据库。

RESTORE DATABASE MyNwind
FILE = 'MyNwind_data_1',
FILE = 'MyNwind_data_2',
FILEGROUP = 'new_customers'
FROM MyNwind_1
WITH NORECOVERY
-- Restore the log backup.
RESTORE LOG MyNwind
FROM MyNwindLog1

I. 将事务日志还原到标记处
下例显示将事务日志还原到名为"RoyaltyUpdate"的标记处。

BEGIN TRANSACTION RoyaltyUpdate
WITH MARK 'Update royalty values'
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'PC%'
GO
COMMIT TRANSACTION RoyaltyUpdate
GO
--Time passes. Regular database
--and log backups are taken.
--An error occurs.
USE master
GO

RESTORE DATABASE pubs
FROM Pubs1
WITH FILE = 3, NORECOVERY
GO
RESTORE LOG pubs
FROM Pubs1
WITH FILE = 4,
STOPATMARK = 'RoyaltyUpdate'