笔记40-徐 页面还原步骤
1 --页面还原步骤
2 --文件还原、页面还原、段落还原都需要日志备份
3 --如果为了少数几个页面而恢复整个数据库,代价可谓高昂
4 --SQL2005引入了页面还原,可以只还原指定若干页面,从而大大节省数据库
5 --恢复时间,可以说是个能够救急的功能
6
7 --页面还原用于修复隔离的损坏页。还原和恢复少量页面的速度可能比还原一个文件
8 --更快,减少还原操作中处于离线状态的数据量。
9 --但是如果文件中要还原的不只是少量页面而是多数页面,则还原整个文件更有效!!!!!!!!!!!!!!!!!!!!!!!!!!
10
11
12 --例如,如果某个文件上的大量页面都指出此文件有未解决的故障,不妨考虑直接还原该文件
13 --通常,要进行还原的页面已经由于在访问该页面时遇到错误而标记为“可疑”。可疑页在
14 --msdb数据库的suspect_pages表中进行了标识。可以立即还原多个数据库页面。
15 --跟文件还原一样,在页面还原之后,也要恢复所有的日志文件备份。每次传递日志重做,
16 --前滚集都会前进一步
17
18 --需要注意的是,页面还原仅仅可以还原数据页。页面还原不能还原下列内容:
19 --事务日志
20 --分配页:全局分配映射页GAM,共享全局分配映射SGAM页和页可用空间PFS页
21 --所有数据文件的页0(文件启动页)
22 --页1:9(数据库启动页)
23 --全文目录(fulltext search catalog)
24
25 --页面还原还要符号下面要求:
26 --(1)数据库必须使用完整恢复模式。使用大容量日志恢复模式可能不能成功。简单恢复模式不能使用
27 --这一功能
28
29
30 --(2)只读文件组中的页面无法还原
31
32
33 --(3)还原顺序必须从完整备份、文件备份或文件组备份中恢复页面开始。所以如果没有一份
34 --数据页面损坏之前做的备份,也无法进行还原
35
36 --(4)页面还原需要截至到当前日志文件的连续日志备份,并且必须恢复所有这些日志备份后,页面
37 --才能恢复到当前正常状态。所以如果数据库曾经做过截断日志动作,或者有份日志备份现在找不到了
38 --也无法进行页面恢复
39
40 --(5)数据库备份和页面还原不能同时运行
41
42
43 --页面还原基本语法:
44 --若要在restore database 语句中指定一页,需要知道该页所在文件的文件ID和该页的页ID
45 --语法:
46 --RESTORE DATABASE GPOSDB
47 --PAGE='file:page[,...]'[,...n]
48 --FROM <backup_device>[,...n]
49 --WITH norecovery
50
51
52
53 --页面还原的步骤:
54 --(1)获取要还原的损坏页的页面ID。校验和或残缺写错误将返回页ID,并提供指定页所需的信息
55 --可以通过查询msdb数据库里的suspect_pages表,或者监视事件和SQL errorlog文件里所报出的
56 --错误信息,查找损坏页的页ID
57
58
59 EXEC sys.sp_readerrorlog
60 --查看损坏的页面,从而进行页面还原
61 USE msdb
62 SELECT * FROM dbo.suspect_pages
63
64
65
66
67 --(2)从包含损坏页的完整数据库备份、文件备份或者文件组备份开始进行页面还原。在
68 --RESTORE DATABASE语句中,使用Page子句列出所有要还原的页的页ID
69 --PAGE='file:page'
70
71 --(3)应用最近的差异备份
72
73 --(4)应用后续日志备份
74
75 --(5)创建新的数据库尾日志备份
76
77 --(6)还原新的尾日志备份。应用这个新的日志备份后,就完成了页面还原,可以开始
78 --正常访问页面了
79
80 --示例:使用norecovery还原数据文件A的4个损坏页。随后,将使用norecovery应用两个日志
81 --备份,然后是尾日志备份(使用recovery还原)
82
83
84 --数据文件A的文件ID为1,假设损坏页的页ID分别为67,233,879,1026
85 --(1)查看损坏页
86 EXEC sys.sp_readerrorlog
87 --查看损坏的页面,从而进行页面还原
88 USE msdb
89 SELECT * FROM dbo.suspect_pages
90
91
92
93 --(2)查出损坏页的页ID之后,使用restore database恢复
94 --如果有多个数据文件的话,因为不知道损坏页面所属的数据文件,
95 --这里只给出最简单的情况,数据库只有一个主数据文件mdf
96 --那么fileid就是1
97 RESTORE DATABASE GPOSDB PAGE='1:67, 1:233 ,1:879 ,1:1016'
98 FROM <file_backup_of_file_A>
99 WITH norecovery;
100
101 RESTORE LOG GPOSDB FROM <log_backup>
102 WITH norecovery;
103
104 RESTORE LOG GPOSDB FROM <log_backup>
105 WITH norecovery;
106
107 BACKUP LOG GPOSDB TO <new_log_bakcup>
108 RESTORE LOG GPOSDB FROM <new_log_backup> WITH recovery;
109 GO