数据库还原的操作,分两步进行:第一步,验证(verify)备份文件;第二步,根据备份策略还原数据库;

参考《备份和还原 第一篇:开始数据库备份》,备份策略是:

  • 一周一次完整备份,一天一次差异备份,一小时一次事务日志备份
  • 数据/日志的每次备份都使用一个单独的备份文件,数据备份的扩展名是 .bak,日志备份的扩展名是.trn

一,验证(Verifiy)备份文件

1,查看备份文件的文件列表(Data File 和 Log File)

由于,数据或日志的每次备份,都使用一个单独的备份文件,因此,在备份文件中,只有一个backup set,File选项是1,如果不指定该File选项,默认值是1。

  1. RESTORE FILELISTONLY
  2. FROM disk = 'D:\TestDBBackupFolder\Sitedb_bak4.bak'
  3. --with file=1;

在SQL Server中,一个备份文件可以存储多个backup set,每一个backup set都是数据或日志的一次备份(完整或差异备份),这意味着,一个备份文件能够存储多个数据库备份。为了便于管理备份文件,建议,每一个备份都存储到单独的备份文件中,这样,每个备份文件只存储一次备份。

返回的结果集中,有三个非常重要的字段:

  • LogicalName:文件的逻辑名称
  • PhysicalName:文件的物理名称,是文件在OS上的路径+文件名,例如,D:\Program Files\Microsoft SQL Server\MSSQL\Data\SitedB.mdf;
  • Type:文件的类型(L:Log File,D:Data File,F:Full Text Catalog);

选项:FILE = backup_set_file_number,标识被还原的backup set。

For example, a backup_set_file_number of 1 indicates the first backup set on the backup medium and a backup_set_file_number of 2 indicates the second backup set. When not specified, the default is 1, except for RESTORE HEADERONLY in which case all backup sets in the media set are processed.

2,验证(Verify)备份文件

使用Restore VerifyOnly 命令来验证备份文件的有效性,如果备份是有效的,SQL Serer返回验证成功的消息。

  1. RESTORE VERIFYONLY
  2. FROM DISK = 'physical_backup_device_name'
  3. [ WITH { MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [ ,...n ]
  4. | FILE = backup_set_file_number }] [;]

如果验证通过,SQL Server会打印备份有效的消息:

  1. The backup set on file 1 is valid.

选项 Move-To:用于验证磁盘是否有足够的Free Space来存储还原的数据库文件(Data Files 和 Log Files);

Move子句指定文件的LogicalName,To子句指定文件的PhysicalName,即,存储该文件的Path+FileName,例如:

  1. restore verifyonly
  2. from disk = 'D:\TestDBBackupFolder\Sitedb_bak4.bak'
  3. with
  4. file=1
  5. ,move 'Site_TestDB_1' to 'D:\TestDBBackupFolder\Site_TestDB_1.mdf'
  6. ,move 'Site_TestDB_2' to 'D:\TestDBBackupFolder\Site_TestDB_2.ndf'
  7. ,move 'site_TestDB_log' to 'D:\TestDBBackupFloder\Site_TestDB_log.ldf'

默认情况下,在还原时,数据备份和日志备份将还原到原始的位置(Original Location),如果计划将数据库复制到其他Server上,使用Move-To选项是非常必要的,在执行还原操作前,使用Restore VerifyOnly命令,检查是有有足够的Disk Space,是否有潜在的文件命名冲突。

If a RESTORE VERIFYONLY statement is used when you plan to relocate a database on the same server or copy it to a different server, the MOVE option might be necessary to verify that sufficient space is available in the target and to identify potential collisions with existing files.

二,还原数据文件

使用restore dabase 命令将存储在备份文件中的 backup 还原成一个数据库,根据备份的不同,将数据库的还原操作分为两部分:还原数据文件和还原日志文件。

还原数据文件的命令,简化

  1. --To Restore an Entire Database from a Full database backup (a Complete Restore):
  2. RESTORE DATABASE database_name
  3. FROM DISK 'physical_backup_device_name'
  4. [ WITH
  5. {[ RECOVERY | NORECOVERY ]
  6. | , <general_WITH_options> [ ,...n ]}
  7. ][;]
  8. <general_WITH_options> ::=
  9. MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name'
  10. [ ,...n ]
  11. | REPLACE
  12. | RESTART
  13. | RESTRICTED_USER
  14. | FILE = { backup_set_file_number | @backup_set_file_number }
  15. | STATS [ = percentage ]

1,还原选项(RECOVERY | NORECOVERY ),默认值是RECOVERY

RECOVERY 选项:指定还原操作将所有未提交的事务回滚,并使数据库可用;如果后续需要从差异备份和事务日志备份继续还原操作,那么必须使用 NORECOVERY选项;RECOVERY 选项用于还原操作的最后一个Restore命令中。

RECOVERY  option instructs the restore operation to roll back any uncommitted transactions. After the recovery process, the database is ready for use. If subsequent RESTORE operations (RESTORE LOG, or RESTORE DATABASE from differential) are planned, NORECOVERY should be specified instead.

NORECOVERY 选项:指定还原操作不回滚未提交的事务,后续需要从差异备份或事务日志备份继续还原操作,在还原过程的最后一个Restore命令之前,使用NoRecovery选项。

For restoring a database backup and one or more transaction logs or whenever multiple RESTORE statements are necessary (for example, when restoring a full database backup followed by a differential database backup), RESTORE requires the WITH NORECOVERY option on all but the final RESTORE statement. A best practice is to use WITH NORECOVERY on ALL statements in a multi-step restore sequence until the desired recovery point is reached, and then to use a separate RESTORE WITH RECOVERY statement for recovery only.

2,移动选项(Move),仅用于还原数据库完整备份

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

在还原过程中,将数据或日志文件移动到新的位置上,默认情况下,数据库的每个文件,都会还原到原始的位置上(Original Location);如果需要改变数据库文件存储的路径,通过move-to 选项,为数据库的每个文件指定新的Location。

Specifies that the data or log file whose logical name is specified by logical_file_name_in_backup should be moved by restoring it to the location specified by operating_system_file_name. The logical file name of a data or log file in a backup set matches its logical name in the database when the backup set was created.

Specify a MOVE statement for every logical file you want to restore from the backup set to a new location. By default, the logical_file_name_in_backup file is restored to its original location.

3,替换选项(Replace),建议不要使用Replace选项,仅用于还原数据库完整备份

在SQL Server实例中,如果要还原的数据和现存的数据库同名,那么,指定Replace选项,SQL Server将会把已存在的同名数据库删除。如果没有指定Replace选项,SQL Server会做安全检查,不会将现存的同名数据库删除。

When the REPLACE option is not specified, a safety check occurs. This prevents overwriting a different database by accident. The safety check ensures that the RESTORE DATABASE statement does not restore the database to the current server if the following conditions both exist:

  • The database named in the RESTORE statement already exists on the current server, and

  • The database name is different from the database name recorded in the backup set.

4,重启选项(Restart)

在数据库还原操作中断(interrupt)时,重启还原操作,从中断处重新开始还原操作。

5,限制用户(RESTRICTED_USER),仅用于还原数据库完整备份

对新还原的数据库,限制(restrict)用户访问,只允许角色 db_ownerdbcreator 或 sysadmin 的成员的访问;

三,还原数据库的日志文件

要执行事务日志的备份,数据库的恢复模式(Recovery Mode)必须是FULL,并且数据库必须进行过一次完整备份;否则,事务日志文件处于自动截断(Auto-Truncate)状态,无法执行事务日志的备份。

  1. --To Restore a Transaction Log:
  2. RESTORE LOG database_name
  3. [ <file_or_filegroup_or_pages> [ ,...n ] ]
  4. [ FROM <backup_device> [ ,...n ] ]
  5. [ WITH
  6. {
  7. [ RECOVERY | NORECOVERY ]
  8. | , <general_WITH_options> [ ,...n ]
  9. | , <point_in_time_WITH_optionsRESTORE_LOG>
  10. } [ ,...n ]
  11. ] [;]
  12.  
  13. <point_in_time_WITH_optionsRESTORE_LOG>::=
  14. | {
  15. STOPAT = { 'datetime'| @datetime_var }
  16. | STOPATMARK = { 'mark_name' | 'lsn:lsn_number' }
  17. [ AFTER 'datetime']
  18. | STOPBEFOREMARK = { 'mark_name' | 'lsn:lsn_number' }
  19. [ AFTER 'datetime']
  20. }

在还原事务日志时,SQL Server支持还原到时间点,在Restore Log命令中指定StopAt选项,能够将事务日志还原到具体的时间点。

四,还原数据文件示例

1,依次还原数据库的完整备份,差异备份和事务日志备份

  1. --完整备份还原
  2. RESTORE DATABASE AdventureWorks2012
  3. FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2012.bak'
  4. WITH FILE = 1,
  5. STATS=5,
  6. MOVE 'AdventureWorks2012' TO 'D:\SQLServer\AdventureWorks2012.mdf',
  7. MOVE 'AdventureWorks2012_Log' TO 'D:\SQLServer\AdventureWorks2012_log.ldf',
  8. NORECOVERY;
  9. --差异备份还原
  10. RESTORE DATABASE AdventureWorks2012
  11. FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2012_2.bak'
  12. WITH FILE = 1,
  13. STATS=5,
  14. NORECOVERY;
  15. --日志备份还原
  16. RESTORE log AdventureWorks2012
  17. FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2012_3.trn'
  18. WITH FILE = 1,
  19. STATS=5,
  20. RECOVERY;

2,将事务日志还原到某一个时间点

  1. --日志备份还原到某一个时间点
  2. RESTORE log AdventureWorks2012
  3. FROM DISK = 'Z:\SQLServerBackups\AdventureWorks2012_3.trn'
  4. WITH FILE = 1,
  5. STATS=5,
  6. STOPAT='Apr 15, 2016 12:00 AM'
  7. RECOVERY;

五,还原产生的异常等待 PARALLEL_BACKUP_QUEUE

执行 Restore HeaderOnly 命令的会话(Session)长时间处于PARALLEL_BACKUP_QUEUE 等待状态,也不能Kill。

  1. RESTORE HEADERONLY
  2. from disk ='\\xxx\yyy.bak'

官方文档:PARALLEL_BACKUP_QUEUE occurs when serializing output produced by RESTORE HEADERONLY, RESTORE FILELISTONLY, or RESTORE LABELONLY.

PARALLEL_BACKUP_QUEUE 等待表示,在使用并发/多进程还原数据库的过程中,一个进程在等待访问输出结果集。这个结果集被并发的所有进程共享,因此,在一个进程写入新的数据之前,结果集中的数据必须同步。就是说,还原数据库的多个进程必须以序列化的方式输出结果集。

出现PARALLEL_BACKUP_QUEUE等待的原因是命令RESTORE HEADERONLY 会将扫描备份媒介(backup media)上的所有备份集(backup set),一个备份媒介可能存储多个备份集,扫描所有的备份集十分耗时。建议使用RESTORE LABELONLY,该命令只会读取备份媒介的头部(header)信息。

如图,只读取Meida Header,能够快速获取backup meida包含的信息,但是Header 包含的信息十分有限。

参考文档:

RESTORE (Transact-SQL)

RESTORE VERIFYONLY (Transact-SQL)

RESTORE FILELISTONLY (Transact-SQL)

backup2:数据库还原的更多相关文章

  1. [解决方案]在Sql Server 2008/2005 数据库还原出现 3154错误

    在Sql Server 2008/2005 数据库还原出现 3154错误 解决方法1:不要在数据库名字上点右键选择还原,而要是在根目录“数据库”三个字上点右键选择还原,然后再选择数据库,问题便可以解决 ...

  2. 黄聪:Mysql数据库还原备份提示MySQL server has gone away 的解决方法(备份文件数据过大)

    使用mysql做数据库还原的时候,由于有些数据很大,会出现这样的错误:The MySQL Server returned this Error:MySQL Error Nr. MySQL server ...

  3. MySQL数据库还原:路径必须用正斜杠?

    也是术业不精,其实之前也用命令行还原过几次MySQL数据库,但总记不清语法.这不,今天想把另一台电脑上备份的数据库还原过来,结果不停报错,如下图所示: 后来才发现,因为偷懒直接复制的路径名里,用的全是 ...

  4. Sql Server 2008/2005 数据库还原出现 3154错误

    在Sql Server 2008/2005 数据库还原出现 3154错误 解决方法1:不要在数据库名字上点右键选择还原,而要是在根目录“数据库”三个字上点右键选择还原,然后再选择数据库,问题便可以解决 ...

  5. sql 数据库还原脚本 (kill链接+独占

    在开发过程中经常会碰到数据库还原,要是sql 连接没完全释放掉,那么还原就会受到阻碍.此脚本就是为了解决这个问题. USE [master] GO /****** Object: StoredProc ...

  6. mysql 使用sqldump来进行数据库还原

    MYSQLdump参数详解 mysqldump备份: 复制代码代码如下: mysqldump -u用户名 -p密码 -h主机 数据库 a -w “sql条件” –lock-all-tables > ...

  7. Sql2012数据库还原

    Sql2012数据库还原(通过.bak数据库备份文件) 昨天系统挂了,那叫一个悲惨,重装了系统,但是sql2012的数据没有备份,同事帮忙发来备份文件(.bak),开始还原数据. 步骤:1 自己新建一 ...

  8. SQL2012数据库还原失败System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份

    在一次数据库还原的操作过程中遇到如上错误,去百度了下找到了对应的解决方法 第一个: 在还原完整备份时候,在回复状态状态哪里选择 restore with norecovery ,尾日志部分可选可不选, ...

  9. 数据库还原错误:指定的转换无效。(SqlManagerUI)

    SSMS在一定程度上方便我们进行一些常见的操作.但有时候它处理得又不是那么不人性化.尤其是错误信息. 今天我在进行数据库还原的时候就碰到一个错误:指定的转换无效.(SqlManagerUI) Spec ...

随机推荐

  1. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  2. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  3. JSON.parse()和JSON.stringify()

    1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf","age":"23&q ...

  4. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  5. Velocity初探小结--Velocity在spring中的配置和使用

    最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...

  6. C#中Length和Count的区别(个人观点)

    这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...

  7. PHP中PDO事务的使用方法

    事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...

  8. Android—Service与Activity的交互

    service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...

  9. 小程序用户反馈 - HotApp小程序统计仿微信聊天用户反馈组件,开源

    用户反馈是小程序开发必要的一个功能,但是和自己核心业务没关系,主要是产品运营方便收集用户的对产品的反馈.HotApp推出了用户反馈的组件,方便大家直接集成使用 源码下载地址: https://gith ...

  10. NDK开发_笔记0

    自谷歌搜索退出中国以来,谷歌对全球第二大市场中国的态度一直保持冷淡.可是北京时间12月8日,谷歌2016开发者大会在北京召开,同时专门针对中国的谷歌开发者网站已经上线:https://develope ...