一. 概述
文件备份是指备份一个或多个文件或文件组中的所有数据。使用文件备份能够只还原损坏的文件,而不用还原数据库的其余部份,从而加快恢复速度。例如,如果数据库由位于不同磁盘上的若干文件组成,在其中一个磁盘发生故障时,只需还原这个故障磁盘上的文件,其它磁盘文件无须还原,这样缩短还原时间。
在完整恢复模式下,一整套完整文件备份和涵盖所有文件备份的日志备份合起来,等同于一个完整数据库备份。
1.1 文件备份具有如下优点:
(1)可以迅速还原损坏的文件。
(2)当超大型数据库在完整备份下变得难以管理时,文件备份增加了计划和媒体处理的灵活性。
1.2 文件备份具有不足:
(1) 与完整数据库备份相比,文件备份的主要缺点是管理较为复杂。如果某个损坏的文件未备份,那么媒体故障可能会导致无法恢复整个数据库。因此必须维护一组完整的文件备份,还必须维护一个或多个日志备份。
(2) 维护和跟踪这些完整备份是一种耗时的任务,所需空间会超过完整数据库备份所需的空间。
二. 文件备份策略
使用文件备份和日志备份还原数据库的操作可能比较复杂,因此最好先执行完整数据库备份,并在第一个文件备份开始之前,进行日志备份。下图在t0创建数据库后,立即执行完整数据库备份t1,创建第一个完整数据库备份后,便可以开始执行事务日志备份。事务日志备份按计划的间隔时间执行,文件备份以最适合数据库业务要求的间隔执行,下面是先备份主文件组A,再是辅助文件组B。在完整恢复模式下,恢复一个文件组备份,不但需要恢复文件组备份本身,还需要依次恢复从上一次完整数据库备份后到恢复的目标时间点为止的所有日志备份。如果日志备份数量多,可以考虑再给合差异文件备份,但这样备份计划更加难于管理。
三.文件还原
当一个大数据库有若干个文件和文件组,如果损坏只是集中在其中一个文件或文件组上,sqlserver只要把坏掉的那个数据文件组重建,肯定可以节约时间。但是数据库的事务修改是会分布在各个数据文件上的,如果用备份只恢复其中一个文件,而其它文件不恢复,那么它们的状态一定会不一致,这样数据库是无法使用的,为了使新恢复的文件能够自动恢复备份以后做的修改,就需要借助事务日志。使用文件备份还原一个或多个受损文件的步骤如下:
(1) 创建活动事务日志的尾日志备份。 对于离线文件还原,在文件还原之前必须始终先进行一次尾日志备份。对于在线文件还原,在文件还原之后必须始终先进行一次日志备份。因为日志文件一日损坏,文件还原则无法进行。
(2) 从每个损坏的文件的最新文件备份还原相应文件。
(3) 针对每个还原的文件,还原最近的差异文件备份(如果有,因为这样还原快)
(4) 按顺序还原事务日志备份,从时间上最早备份的日志文件开始,到步骤1的尾日志结束。
四 . 数据初始化
--第一步: 创建数据库 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]
-- 养成好习惯先进行完整备份 backup database [FileGroupTest] to BackupTestDevice
五. 备份演示
-- 给二个表插入数据 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 代表文件组备份类型
六. 还原演示
--步骤1:假设文件FG_TestUnique_Id_01_data已损坏,数据库处于在线状态来还原该文件 restore database [FileGroupTest] file='FG_TestUnique_Id_01_data' from BackupTestDevice with file=33, norecovery
--此时FileGroupTest库还能用,但FG_Test_Id_01文件组上的Student表现不能用,此时处于离线状态 select * from FileGroupTest.dbo.Student
--这两个表在不同文件组上,可以使用 select * from FileGroupTest.dbo.School select * from FileGroupTest.dbo.Teacher
BACKUP LOG 与 COPY_ONLY 选项将创建仅复制日志备份,该备份不会截断事务日志。 仅复制日志备份对日志链没有任何影响,因此其他日志备份的表现就像仅复制备份不存在一样。
--步骤2:进行新的日志备份,以确保捕获到该文件离线时的点 backup log [FileGroupTest] to BackupTestDevice with copy_only
--步骤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