sql server 备份与恢复系列六 文件组备份与还原

by admin on 2019年11月18日

一. 概述

  在sql server
备份与回复体系的率先篇里,有讲到大体量形式下备份与还原的连带文化。那篇首要来演示在大体量形式下常用的备份与回复方式“完整备份+差距备份+日志备份”。
在大体量恢复生机情势下,非常要留心的是在怎么样景况下会导致数据复苏遗失风险,带着那个难题,来举办身体力行验证。备份战术如下图所示:

图片 1

一.概述

  前边介绍了简短恢复生机情势和大容积恢复格局,那篇一而再写完整恢复生机形式下的备份与回复。在全部恢复生机形式里最大的亮点是假使能打响备份尾日志,就足以过来到日志备份内含有的其他时点(“时点恢复生机”)。当然比较前三种情势它是牺牲了磁盘I/O质量。

恢复模式

备份策略

数据安全性

I/O性能

简单恢复

完整备份+差异备份

安全最差。最后一次备份之后,所有数据操作丢失。

最优

大容量恢复

完整备份+差异备份+日志备份

折中。批量操作有丢失风险。尾日志备份失败。最后一次备份之后,所有数据操作丢失

折中

完整恢复

完整备份+差异备份+日志备份

相比上面二种最安全。尾日志备份失败。最后一次备份之后,所有数据操作丢失

最差

  在完全复苏方式下,最司空见惯的备份战术,如下图所示:图片 2

一.概述

  当数据库发生损坏,数据库的每种文件都能开采,只是个中的一些页面坏了,这种情形能够正视DBCC
CHECKDB进行数据库检查修复。即使要确定保障数据库不丢掉,或修复不佳,管理员只好做数据库完整过来,为了少数页面恢复生机整个数据库,代价是相比较高的,sql
server引进了页面还原来的作品用,能够钦赐还原若干页面,进而能够大大节省数据库苏醒时间。
  页面还原用于修复隔绝的毁坏页面,还原苏醒时间比文件越来越快,减弱了复苏进度中居于离线的数据量,当有些文件的大度页面都冒出破坏,能够一贯还原该公文(供给有文件备份)。要扩充还原的页面是在探望该页面,蒙受错误而标志为”疑心”,能够实施去找msdb.dbo.suspect_pages表。在页面还原后,也亟需还原全数的日记文件备份
  1.1 还原的范围,无法卷土而来的页
    (1)事务日志不能够还原。
    (2)分配页面:全局分配映射GAM页面,分享全局分配映射SGAM页面和可用空间PFS页面,那么些连串页面损坏,页面还原不大概苏醒。
    (3)全体数据文件的页面0 的(文件运维页面卡塔 尔(阿拉伯语:قطر‎。
    (4)页面1:9的(数据库运营页面)。
  1.2 还原标准
    (1) 必须利用完全恢复生机形式。
    (2) 只读文件组中的页面不可能苏醒。
    (3) 还原顺序必须是从完整备份,文件备份中平复页面初叶。
    (4) 页面还原供给收尾到前段时间些天记文件的连天日志备份
    (5) 数据库备份和页面还原不能并且实行。

一.概述

  前面讲了备份的有些理论知识,那篇最初讲在精练恢复生机格局下的备份与回复。在简短情势下是不可能做日志备份的,爆发磨难后,数据库最终三次备份之后做的数额修改将是整整不见的,所以在生育条件下,数据又很要紧,日常不提出使用这种格局。
比如对一个数据库有5次完整数据备份,时间是t5,  之后发出患难,就能部错过。

图片 3

  当数据库更加大,完整备份时间会更为长,为了减小错失风险,引进差别备份。举个例子下图演示:在率先次建构数据库完整备份后,营造了贰回差别备份,之后再建构风流罗曼蒂克体化备份,进而确立新的异样基准。不管是总体备份依然间距备份,日常只可以在夜晚打开。假使数量比较宏大又不允许长日子数额遗失,那简单苏醒格局是不可能知足的。

图片 4

一. 概述

  文件备份是指备份一个或七个公文或文件组中的享有数据。使用文件备份能够只还原损坏的文件,而不用还原数据库的其余部份,进而加快恢复生机速度。举例,假设数据库由位于不一样磁盘上的多数文本组成,在内部贰个磁盘发生故障时,只需还原那个故障磁盘上的文本,其余磁盘文件无须还原,那样缩小还原时间。

  在完全复苏方式下,一站式平安无事文件备份和满含全数文件备份的日志备份合起来,等同于二个完全部据库备份。

  1.1 文件备份具犹如下优点:
    (1)能够高速复苏损坏的公文。
    (2)当非常的大型数据库在全部备份下变得难以管理时,文件备份扩展了布置和媒体管理的八面驶风。

  1.2 文件备份具备不足:
    (1)
与全部数据库备份相比,文件备份的第大器晚成劣点是治本较为复杂。假如有个别损坏的文书未备份,那么媒体故障也许会促成力不胜任苏醒整个数据库。故此必须保证少年老成组完整的文书备份,还非得保险一个或四个日志备份。
    (2)
维护和跟踪这个完整备份是生机勃勃种耗费时间的职责,所需空间会超过全体数据库备份所需的上空。

二.备份

    笔者那边有TestBulkLogged库,Curry新建了叁个product空表。备份SQL语句如下所示:

use master
-- 设置大容量模式
ALTER DATABASE TestBulkLogged SET RECOVERY bulk_logged

-- 做一次完整备份到备份设备中(备份基准) 
backup database  TestBulkLogged to BackupTestDevice

-- 新增
insert into TestBulkLogged.dbo.product(model,upbymemberid,brand) values('第一次新增数据',9708,'IT')

-- 做一次日志备份
backup log   TestBulkLogged to BackupTestDevice

-- 批量插入(5998 行受影响)
insert into TestBulkLogged.dbo.product(model,upbymemberid,brand)
select model,upbymemberid,brand from test.dbo.product

-- 做二次日志备份
backup log   TestBulkLogged to BackupTestDevice

-- 第二次日志备份后的新增
insert into TestBulkLogged.dbo.product(model,upbymemberid,brand) values('第二次新增数据',9708,'IT')

-- 做差异备份
backup database  TestBulkLogged to BackupTestDevice with differential 

-- 全部删除(6000 行受影响)
delete from TestBulkLogged.dbo.product

  查看备份集列表如下图所示:

图片 5

二. 备份

  在前章中讲到了大体量苏醒情势下的备份。备份策略与大体积形式是平等的,雷同是生机勃勃体化备份+差别备份+日志备份。这里要出色点是:当误操作发生后,如何回复到误操作在此以前的一分钟,搜索误操作以前的数额。
在”sql server
日志文件结构及误操作数据找回”中有介绍误操作数据找回,不过根据第三方工具ApexSQL
Log。尽管该工具方便,但要收取金钱啊。

  作者这里有贰个BackupTest库,Curry有个Employees表

use master
--设置完全模式
ALTER DATABASE BackupTest SET  RECOVERY FULL  
--创建备份设备(有就不要执行)
use master
exec sp_addumpdevice 'disk', 'BackupTestDevice','F:\SqlService\backup\BackupTestBackup.bak'
go
--做一次完整备份到备份设备中(备份基准)
backup database  BackupTest to BackupTestDevice

--新增数据
insert BackupTest.dbo.Employees values('湖南长沙')
insert BackupTest.dbo.Employees values('湖南湘潭')
--日志备份
backup log BackupTest to BackupTestDevice

 备份集如下所示:

图片 6

-- 误操作发生, 忘记加where条件,操作时间是:2018-8-12 10:55  
delete from BackupTest.dbo.Employees 

二.还原步骤      

  (1) 获取要还原的损坏页面包车型大巴页ID,当sql
server碰到校验或缺损写错误时,会回去页面编号。能够由此查询msdb数据Curry的suspect_pages表,或许监视事件和errorlog文件里记录的错误音讯,查找到损坏的页面ID。
  (2)
从饱含页的完全体据库备份,文件备份或文件组备份开头开展页面还原。在restore
database 语句中,使用page子句列出全体要还原的页ID。
  (3) 应用近日的差异备份。
  (4) 应用持续的日记备份。
  (5) 创造新的数据库尾日志备份。
  (6) 还原新的尾日志备份,应用那几个新的日记备份后,就完事了页面还原。

二.备份演示

  在简要苏醒情势下第生龙活虎的备份是完整备份和反差备份。小编那边有TestLog库,Curry有一个表。倘使星期天做一次完整备份,周风度翩翩到周末早晨每天做三遍差距备份,到第二周的周末时开端新的基准线。如下所示

use test
exec sp_addumpdevice 'disk', 'BackupTestDevice','F:\SqlService\backup\BackupTestBackup.bak'

  图片 7

--设置恢复模式为简单恢复
 ALTER DATABASE TestLog SET RECOVERY simple
go
-- 做一次完整备份到备份设备中(备份基准) 假设在周日晚上
backup database  TestLog to BackupTestDevice
go

图片 8

go
--差异备份 周一晚
backup database TestLog to BackupTestDevice with differential 
go
--差异备份 周二晚
backup database TestLog to BackupTestDevice with differential 
go
--差异备份 周三晚
backup database TestLog to BackupTestDevice with differential 
go
--差异备份 周四晚
backup database TestLog to BackupTestDevice with differential 
go
--差异备份 周五晚
backup database TestLog to BackupTestDevice with differential 
go
--差异备份 周六晚
backup database TestLog to BackupTestDevice with differential 
go
--完整备份 周日晚(新基准)
backup database TestLog to BackupTestDevice with differential 
go
--差异备份 周一晚
backup database TestLog to BackupTestDevice with differential 

 在备份设备中查阅备份集
  图片 9

-- 通过脚本查看

select distinct
s.first_lsn,s.last_lsn,s.database_backup_lsn,s.position,
s.backup_finish_date,s.type,y.physical_device_name,s.backup_size
from msdb..backupset as s inner join
msdb..backupfile as f on f.backup_set_id=s.backup_set_id inner
join
msdb..backupmediaset as m on s.media_set_id=m.media_set_id inner
join
msdb..backupmediafamily as y on m.media_set_id=y.media_set_id
where s.database_name=’TestLog’
order by s.position asc

图片 10

 

二. 文件备份计谋  

   使用文件备份和日志备份还原数据库的操作恐怕相比复杂,因而最棒先实行总体数据库备份,并在第五个公文备份最早此前,举行日志备份。下图在t0创造数据库后,顿时实践总体数据库备份t1,创建第二个风度翩翩体化数据库备份后,便足以先导试行工作日志备份。事务日志备份按安排的间隔时间实行,文件备份以最适合数据库业务须要的间隔实行,下边是先备份主文件组A,再是帮扶文件组B。在整机恢复生机情势下,苏醒二个文件组备份,不但需求苏醒文件组备份本人,还要求各样恢复生机从上一回完整数据库备份后到还原的对象时间点甘休的保有日志备份。即使日志备份数据多,能够伪造再给合差别文件备份,但如此备份布署越发难于管理。

图片 11

 

三. 还原(1)批量安排的是或不是会放任

  通过还原查看批量插入操作是不是遗失,在备份尾日志时假设报错,
消息如下:”因为数据库正在使用,所以不大概获取对数据库的独占访问权”
供给将库设置成单客户情势

use master

-- 先还原完整备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
restore database TestBulkLogged from BackupTestDevice with file=10, norecovery 

    图片 12

   在大体积形式下还原时,sql
server会检查测量检验你是或不是开展了尾日志备份,也是保障最后一回日志备份后,所做的数量操作在还原后不甩掉。(比如尾日志备份失败,则不见数据卡塔 尔(阿拉伯语:قطر‎。下边先备份一下尾日志,
使用norecovery 暂不提交

-- 尾日志备份
backup log TestBulkLogged to BackupTestDevice with norecovery 

图片 13

 上海教室备份了尾日志后,备份集里多出了三个文书号14, 上面在再度苏醒完整备份

-- (重新)从备份恢复一个全备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
restore database TestBulkLogged from BackupTestDevice with file=10, norecovery 

    图片 14

-- 恢复到日志文件11  
restore database TestBulkLogged from BackupTestDevice  with file=11, norecovery

-- 恢复到日志文件12  
restore database TestBulkLogged from BackupTestDevice  with file=12, recovery

    图片 15

 接下来我们来查询下库中的product表,查看数据是还是不是全体苏醒。

-- 查询大批量操作的数据,是否已还原出来
select * from TestBulkLogged.dbo.product

  图片 16

  结论:通过上海体育场面大家得以驾驭到,第2回和第壹回做的日记备份都康健的还原了过来。
大量布署操作也获得了复苏。表明在大容积形式下,一大波操作的多少,
还原恢复生机可能存在错过的高风险,但不自然会抛弃掉

三.还原(1)

  当误操作产生后,是需求找管理员来开展多少复苏。
借使数据库太大,还原是必要相当短日子(注意使用别本,不要接收临蓐库卡塔 尔(英语:State of Qatar)。
这种处境下就须求静观其变了。 防止的不二等秘书籍:(1)是做sql检查核对,不在Managemnet
studio里直接操作,防止此类职业爆发.(2)是应用粒度更加小的备份情势,但相应的头昏眼花些。

--步骤1 备份尾日志
use master
go
backup log BackupTest to BackupTestDevice with norecovery 

图片 17

go
--步骤2 从备份恢复一个全备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
restore database BackupTest from BackupTestDevice with file=19, norecovery --事务不恢复

--步骤3 
restore log BackupTest from BackupTestDevice  with file=20,  norecovery --事务不恢复

--步骤4 用stopat恢复到10:54
restore log BackupTest from BackupTestDevice  with file=21, stopat='2018/8/12 10:54', recovery --事务恢复

--数据又回来了
select * from  BackupTest.dbo.Employees 

  图片 18

三. 备份

  为了演示损坏的多少页面,新建一个PageTest表,开始化多少个PAGE页,前面人为的毁损叁个数额页面。

use BackupPageTest
-- 创建表
create table PageTest
(
    ID int,
    name varchar(8000)
)
-- 产生
insert into PageTest
select 1, REPLICATE('a',8000)
insert into PageTest
select 1, REPLICATE('b',8000)
insert into PageTest
select 1, REPLICATE('c',8000)

 sys.system_internals_allocation_units 查看分配页情状

 图片 19

/* 
第1个参数:库名
第2个参数:表名
第3个参数:-1: 显示所有IAM、数据分页、及指定对象上全部索引的索引分页
PageFID: 文件ID
PageType=1 指数据页面
PageType=10 IAM页面
*/ 
-- 未公开的命令,语法如下:
DBCC IND(dbname,tablename,-1)

三. 还原演示

   将三个数据库还原,须求结构多少个科学的复苏顺序。在还原经过中,备份文件结尾使用norecovery事务不回复(正在恢复生机。。卡塔尔国不可读写,在最后一个备份文件结尾使用recovery事务恢复生机。数据库复苏符合规律。

-- 切换到master库
use master

--设置单用户模式(否则执行下面报错:“因为数据库正在使用,所以无法获得对数据库的独占访问权”)
ALTER DATABASE TestLog SET OFFLINE WITH ROLLBACK IMMEDIATE

-- 从备份恢复一个全备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
restore database TestLog from BackupTestDevice with file=1, norecovery 

  图片 20图片 21

-- 恢复到差异备份文件3,跳过差异备份2 ,看是否备份成功
restore database TestLog from BackupTestDevice  with file=3, recovery

  图片 22图片 23

-- 备份结束之后,结束单用户模式
ALTER  database  TestLog  set   online  

 上面在来演示还原差距文件,使用旧法则。还原看会怎样

-- 从旧基准中恢复一个全备份 ,norecovery(正在还原...)不可读写. file是1
restore database TestLog from BackupTestDevice with file=1, norecovery 

--新基准file是8, 恢复到差异备份文件9 
restore database TestLog from BackupTestDevice  with file=9, recovery

图片 24

 

 计算:对于简易苏醒方式,未有日记备份,苏醒只需求三个完好无损数据库备份,以至尾声三个异样备份。
对于八个出入备份文件,在还原时无需LSN的三番三次性(在同三个尺度内)。

三.文书还原  

   当一个大数据库有多少个公文和文件组,如若破坏只是汇总在中间一个文书或文件组上,sqlserver只要把坏掉的不胜数据文件组重建,料定能够节约时间。不过数据库的事务改革是会分布在相继数据文件上的,假如用备份只回复在那之中一个文本,而任何文件不恢复,那么它们的情景自然会不均等,那样数据库是回天乏术利用的,为了使新恢复生机的文书可以自行恢复生机备份以往做的改变,就必要依赖事务日志。使用文件备份还原三个或四个受到伤害文件的步子如下:

  (1) 创造活动职业日志的尾日志备份。
对于离线文件还原,在文书还原以前必需始终先举办贰回尾日志备份。对于在线文件还原,在文件还原之后必须始终先进行一次日志备份。因为日志文件十一日损坏,文件还原则不能开展。

  (2) 从每种损坏的文本的新型文件备份还原相应文件。

  (3)
针对种种还原的文件,还原近些日子的差别文件备份(要是有,因为这么还原快)

  (4)
按顺序还原事情日志备份,从岁月上最初备份的日记文件开始,到步骤1的尾日志截至。

 四. 还原(2)打断日志链

  在前方呈报事情日志时涉嫌了, 事务日志链LSN,
在苏醒的时候必须求保全事务链的种种,依次的复苏。
上边演示跳过日志链文件ID:11 ,间接过来日志链文件ID:12。

-- 尾日志备份
backup log TestBulkLogged to BackupTestDevice with norecovery 

-- 从备份恢复一个全备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
restore database TestBulkLogged from BackupTestDevice with file=10, norecovery 

-- 跳过日志文件11,恢复到日志文件12  
restore database TestBulkLogged from BackupTestDevice  with file=12, recovery

  图片 25

  结论:要是独有(完整备份和作业日志备份卡塔 尔(英语:State of Qatar),
在还原时,事务日志必得保持LSN顺序,依次还原,否则还原失利就能够抛弃数据。

四.还原(2)

  在眼下介绍中,有讲过,完整复苏方式切换来大体积格局,日志链是不会中断。上边来验证

--从完整恢复模式切换到大容量模式
ALTER DATABASE BackupTest SET  RECOVERY bulk_logged 
-- 新增
insert BackupTest.dbo.Employees values('湖南株洲')
--日志备份
backup log BackupTest to BackupTestDevice
-- 删除
delete from BackupTest.dbo.Employees 

-- 尾日志
backup log BackupTest to BackupTestDevice with norecovery 

 备份集如下所示,日志文件ID:22是在大体量情势下备份的,23是尾日志

图片 26

restore database BackupTest from BackupTestDevice with file=19, norecovery --事务不恢复
restore log BackupTest from BackupTestDevice  with file=20,  norecovery --事务不恢复
restore log BackupTest from BackupTestDevice  with file=21,  norecovery --事务不恢复
restore log BackupTest from BackupTestDevice  with file=22,  recovery 

  当日志还原到文件ID:22时,报错,如下图所示

图片 27

   跳过文件ID:22, 使用23来交付业务,也会报错,如下所示:

restore log BackupTest from BackupTestDevice  with file=23,  recovery

图片 28

   经过测量检验,还原失利,错误是指:与上一回恢复生机到指如时期点有涉及。

  上面在测量检验一个新库TestFULLToBulk

--设置完全模式
ALTER DATABASE TestFULLToBulk SET  RECOVERY FULL  
--做一次完整备份到备份设备中(备份基准)
backup database  TestFULLToBulk to BackupTestDevice
insert TestFULLToBulk.dbo.product values('湖南株洲')
--日志备份
backup log TestFULLToBulk to BackupTestDevice
--设置大容量
ALTER DATABASE TestFULLToBulk SET RECOVERY bulk_logged   

insert TestFULLToBulk.dbo.product values('湖南湘潭')
--日志备份
backup log TestFULLToBulk to BackupTestDevice

  备份集如下:文件ID28是在大容积下开展的备份

  图片 29

backup log TestFULLToBulk to BackupTestDevice with norecovery 
go
restore database TestFULLToBulk from BackupTestDevice with file=26, norecovery 
go
restore log TestFULLToBulk from BackupTestDevice  with file=27,  norecovery 
go
restore log TestFULLToBulk from BackupTestDevice  with file=28,  recovery 

  上边还原成功,注脚了整机苏醒格局切换来大体量情势,日志链是不会搁浅。

 

  图片 30

use master
-- 完整备份
backup database  BackupPageTest to BackupTestDevice

四 . 数据开始化  

--第一步: 创建数据库
CREATE DATABASE [FileGroupTest]
go
USE [FileGroupTest]

--第二步:创建文件组
ALTER DATABASE [FileGroupTest] ADD FILEGROUP [FG_Test_Id_01]
ALTER DATABASE [FileGroupTest] ADD FILEGROUP [FG_Test_Id_02]

--第三步:创建文件添加到文件组
ALTER DATABASE [FileGroupTest] ADD FILE
(NAME = N'FG_TestUnique_Id_01_data',FILENAME = N'D:\Data\FG_TestUnique_Id_01_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB )
TO FILEGROUP [FG_Test_Id_01]

ALTER DATABASE [FileGroupTest] ADD FILE
(NAME = N'FG_TestUnique_Id_02_data',FILENAME = N'D:\Data\FG_TestUnique_Id_02_data.ndf',SIZE = 1MB, FILEGROWTH = 1MB )
TO FILEGROUP [FG_Test_Id_02]

--第四步创建表存放在不同文件上
CREATE TABLE  Student(ID INT,Name varchar(50),[Address] varchar(100)) ON [FG_Test_Id_01]
CREATE TABLE  Teacher(ID INT,Name varchar(50),[Address] varchar(100)) ON [FG_Test_Id_02]
CREATE TABLE  School(ID INT,Name varchar(50),[Address] varchar(100)) ON [PRIMARY]

图片 31

图片 32

-- 养成好习惯先进行完整备份
backup database  [FileGroupTest] to BackupTestDevice

五. 还原(3) 依靠差距备份下的日记还原

  在分娩情状中,由于日记文件备份频仍,招致日志文件太多,如若按日志文件一个二个来回复,必要多量时间和活力。下边演示直接从出入备份还原开首,看前面包车型地铁日记文件是不是能还原成功。

图片 33

-- 尾日志备份
backup log TestBulkLogged to BackupTestDevice with norecovery 

-- 从备份恢复一个全备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
restore database TestBulkLogged from BackupTestDevice with file=10, norecovery 

-- 恢复到差异备份文件13. 跳过日志文件11,12 
restore database TestBulkLogged from BackupTestDevice  with file=13, recovery

 
 上边还原是跳过了日记文件,间接行使差别备份文件还原。大家来查阅下表中的数据,会意识间距备份完全可以回复准确成功。

  图片 34

上面是天悬地隔备份与日志备份组合来平复,结论是日记文件无需三个叁个来回复,可以一向固定到,三个间距备份来还原,再复苏,之后的日记文件。

-- 尾日志备份
backup log TestBulkLogged to BackupTestDevice with norecovery 

-- 从备份恢复一个全备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
restore database TestBulkLogged from BackupTestDevice with file=10, norecovery 

-- 恢复到差异备份文件13. 跳过日志文件11,12 
restore database TestBulkLogged from BackupTestDevice  with file=13, norecovery

-- 恢复到日志文件14 
restore database TestBulkLogged from BackupTestDevice  with file=14, recovery

   结论:有了差距备份,在还原时就节约了相当多恢复生机时间和生机。能够在黄金年代体化备份的条件内,直接采纳末了一遍的异样备份加上之后的日志备份来回复。

四 模拟页面损坏

  使用PagePID为89的数目页面举办事必躬亲,通过dbcc
page查看该页面,知道该页数据是累积的第三条数据。

dbcc traceon (3604)
dbcc page('BackupPageTest',1,89,1)

  图片 35

  使用 dbcc wirtepage来模拟该面损坏:

-- 未公开的命令语法为如下
dbcc writepage ({ dbid, 'dbname' }, fileid, pageid, offset, length, data)

-- 模拟页面损坏
dbcc writepage(BackupPageTest,1,89,96,10,0x65656565656565656565)

图片 36

-- 查询该表时,第三条数据显示NULL
select * from PageTest

五. 备份演示

-- 给二个表插入数据
insert into Student values(1,'张三','广东深圳')
insert into Teacher values(1,'李四','广东佛山')

-- 日志备份
backup log  [FileGroupTest] to BackupTestDevice

-- 给二个表插入数据
insert into Student values(2,'张三2','广东深圳')
insert into Teacher values(2,'李四2','广东佛山')

-- 日志备份
backup log  [FileGroupTest] to BackupTestDevice

-- 文件组FG_Test_Id_01备份
backup database [FileGroupTest] file='FG_TestUnique_Id_01_data' to BackupTestDevice

-- 给二个表插入数据
insert into Student values(3,'张三3','广东深圳')
insert into Teacher values(3,'李四3','广东佛山')
-- 日志备份
backup log  [FileGroupTest] to BackupTestDevice
-- 给二个表插入数据
insert into Student values(4,'张三4','广东深圳')
insert into Teacher values(4,'李四4','广东佛山')
-- 日志备份
backup log  [FileGroupTest] to BackupTestDevice

-- 文件组FG_Test_Id_02备份
backup database [FileGroupTest] file='FG_TestUnique_Id_02_data' to BackupTestDevice

-- 给主文件组表插入数据
insert into School values(1,'深圳大学','广东深圳南山')
-- 主文件组备份
backup database [FileGroupTest] file='FileGroupTest' to BackupTestDevice

  查看备份集如下图所示:type=F 代表文件组备份类型

图片 37

  图片 38

--更新第三条数据,结果报错
update PageTest set  id=2  where ID is null

  图片 39

-- 插入第4条是成功的
insert into PageTest
select 4, REPLICATE('d',8000)

  图片 40

六. 苏醒演示

--步骤1:假设文件FG_TestUnique_Id_01_data已损坏,数据库处于在线状态来还原该文件
restore database [FileGroupTest] file='FG_TestUnique_Id_01_data' 
from BackupTestDevice with file=33, norecovery 

  图片 41

--此时FileGroupTest库还能用,但FG_Test_Id_01文件组上的Student表现不能用,此时处于离线状态
select * from FileGroupTest.dbo.Student

  图片 42

--这两个表在不同文件组上,可以使用
select * from FileGroupTest.dbo.School
select * from FileGroupTest.dbo.Teacher

    图片 43
 BACKUP LOG 与 COPY_ONLY
选项将创建仅复制日志备份,该备份不会截断事务日志。
仅复制日志备份对日志链未有别的影响,因而别的日志备份的变现就疑似仅复制备份不设有雷同。

--步骤2:进行新的日志备份,以确保捕获到该文件离线时的点
backup log  [FileGroupTest] to BackupTestDevice with copy_only

  图片 44

--步骤3: 在线还原日志备份
restore log [FileGroupTest] from BackupTestDevice with file=34,norecovery
restore log [FileGroupTest] from BackupTestDevice with file=35,norecovery
restore log [FileGroupTest] from BackupTestDevice with file=38,recovery

--离线的文件组FG_Test_Id_01处于在线状态,Student表可以使用,数据库恢复完成
select * from FileGroupTest.dbo.Student

  图片 45

五. 获取要修复的数据页面 

-- 使用checkdb检查
DBCC CHECKDB(BackupPageTest)

  通过校验,提醒不能处理面(1:89)如下图

  图片 46

六. 还原

use master
--从完整数据库备份,开始还原,指定要还原的PAGE页
restore database BackupPageTest page='1:89' from BackupTestDevice with file=39,  norecovery
--创建新的尾日志备份
backup log BackupPageTest to BackupTestDevice

 
 那时候拜访数据表PageTest将会发错,如下图所示,申明在还原经过中数据是不可访谈的。

 图片 47

图片 48

--最后还原新的尾日志备份
restore log BackupPageTest from BackupTestDevice with file=40,  recovery

   数据修复过来了,如下图:

  图片 49

  再度CHECKDB 检查表状态

  图片 50

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图