指引网

当前位置: 主页 > 数据库 > SQLServer >

【SQLServer备份恢复】提高恢复速度:通过数据库完整备份,来恢复损坏的某个文件

来源:网络 作者:佚名 点击: 时间:2018-03-14 17:55
[摘要] 如果数据库比较大,而只是某个文件损坏了,那么并不需要恢复整个数据库,而只需要通过完整备份,来修复损坏的文件就可以了,另外,应用后续的日志就可以完全恢复这个文件的数据。1、

如果数据库比较大,而只是某个文件损坏了,那么并不需要恢复整个数据库,而只需要通过完整备份,来修复损坏的文件就可以了,另外,应用后续的日志就可以完全恢复这个文件的数据。

1、创建一个包含主文件组、读写文件组的测试数据库

CREATE DATABASE db_test
ON
(
	NAME = db_test_DATA,
	FILENAME = 'c:\db_test.mdf'
),

FILEGROUP FG_READ_WRITE
(
	NAME = db_test_RW,
	FILENAME = 'c:\db_test_RW.ndf'
)

LOG ON
(
	NAME = db_test_LOG,
	FILENAME = 'c:\db_test.ldf'
)
GO
2、创建表,插入数据
use db_test
go

create table xxx(v int) on FG_READ_WRITE

insert into xxx
select OBJECT_ID
from sys.objects
3、完整备份
backup database db_test
to disk  ='c:\db_test.bak'
with format
4、再次插入数据
insert into xxx
select 0

--返回55条数据
select *
from xxx
5、日志备份
backup log db_test
to disk = 'c:\db_test.trn'
6、关闭服务,删除文件 c:\db_test_RW.ndf,重启服务后,发现数据库不能打开.

\

7、尝试恢复数据库,但会报错,提示需要先备份尾日志:

use master
go

RESTORE DATABASE db_test
		FILE = N'db_test_RW'
FROM DISK = 'c:\db_test.bak'
with norecovery
/*
消息 3159,级别 16,状态 1,第 1 行
尚未备份数据库 "db_test" 的日志尾部。如果该日志包含您不希望丢失的工作,
请使用 BACKUP LOG WITH NORECOVERY 备份该日志。
请使用 RESTORE 语句的 WITH REPLACE 或 WITH STOPAT 子句来只覆盖该日志的内容。
消息 3013,级别 16,状态 1,第 1 行
RESTORE DATABASE 正在异常终止。
*/
8、通过no_truncate选项来备份尾日志:
backup log db_test
to disk = 'c:\db_test_trail.trn'
with no_truncate
/*
已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 2 页。
BACKUP LOG 成功处理了 2 页,花费 0.112 秒(0.074 MB/秒)。
*/
9、通过完整备份,还原损坏的文件db_test_RW,从返回的信息来看,确实只是从恢复了指定的文件,而不是整个数据库:
RESTORE DATABASE db_test
		FILE = N'db_test_RW'
FROM DISK = 'c:\db_test.bak'
with norecovery
/*
已为数据库 'db_test',文件 'db_test_RW' (位于文件 1 上)处理了 16 页。
已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 6 页。
RESTORE DATABASE ... FILE=<name> 成功处理了 22 页,花费 0.168 秒(1.014 MB/秒)。
*/
10、还原日志:
restore log db_test
from disk = 'c:\db_test.trn'
with norecovery
/*
已为数据库 'db_test',文件 'db_test_RW' (位于文件 1 上)处理了 0 页。
已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 7 页。
RESTORE LOG 成功处理了 7 页,花费 0.092 秒(0.567 MB/秒)。
*/
11、还原尾日志:
restore log db_test
from disk = 'c:\db_test_trail.trn'
with recovery
/*
已为数据库 'db_test',文件 'db_test_DATA' (位于文件 1 上)处理了 0 页。
已为数据库 'db_test',文件 'db_test_RW' (位于文件 1 上)处理了 0 页。
已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 2 页。
RESTORE LOG 成功处理了 2 页,花费 0.092 秒(0.090 MB/秒)。
*/ 
12、验证是否恢复:
--返回55条数据,数据全部恢复
select *
from xxx
------分隔线----------------------------