Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62541
  • 博文数量: 15
  • 博客积分: 378
  • 博客等级: 一等列兵
  • 技术积分: 246
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 17:16
文章分类

全部博文(15)

文章存档

2013年(1)

2012年(1)

2011年(13)

分类: BSD

2011-11-01 03:32:59

SQL Server 灾难恢复之备份还原

有的朋友在做备份的时候可能会发现有的数据库可以进行所有的备份,但有的数据库好像不能进行日志备份。这是什么原因呢,这就要引出一个话题:

数据库的恢复模型:

作为一个数据库管理员,为了设计出一个合理的备份策略,就必须熟悉SQL Server 2008所支持的恢复模型。数据库的恢复模型不同,则其所支持的数据库备份方式也不同。在SQL Server2008中恢复模型倒是没有变化,和早期版本是一样的:

恢复模型          描述

简单:    事务被自动截断,不能使用日志文件进行恢复 自动回收日志空间

完整:     保留所有操作的完整事务日志, 可以还原到任意时刻

大容量日志:简要记录大容量操作(索引创建和大容量操作)的日志,完整记录其他事务的日志。从而减少日志空间

详细解释:

简单恢复模式:  在简单恢复模式下,只支持完整备份和差异备份,不支持事务日志备份。在简单恢复模式下还原数据库只能还原到上一次数据库备份时的数据,而上一次数据库备份以后的数据将无法进行还原,在发生灾难时,这些上一次数据库备份以后的数据都必须重做,所以简单恢复模式并不适合于生产系统。另外在简单恢复模式下,事务日志会被truncate,所以日志文件不会增加。也就是会覆盖。

完整恢复模式:完整恢复模式是推荐使用的恢复模式,在发生灾难后进行还原数据库的时候,不会丢失数据,但如果日志尾部损坏,则必须重做上一次日志备份或差异备份之后所做的更改。在完整恢复模式下,所有的操作都会在日志中完整的记录下来,所以日志文件的增长会很快。

大容量日志恢复模式:

大容量日志恢复模式简单地记录了大多数大容量操作的日志如Bulk insert,create index,select  into等,而不是记录全部大容量操作的日志。所以这些大容量操作比在完整恢复模式下执行要快很多,但大容量日志恢复模式会完整的记录其他事务日志。所以大容量日志恢复模式只应用于提高某些大规模大容量操作的性能。

恢复模型

优点

数据丢失情况

恢复到即时点

简单恢复模型

高性能大容量复制操作,最小的日志空间占用

数据库备份后所优势的更改丢失

只能恢复到备份点

大容量日志

高性能大容量复制操作,较小的日志空间占用

会丢失备份后大容量操作的数据

可以恢复到任意备份的结尾

完全

最小的数据丢失可能,恢复到即时点

日志不损坏就不会丢失数据

可以恢复时间点

从简单恢复模式切换之后

如果必须从简单恢复模式切换到完整恢复模式,则我们建议您:

完成到完整恢复模式或大容量日志恢复模式的切换之后,立即进行完整数据库备份或差异数据库备份以启动日志链。

切换到简单恢复模式之后

如果从完整恢复模式或大容量日志恢复模式切换到简单恢复模式,则需要中断备份日志链。因此,极力建议您在切换之前备份日志,这样可允许您将数据库恢复到该点。切换之后,需要定期备份数据,以保护数据。

DEMO:查看恢复模式  更改恢复模式

查看: select * from sys.databases

更改: alter database 数据库名  set recovery  simple full  bulk_logged

了解了SQL Server2008的恢复模式之后,还需要掌握SQL Server2008所支持的备份类型。

备份类型:早期版本只有完全、差异、日志 从SQL 2005开始增加的有段落(部分),尾日志,仅复制。

完全:

差异

日志:

段落:

尾日志:

Copy-Only:在不打断正常备份序列的情况下复制数据库的内容,不截断事务日志,不包含在要进行还原日志序列中,就相当了对现有的数据库再进行一次完整备份。就是在备份后加 with copy_only

完全备份:备份指定数据库的所有数据以及相关的日志。也就是说它会备份指定数据库的所有对象,那么,完全备份的主要特点就是体积大,速度慢。

差异备份:备份的是自完全备份以后发生变化的数据,通常,创建完完全备份之后很短时间内执行的差异备份比完全备份的内容要小,创建的速度也更快。因此,使用差异备份可以加快进行频繁备份的速度,从而降低数据丢失的风险。但经过一段时间的运行后,随着数据库的更新,包含在差异备份中的数量会增加,这使得创建和还原备份的速度变慢。因此,必须重新创建一个完全备份。

事务日志备份:仅用于完整恢复模式或大容量日志恢复模式,备份的是创建备份时处于活动状态的部分事务日志,以及先前日志备份中未备份的所有日志。也就是说,它备份的是上一次日志备份、差异备份以及完全备份以后的事务日志。通常,事务日志在每次常规日志备份之后截断。

连续的日志备份序列称为“日志链”。日志链从数据库的完整备份开始,当第一次完整备份数据库时或将恢复模式从简单恢复模式切换到完整模式或大容量日志恢复模式后,才会开始一个新的日志链。在完整恢复模式下(或者是大容量日志恢复模式下的某些时候)连接不断的日志链可以将数据库还原到任意时间点。如果需要将数据库还原到故障点,则必须保证日志链是完整的。也就是说,事务日志备份的连续序列必须能够延续到故障点。此日志序列的开始位置取决于所还原的数据库的备份类型。

文件和文件组:应用于大型数据库,一周做一次完全备份也可能会耗费很长的时候,那么就可以每周备份其中的一个文件组。然后再循环,中间穿插进行差异和日志备份。

部分备份:部分备份与完全备份类似,但是部分备份不包含所有文件组,部分备份包含主文件组、每个读写文件组以及任何指定(可选)的只读文件中的数据。也就是说默认只备份主文件组和读写文件组。所以,部分备份在希望不包括只读文件组时非常有用。部分备份功能从SQL SERVER 2005开始引入。在创建部分备份时,必须在bacup语句中指定read_write_filegroups,也可以指定只读文件或文件组。

Backup database dufei read_write_filegroups to dufeibak

好处是,针对大型的数据库,在做部分还原的时候,会首先还原的是主文件组,如果主文件组还原成功了,那么这个数据库就可以使用了,然后再去还原其他的文件组。也就是一种所谓的在线还原。后面会有演示。

COPY_ONLY:这个备份一般只用于做测试。仅复制备份可以在不打断正常备份序列的情况下复制数据库的内容,只是产生备份的一个副本。例如,我现在做一次完全备份,再做一次日志备份,再做一次日志备份,但是这一次我加上一个 with copy_only选项,那么大家要注意了,这不是第二次日志备份,只是第一次日志备份的副本。仅此而已,和原来的备份序列没有关系。如:

Backup database dufei to dufeibak with copy_only

尾日志备份: 在完整恢复模式或大容量日志恢复模式下,数据库发生灾难时,SQL Server 2005/2008可以备份日志尾部以捕获尚未备份的活动日志记录,把还原数据库操作之前对日志尾部执行的日志备份称为尾日志备份。一般,在完全恢复模式或大容量日志恢复模式下一旦数据库发生灾难,还原数据库时,进行的第一步操作是尾日志备份,这样才不会丢失自上一次日志备份后的数据。如果日志文件受损且无法创建结尾日志备份,则必须在不使用结尾日志备份的情况下还原数据库,则最新日志备份后提交的任何事务都将丢失。SQL Server 2005 及更高版本通常要求您在开始还原数据库前执行结尾日志备份。结尾日志备份可以防止工作丢失并确保日志链的完整性。将数据库恢复到故障点时,结尾日志备份是恢复计划中的最后一个相关备份。如果无法备份日志尾部,则只能将数据库恢复为故障前创建的最后一个备份。

如果数据库处于联机状态,每当您准备对数据库执行的下一个操作为还原操作时,请在开始还原顺序之前使用 WITH NORECOVERY 备份日志尾部:

语法:   BACKUP LOG 数据库名称 TO <备份设备> WITH NORECOVERY

NORECOVERY   每当您准备对数据库继续执行还原操作时,请使用 NORECOVERY。NORECOVERY 使数据库进入还原状态。这确保了数据库在结尾日志备份后不会更改。

如果数据库处于脱机状态并且无法启动。

尝试执行结尾日志备份。由于此时不会发生任何事务,所以 WITH NORECOVERY 是可选的。如果数据库受损,请使用 WITH CONTINUE_AFTER_ERROR 或 WITH NO_TRUNCATE。

语法:

BACKUP LOG 数据库名称 TO <备份设备> [WITH { CONTINUE_AFTER_ERROR | NO_TRUNCATE }

除非数据库受损,否则不建议使用 no_truncate

仅当您要备份受损数据库的尾部时才能使用 NO_TRUNCATE 或 CONTINUE_AFTER_ERROR。

还有一点改进的地方就是: 在完全备份和差异备份中包含了足够的日志信息用于将数据库还原到一致的状态。这是什么意思?如果我们现在对数据库进行完全备份或差异备份的时候,这个时候肯定还有人正在修改数据。如果早期的版本,这一部分正在修改的数据是不能保存到这次所做的备份中的,但现在当我们在对数据库进行完全备份和差异备份的时候,这一部分正在修改的数据也可以保存到这次的完全备份和差异备份中。

确保备份完整性的选项:

在backup 和restore中使用带有checksums选项

可以验证页校验和

备份时生成整个备份的校验和

使用restore verifyonly

备份集是否完整以及所有卷是否可读

页ID(如同要写入数据)

校验和()

检查目标设备上是否具有足够的空间

下面咱们就来看一下演示:

DEMO1:完全备份 略

DEMO2:差异备份  略

DEMO3:事务日志备份 略

DEMO4:文件和文件组备份

--文件备份

create database demo4

on (name='demo41_data',filename='c:\sql2008\demo41.mdf'),

filegroup fg1

(name='demo42_data',filename='c:\sql2008\demo42.ndf'),

filegroup fg2

(name='demo43_data',filename='c:\sql2008\demo43.ndf'),

filegroup fg3

(name='demo44_data',filename='c:\sql2008\demo44.ndf')

log on

(name='demo4_log',filename='c:\sql2008\demo4.ldf')

go

use demo4

go

create table t1 (id int,uname varchar(8),age int) on [primary]

create table t2 (id int,uname varchar(8),age int) on fg1

create table t3 (id int,uname varchar(8),age int) on fg2

create table t4 (id int,uname varchar(8),age int) on fg3

go

exec sp_addumpdevice 'disk','demo4bak','c:\sqlbak\demo4.bak'

go

use demo4

exec sp_helpfile

exec sp_helpfilegroup

backup database demo4 file='demo41_data' to demo4bak  with name='demo41_data',description='demo41'

backup database demo4 file='demo42_data' to demo4bak with name='demo42_data'

backup database demo4 file='demo43_data' to demo4bak with name='demo43_data'

backup database demo4 file='demo44_data' to demo4bak with name='demo44_data'

backup log demo4 to demo4bak  with name='demo4_log'

use master

drop database demo4

restore headeronly from demo4bak

use master

restore database demo4 file='demo41_data' from demo4bak with file=1,norecovery

restore database demo4 file='demo42_data' from demo4bak with file=2,norecovery

restore database demo4 file='demo43_data' from demo4bak with file=3,norecovery

restore database demo4 file='demo44_data' from demo4bak with file=4,norecovery

restore log demo4 from demo4bak with file=5,recovery

--文件组备份

create database demo4

on (name='demo41_data',filename='c:\sql2008\demo41.mdf'),

filegroup fg1

(name='demo42_data',filename='c:\sql2008\demo42.ndf'),

filegroup fg2

(name='demo43_data',filename='c:\sql2008\demo43.ndf'),

filegroup fg3

(name='demo44_data',filename='c:\sql2008\demo44.ndf')

log on

(name='demo4_log',filename='c:\sql2008\demo4.ldf')

go

use demo4

go

create table t1 (id int,uname varchar(8),age int) on [primary]

create table t2 (id int,uname varchar(8),age int) on fg1

create table t3 (id int,uname varchar(8),age int) on fg2

create table t4 (id int,uname varchar(8),age int) on fg3

go

exec sp_addumpdevice 'disk','demo4bak','c:\sqlbak\demo4.bak'

go

use demo4

exec sp_helpfile

exec sp_helpfilegroup

文件备份

backup database demo4 filegroup ='primary' to demo4bak

backup database demo4 filegroup='fg1' to demo4bak

backup database demo4 filegroup='fg2' to demo4bak

backup database demo4 filegroup='fg3' to demo4bak

backup log demo4 to demo4bak

use master

drop database demo4

restore headeronly from demo4bak

use master

restore database demo4 filegroup='primary' from demo4bak with file=1, norecovery

restore database demo4 filegroup='fg1' from demo4bak with file=2, norecovery

restore database demo4 filegroup='fg2' from demo4bak with file=3,norecovery

restore database demo4 filegroup='fg3' from demo4bak with file=4,norecovery

restore log demo4 from demo4bak with file=5,recovery

也可以同时备份多个文件组:

create database demo4

on (name='demo41_data',filename='c:\sql2008\demo41.mdf'),

filegroup fg1

(name='demo42_data',filename='c:\sql2008\demo42.ndf'),

filegroup fg2

(name='demo43_data',filename='c:\sql2008\demo43.ndf'),

filegroup fg3

(name='demo44_data',filename='c:\sql2008\demo44.ndf')

log on

(name='demo4_log',filename='c:\sql2008\demo4.ldf')

go

use demo4

go

create table t1 (id int,uname varchar(8),age int) on [primary]

create table t2 (id int,uname varchar(8),age int) on fg1

create table t3 (id int,uname varchar(8),age int) on fg2

create table t4 (id int,uname varchar(8),age int) on fg3

go

exec sp_addumpdevice 'disk','demo4bak','c:\sqlbak\demo4.bak'

go

use demo4

exec sp_helpfile

exec sp_helpfilegroup

backup database demo4 filegroup='primary',filegroup='fg1',filegroup='fg2',filegroup='fg3'

to demo4bak with name='demo4多文件组备份'

backup log demo4 to demo4bak with name='demo4日志备份'

use master

drop database demo4

restore headeronly from demo4bak

use master

restore database demo4 filegroup='primary',filegroup='fg1',filegroup='fg2',filegroup='fg3' from demo4bak with file=1, norecovery

  restore log demo4 from demo4bak with file=2,recovery

在创建文件备份时,备份操作不捕获事务日志。必须在创建文件备份后才能创建事务日志备份。还原文件后,必须还原自创建文件备份后创建的事务日志备份以使数据库处于一致状态。

DEMO5:部分备份,也称为在线还原或者是段落还原

通过段落还原分阶段逐步恢复由多个文件组组成的数据库

还原步骤:

还原主文件组和需要立即使用的辅助文件组

在以后通过逐步还原其他辅助文件组

create database demo4

on (name='demo41_data',filename='c:\sql2008\demo41.mdf'),

filegroup fg1

(name='demo42_data',filename='c:\sql2008\demo42.ndf'),

filegroup fg2

(name='demo43_data',filename='c:\sql2008\demo43.ndf'),

filegroup fg3

(name='demo44_data',filename='c:\sql2008\demo44.ndf')

log on

(name='demo4_log',filename='c:\sql2008\demo4.ldf')

Alter database demo4 set recovery simple  --将此数据库的模型改为简单,后面要用

create table t1 (id int,uname varchar(8),age int) on [primary]

create table t2 (id int,uname varchar(8),age int) on fg1

create table t3 (id int,uname varchar(8),age int) on fg2

create table t4 (id int,uname varchar(8),age int) on fg3

--创建四个表放到四个不同的文件组中

--将fg1和fg2更改为只读文件组

alter database demo4 modify filegroup fg1  readonly

alter database demo4 modify filegroup fg2  readonly

--如果需要改为读写,则:

alter database demo4 modify filegroup fg1  readwrite  默认是读写

注意:primary文件组不能设置为只读,因为要写系统信息。

--创建备份设备:

sp_addumpdevice 'disk','demo4bak','c:\sqlbak\demo4.bak'

咱们的演示是模拟primary文件组和fg1只读文件组损坏,所以下面咱们要先备份一下:

--进行相应的设备:

backup database demo4 read_write_filegroups to demo4bak –读写文件组,也就是Primary和fg3

backup database demo4 filegroup='fg1' to demo4bak –只读文件组fg1对应的文件是db42_data

wps_clip_image-30022

wps_clip_image-4563

现在假设Primary文件组和FG1文件组坏了,怎么还原

可以删除 t1 表,因为t2表在fg1只读文件组中肯定不能删除

drop table demo4..t1

这也就是咱们所说的在线还原,早期SQL 2000是不支持的,可以提高还原的效率先让数据库可以使用,然后再继续还原,先还原primary文件组,再还原其他文件组

--先看在简单还原模式下进行在线还原,四个文件组,如下所示,primary和FG1坏了!

primary  和 FG3 是读写

fg1和fg2是只读

现在primary 和fg1坏了,如何还原?

在简单模式下规定,必须先还原所有的读写文件组,而不能只还原primary 文件组。虽然fg3没有坏,那么也要先还原。

以保证数据的一致性,因为在简单模式下是不记录日志的,为了保证数据的一致性,就需要把所有的读写文件组先还原。

也就是说大家记住一点就可以,在简单恢复模式下,要么就不还原,要么就先还原所有的读写文件组,此时数据库就联机了, 然后再还原只读文件组。

下面就是具体的操作:

1 先还原 primary和FG3

use master

Restore database demo4  filegroup='primary',filegroup='fg3' from demo4bak with partial,recovery[,replace]

wps_clip_image-23328

2 再还原fg2,此时fg2没有坏,只是让它也联机

restore database demo4 filegroup='fg2' with recovery

select * from demo4..t3    --也可以访问了

注意:此处没有from,只是联机

3 最后还原fg1

restore headeronly from demo4bak    查看备份状态

restore database demo4 filegroup='fg1' from demo4bak with file=2, recovery

注意带上file=2,参数

因为这只是一个只读的文件组,不需要partial参数

注意:在第一步的时候,如果只还原primary文件组,则会报错,如图所示:

wps_clip_image-29319

--如果是完全还原模式:还是上述情况 PRIMARY和FG1坏了

重新创建新的数据库,不能使用上面的数据库,因为做备份的时候的模式不对!

drop database demo4

exec sp_dropdevice 'demo4bak'

create database demo4

on (name='demo41_data',filename='c:\sql2008\demo41.mdf'),

filegroup fg1

(name='demo42_data',filename='c:\sql2008\demo42.ndf'),

filegroup fg2

(name='demo43_data',filename='c:\sql2008\demo43.ndf'),

filegroup fg3

(name='demo44_data',filename='c:\sql2008\demo44.ndf')

log on

(name='demo4_log',filename='c:\sql2008\demo4.ldf')

use demo4

create table t1 (id int,uname varchar(8),age int) on [primary]

create table t2 (id int,uname varchar(8),age int) on fg1

create table t3 (id int,uname varchar(8),age int) on fg2

create table t4 (id int,uname varchar(8),age int) on fg3

Alter database demo4 set recovery full

--将fg1和fg2更改为只读文件组

alter database demo4 modify filegroup fg1  readonly

alter database demo4 modify filegroup fg2  readonly

--创建备份设备:

sp_addumpdevice 'disk','demo4bak','c:\sqlbak\demo4.bak'

--进行相应的备份:

backup database demo4 filegroup='fg1', read_write_filegroups to demo4bak

backup log demo4 to demo4bak with norecovery   --这个尾部的日志备份是必须的

不然后面的partial还原是失败,它会认为你的日志链不完整。此时就不能对数据库操作了。

--还原

use master

Restore database demo4  filegroup='primary' from demo4bak with file=1,partial,recovery

注意,这个时候就只还原的是主文件组中的文件。速度更快。

select * from demo4..t1   --可以访问了

select * from demo4..t2   -- 不能访问

select * from demo4..t3   -- 不能访问

select * from demo4..t4   -- 不能访问

然后根据重要程度,还原其他文件组,如还原fg2,fg3,它们没有坏,只是脱机

restore  database demo4 filegroup='fg2',filegroup='fg3' with recovery

select * from demo4..t3

select * from demo4..t4

最后再还原 fg1文件组

restore database demo4 filegroup='fg1'  from demo4bak with file=1,recovery

SELECT * FROM demo4..t2

总结:

还原步骤:

1 只还原primary,因为它放系统数据,比较小,速度会很快

restore datbase demo4 filegroup='primary' from demo4bak with partial,norecovery

2 再还原FG2和FG3中的重要数据

restore database demo4 filegroup='fg2',filegroup='fg3'  with recovery

3 最后再还原fg1中的数据

restore database demo4 filegroup='fg1'  from demo4bak with recovery

DEMO6:仅复制备份 copy_only

Copy_only备份,只是产生一个备份的副本,但是不会包含在原来的备份序列中。

比如:咱们做过一次完全备份后,又做一次日志备份,再做一次日志的copy_only备份,这只是上一次日志备份的副本,不是第二次日志备份。

实例:

create database demodb

go

use demodb

create table yg (id int,uname varchar(8))

go

sp_addumpdevice 'disk','bak_a','c:\sqlbak\bak_a'

go

sp_addumpdevice 'disk','bak_b','c:\sqlbak\bak_b'

go

backup database demodb to bak_a 

insert into demodb..yg values (1,'a')

backup log demodb to bak_a

backup log demodb to bak_b with copy_only –这是紧接着它的上一条日志备份的副本,而且不和它们是同一个备份序列。所以还原时不能一起使用。

-- 删除数据库,现在还原:

use master

drop database demodb

restore database demodb from bak_a with file=1,norecovery

restore log demodb from bak_a with file=2, recovery

这是可以的,但如果使用下面的语句还原是错误的:因为不是同一个备份序列

restore database demodb from bak_a with file=1,norecovery

restore log demodb from bak_b with file=1,recovery

那大家再看一个例子:

drop database demodb

sp_dropdevice 'bak_a'

go

sp_dropdevice 'bak_b'

create database demodb

go

use demodb

create table yg (id int,uname varchar(8))

go

sp_addumpdevice 'disk','bak_a','c:\sqlbak\bak_a'

go

sp_addumpdevice 'disk','bak_b','c:\sqlbak\bak_b'

go

backup database demodb to bak_a 

insert into demodb..yg values (1,'a')

backup log demodb to bak_a

insert into demodb..yg values (2,'b')

backup log demodb to bak_b with copy_only

-- 删除数据库,现在还原有两条记录的时候,能不能还原?为什么?

use master

drop database demodb

restore database demodb from bak_a with file=1,norecovery

restore log demodb from bak_a with file=2, norecovery

restore log demodb from bak_b with file=1,recovery

select * from demodb..yg

wps_clip_image-8668

这为什么行呢,是因为copy_only的备份跟上一次的日志备份中隔了一个操作,就不是它的副本了,跟它没有关系,这就纯粹是第二次日志备份了,在这里这个with copy_only也没有意义!

DEMO: T-SQL恢复语句,使用restricted_user取代了DBO_ONLY

使用场景:数据库还原成功后,可能还需要对数据库做一些维护工作,那么就不允许所有人都能访问,RESTRICTED_USER 只允许 db_owner 固定数据库角色成员以及 dbcreator 和 sysadmin 固定服务器角色成员连接到数据库,不过对连接数没有限制。

DEMO:时间点还原

早期SQL Server2000的时候只允许在日志备份的时候才允许使用时间点还原,在SQL 2005以后也可以完全备份和差异备份的时候使用时间点还原,因为在备份的时候,将日志也备份到了备份集中。

如:上午9:00做一次完全备份,9:30然后建一张表,10:00再做一次差异备份。10:30又做一张表,11:00做一次日志备份,在早期的2000版本中,只能在10:00至11:00这一段进行时间点的还原。但在2005以后的版本中可以在9:00—11:00这一段时间进行时间点的还原,任意时间

如:

Restore database|log  库名  from 设备  with recovery,stopat=’月/日/年  时间’

Restore database dufei from dufeibak with recovery,stopat=’mar 1,2011 9:35 AM’

实例:

drop database demodb

sp_dropdevice 'bak_a'

同时删除文件

create database demodb

sp_addumpdevice 'disk','bak_a','c:\sqlbak\baka.bak'

use demodb

create table yg1 (id int,uname varchar(8),age int)

backup database demodb to bak_a

insert into demodb..yg1 values (1,'a',11)

backup log demodb to bak_a

insert into demodb..yg1 values (2,'b',21)

backup log demodb to bak_a

insert into demodb..yg1 values (3,'c',31)

backup log demodb to bak_a

create table yg2 (id int,uname varchar(8),age int)

backup database demodb to bak_a with differential

现在删除数据库,咱们进行时间点的还原:

use master

drop database demodb

查看一下备份的状态,看一下时间:

restore headeronly from bak_a

wps_clip_image-1267

但如果时间指定的太早,或太晚也会报错,如:

wps_clip_image-21340

那如果我们现在就希望利用时间点还原到yg1表中有三条记录的时候,就可以:

restore database demodb from bak_a with file=1,norecovery,stopat='04/21/2011 17:22:58'

restore log demodb from bak_a with file=2,norecovery,stopat='04/21/2011 17:23:14'

restore log demodb from bak_a with file=3,norecovery,stopat='04/21/2011 17:23:40'

restore log demodb from bak_a with file=4,recovery,stopat='04/21/2011 17:24:18'

每一次的还原时间,只要是备份前后一点就行,第一次的完全备份靠后一点点就行。最后一次的靠前一点。

select * from demodb..yg1

那如何利用时间点还原到最后一次的差异备份。

restore database demodb from bak_a with file=1,norecovery,stopat='04/21/2011 17:23:00'

restore database demodb from bak_a with file=5,recovery,stopat='04/21/2011 17:24:31'

select * from demodb..yg1

select * from demodb..yg2

--OK!!

DEMO:  备份镜像:mirror to  最多支持四个镜像,带三个mirror to

如:backup database 库名  to 备份设备 mirror to 新设备  with format

With format 是指新设备第一次使用时必须使用此参数进行格式化,以后使用时则不需要。

只是对本次的备份做一个镜像,以后发生错误。

实例:

drop database demodb

sp_dropdevice 'bak_a'

sp_dropdevice 'bak_b'

sp_dropdevice 'bak_c'

同时删除文件

create database demodb

sp_addumpdevice 'disk','bak_a','c:\sqlbak\baka.bak'

sp_addumpdevice 'disk','bak_b','c:\sqlbak\bakb.bak'

sp_addumpdevice 'disk','bak_c','c:\sqlbak\bakc.bak'

use demodb

create table yg1 (id int,uname varchar(8),age int)

insert into demodb..yg1 values (1,'a',11)

backup database demodb to bak_a mirror to bak_b with format

insert into demodb..yg1 values (2,'b',22)

backup database demodb to bak_a mirror to bak_b with differential

wps_clip_image-24647

我们来试一下:

use master

drop database demodb

restore database demodb from bak_a with file=1,norecovery

restore database demodb from bak_a with file=2,recovery

或者使用:

use master

drop database demodb

restore database demodb from bak_b with file=1,norecovery

restore database demodb from bak_b with file=2,recovery

或者混用:

use master

drop database demodb

restore database demodb from bak_a with file=1,norecovery

restore database demodb from bak_b with file=2,recovery

select * from demodb..yg1

也可以使用有多个镜像,最多是三个mirror to。

backup database demodb to bak_a mirror to bak_b mirror to bak_c  with format

wps_clip_image-29571

执行页面还原:对数据库中损坏的单个页进行恢复

对于大型长时间运行的数据库来说,

通过执行页面还原对数据库中损坏的页进行修复,攻取页面损坏信息:

SQL Server错误日志   哪个页出现错误,出现页码

Msdb.dbo.suspect_pages表   也会出现错误页码

Restore database adventureworks page=’adventureworks_data_1:832’ from awbackup

数据库还原过程原理:

数据库还原阶段的过程

数据复制阶段

从数据库的备份媒体将所有数据、日志和索引页复制到数据库文件中

重做阶段(Redo)/前滚(Roll Forward)

重做所有已经提交的事务,将记录的事务应用到从备份复制的数据,以将这些数据前滚到恢复点

撤销阶段(Undo)/ 回滚(Roll Back)

回滚所有未提交的事务并使用户可以使用此数据库,回滚阶段后将无法还原后续的备份

Recovery选项:

完成重做和撤消两个阶段 完成后数据库在线,也就是代表还原的结束

Norecovery 选项

不执行撤消阶段以保留未提交的事务

允许还原其他备份以将数据库进一步前滚(Redo),还原未结束

还原系统数据库:

还原master、model和msdb数据库,SQL Server2008下面还原系统数据库和2005是一样的,但和SQL Server 2000有很大的区别。

分为两种情况:

SQL Server服务可以启动:

步骤:以单用户模式启动SQL Server

      还原最近一次的系统数据库备份

      重新启动服务器或服务

具体操作如下:

1备份系统数据库

backup database master to disk='c:\sqlbak\master.bak'

2在SQL Server配置管理器中,停止SQL Server服务

wps_clip_image-25733

3以单用户方式启动服务:

在 SQL Server 配置管理器中,单击“SQL Server 服务”。在右窗格中,右键单击 SQL Server (<实例名>),再单击“属性”。在“高级”选项卡的“启动参数”框中,键入以分号 (;) 分隔的参数。要以单用户模式启动,请在现有启动选项之前插入 -m;,然后重新启动数据库。

wps_clip_image-18255

注意:在此需要停止其他的所有服务,只有SQL Server服务启动,如图所示:

wps_clip_image-7085

也可以使用sqlserver –c –m 命令

4还原系统数据库

使用查询分析器可以,但一般使用一个小工具:

C:\>sqlcmd -S shanghaisql

1> restore database master from disk='c:\sqlbak\master.bak'

2> go

已为数据库 'master',文件 'master' (位于文件 1 上)处理了 376 页。

已为数据库 'master',文件 'mastlog' (位于文件 1 上)处理了 3 页。

已成功地还原了 master 数据库。正在关闭 SQL Server。

SQL Server 正在终止此进程。

5再以正常方式启动SQL Server,再次修改SQL Server服务的参数,去掉-m:

如图所示:

wps_clip_image-3538

再启动相应的服务,如代理等

Msdb和model数据库的备份还原和用户数据库相同,在正常启动方式下,做备份还原即可,但:

注意:必须停止代理服务,因为代理服务会使用MSDB数据库

restore database msdb from disk='c:\sqlbak\msdb.bak'

backup log model to disk='c:\sqlbak\model.bak' with norecovery

restore database model from disk='c:\sqlbak\model.bak'

SQL Server服务不能启动,可能是master数据库损坏或注册表坏了

步骤: 使用setup.exe 重建系统数据库

      还原系统数据库

       还原model和msdb数据库

       重新启动服务器或服务

具体操作如下:

准备SQL Server的安装光盘,需要用到Setup.exe文件

1停止服务,删除master 模拟故障

删除master所对应的mdf 、ldf文件

2启动服务失败

wps_clip_image-31060

3重建系统数据库,因为master为已经坏了,虽然有备份,但服务启不来,也不能还原。

D:\>Setup  /ACTION=REBUILDDATABASE /INSTANCENAME=mssqlserver /SAPWD="BJfeidu2011" /SQLSYSADMINACCOUNTS=administrators

根据提示,简单操作即可!

wps_clip_image-495

也可以自动安装:加上 /q 参数

D:\>Setup  /q /ACTION=REBUILDDATABASE /INSTANCENAME=mssqlserver /SAPWD="BJfeidu2011" /SQLSYSADMINACCOUNTS=administrators

4进入单用户模式

如果不需要还原master,则直接启动 SQL Server服务,就可以正常使用了,但我们现在需要还原 master,

因此需要设置为单用户模式

wps_clip_image-5099

5利用工具如 sqlcmd还原master

C:\>sqlcmd -S shanghaisql

1> restore database master from disk='c:\sqlbak\master.bak'

2> go

wps_clip_image-29444

6再以正常方式启动SQL Server

wps_clip_image-3390

操作到此结束!

阅读(1754) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~