笔记37-徐 根据页面错误,找到改页面所属的对象是表 索引 还是其他
1 --根据页面错误,找到改页面所属的对象是表 索引 还是其他
2
3
4 --消息 824,级别 24,状态 2,第 1 行
5 --SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 9:912,但实际为 0:0)。在文件 'I:\data\PIMRpt_DB12_f.ndf' 中、偏移量为 0x00000000720000 的位置对数据库 ID 5 中的页 (9:912) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。
6
7
8 --上面的错误信息表示页面号912有错误 页 (9:912)
9
10 --找出页所属objectid
11 --DBCC PAGE(dbid,fileid,pageid,formatid)
12 --formatid一般为3
13
14
15 EXEC sys.sp_helpdb @dbname = pratice -- sysname
16 USE pratice
17 EXEC sys.sp_helpfile
18
19 --下面这两句要一起运行
20 DBCC TRACEON(3604,-1)
21 DBCC PAGE(13,1,10,3) --指定错误页面号10
22
23 --下面我是分别查看了10号页面和912号页面
24
25
26 --IndexId=0 堆 数据页
27 --IndexId=1 聚集索引 索引页
28 --IndexId>1 非聚集索引 索引页
29
30 --------------------------页面号10--------------------------------------------------------------------
31 --输出结果 页面号为10的
32 --根据显示结果中的IndexId=1表示这个页面存储的是索引
33 --Metadata: IndexId = 1
34 --Metadata: ObjectId = 44
35 --m_pageId = (1:10)
36 --Metadata: PartitionId = 281474979594240
37
38
39 --DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
40
41 --PAGE: (1:10)
42 --
43 --
44 --BUFFER:
45 --
46 --
47 --BUF @0x03EDB51C
48 --
49 --bpage = 0x074C6000 bhash = 0x00000000 bpageno = (1:10)
50 --bdbid = 13 breferences = 0 bUse1 = 35725
51 --bstat = 0x2c00009 blog = 0x32159 bnext = 0x00000000
52 --
53 --PAGE HEADER:
54 --
55 --
56 --Page @0x074C6000
57 --
58 --m_pageId = (1:10) m_headerVersion = 1 m_type = 10
59 --m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x200
60 --m_objId (AllocUnitId.idObj) = 44 m_indexId (AllocUnitId.idInd) = 1 Metadata: AllocUnitId = 281474979594240
61 --Metadata: PartitionId = 281474979594240 Metadata: IndexId = 1
62 --Metadata: ObjectId = 44 m_prevPage = (0:0) m_nextPage = (0:0)
63 --pminlen = 90 m_slotCnt = 2 m_freeCnt = 6
64 --m_freeData = 8182 m_reservedCnt = 0 m_lsn = (12:176:14)
65 --m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
66 --m_tornBits = -1951658170
67 --
68 --Allocation Status
69 --
70 --GAM (1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED
71 --PFS (1:1) = 0x70 IAM_PG MIXED_EXT ALLOCATED 0_PCT_FULL DIFF (1:6) = CHANGED
72 --ML (1:7) = NOT MIN_LOGGED
73 --
74 --IAM: Header @0x5E7FC064 Slot 0, Offset 96
75 --
76 --sequenceNumber = 0 status = 0x0 objectId = 0
77 --indexId = 0 page_count = 0 start_pg = (1:0)
78 --
79 --
80 --IAM: Single Page Allocations @0x5E7FC08E
81 --
82 --Slot 0 = (0:0) Slot 1 = (1:50) Slot 2 = (0:0)
83 --Slot 3 = (0:0) Slot 4 = (0:0) Slot 5 = (0:0)
84 --Slot 6 = (0:0) Slot 7 = (0:0)
85 --
86 --
87 --IAM: Extent Alloc Status Slot 1 @0x5E7FC0C2
88 --
89 --(1:0) - (1:43256) = NOT ALLOCATED
90 --
91 --
92 --DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
93
94 -------------------------------------------------------------------------------------------------------------------
95 -------------------------------------页面号192---------------------------------------------------------------------
96 --因为SQLSERVER输出有4000多行,所以我只摘录了一部分
97
98 --输出结果 页面号为912的
99 --根据显示结果中的IndexId=0表示这个页面是数据页
100 --d = 超级坏 是表里面的数据
101 --Metadata: IndexId = 0
102 --Metadata: ObjectId = 197575742
103 --Metadata: PartitionId = 72057594039500800 --页面所属分区
104 --m_pageId = (1:912)
105
106
107 --DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
108 --
109 --PAGE: (1:912)
110 --
111 --
112 --BUFFER:
113 --
114 --
115 --BUF @0x03F3E79C
116 --
117 --bpage = 0x0A20A000 bhash = 0x00000000 bpageno = (1:912)
118 --bdbid = 13 breferences = 3 bUse1 = 35858
119 --bstat = 0xc00009 blog = 0x21212159 bnext = 0x00000000
120 --
121 --PAGE HEADER:
122 --
123 --
124 --Page @0x0A20A000
125 --
126 --m_pageId = (1:912) m_headerVersion = 1 m_type = 1
127 --m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x200
128 --m_objId (AllocUnitId.idObj) = 89 m_indexId (AllocUnitId.idInd) = 256
129 --Metadata: AllocUnitId = 72057594043760640
130 --Metadata: PartitionId = 72057594039500800 Metadata: IndexId = 0
131 --Metadata: ObjectId = 197575742 m_prevPage = (1:911) m_nextPage = (1:913)
132 --pminlen = 25 m_slotCnt = 155 m_freeCnt = 7
133 --m_freeData = 7875 m_reservedCnt = 7 m_lsn = (2252:12136:46)
134 --m_xactReserved = 7 m_xdesId = (0:2442865) m_ghostRecCnt = 0
135 --m_tornBits = 437279274
136 --
137 --Allocation Status
138 --
139 --GAM (1:2) = ALLOCATED SGAM (1:3) = NOT ALLOCATED PFS (1:1) = 0x44 ALLOCATED 100_PCT_FULL
140 --DIFF (1:6) = CHANGED ML (1:7) = NOT MIN_LOGGED
141 --
142 --Slot 0 Offset 0x60 Length 65
143 --
144 --Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
145 --
146 --Memory Dump @0x5F49C060
147 --
148 --00000000: 30002200 50d65f01 339f0000 64b90100 †0.".P._.3...d...
149 --00000010: 016cb901 00000000 004f57ba 4e00042d †.l.......OW.N..-
150 --00000020: 00000800 40040033 0039003d 00410063 †....@..3.9.=.A.c
151 --00000030: b9010085 8da77e4f 57bbb5c8 cb4f57ba †......~OW....OW.
152 --00000040: 4e†††††††††††††††††††††††††††††††††††N
153 --
154 --Slot 0 Column 0 Offset 0x2f Length 4
155 --
156 --DROPPED = 112995
157 --
158 --Slot 0 Column 1 Offset 0x4 Length 8
159 --
160 --c = 08 2 2011 9:21PM
161 --
162 --Slot 0 Column 2 Offset 0x33 Length 6
163 --
164 --d = 超级坏
165 --
166 --Slot 0 Column 3 Offset 0xc Length 4
167 --
168 --a = 112996
169 --
170 --Slot 0 Column 4 Offset 0x39 Length 4
171 --
172 --DROPPED = 坏人
173 --
174 --Slot 0 Column 5 Offset 0x10 Length 9
175 --
176 --e = 113004
177 --salary = [NULL]
178 --
179 --Slot 0 Column 7 Offset 0x3d Length 4
180 --
181 --b = 坏人
182 --
183 --Slot 1 Offset 0xa1 Length 65
184 --
185 --Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
186 --
187 --Memory Dump @0x5F49C0A1
188 --
189 --00000000: 30002200 50d65f01 339f0000 65b90100 †0.".P._.3...e...
190 --00000010: 016db901 00000000 004f57ba 4e00042d †.m.......OW.N..-
191 --00000020: 00000800 40040033 0039003d 00410064 †....@..3.9.=.A.d
192 --00000030: b9010085 8da77e4f 57bbb5c8 cb4f57ba †......~OW....OW.
193 --00000040: 4e†††††††††††††††††††††††††††††††††††N
194 --
195 --Slot 1 Column 0 Offset 0x2f Length 4
196 --
197 --DROPPED = 112996
198 --
199 --Slot 1 Column 1 Offset 0x4 Length 8
200 --
201 --c = 08 2 2011 9:21PM
202 --
203 --Slot 1 Column 2 Offset 0x33 Length 6
204 --
205 --d = 超级坏
206 --
207 --Slot 1 Column 3 Offset 0xc Length 4
208 --
209 --a = 112997
210 --
211 --Slot 1 Column 4 Offset 0x39 Length 4
212 --
213 --DROPPED = 坏人
214 --
215 --Slot 1 Column 5 Offset 0x10 Length 9
216 --
217 --e = 113005
218 --salary = [NULL]
219 --
220 --Slot 1 Column 7 Offset 0x3d Length 4
221 --
222 --b = 坏人
223 --
224 --Slot 2 Offset 0xe2 Length 9
225 --
226 --Record Type = FORWARDING_STUB Record Attributes =
227 --Memory Dump @0x5F49C0E2
228 --
229 --00000000: 04f12100 0001003f 00†††††††††††††††††..!....?.
230 --Forwarding to = file 1 page 8689 slot 63
231 --
232 --Slot 3 Offset 0xeb Length 65
233 --
234 --Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
235 --
236 --Memory Dump @0x5F49C0EB
237 --
238 --00000000: 30002200 50d65f01 339f0000 67b90100 †0.".P._.3...g...
239 --00000010: 016fb901 00000000 004f57ba 4e00042d †.o.......OW.N..-
240 --00000020: 00000800 40040033 0039003d 00410066 †....@..3.9.=.A.f
241 --00000030: b9010085 8da77e4f 57bbb5c8 cb4f57ba †......~OW....OW.
242 --00000040: 4e†††††††††††††††††††††††††††††††††††N
243 --
244 --Slot 3 Column 0 Offset 0x2f Length 4
245 --
246 --DROPPED = 112998
247 --
248 --Slot 3 Column 1 Offset 0x4 Length 8
249 --
250 --c = 08 2 2011 9:21PM
251 --
252 --Slot 3 Column 2 Offset 0x33 Length 6
253 --
254 --d = 超级坏
255 --
256 --Slot 3 Column 3 Offset 0xc Length 4
257 --
258 --a = 112999
259 --
260 --Slot 3 Column 4 Offset 0x39 Length 4
261 --
262 --DROPPED = 坏人
263 --
264 --Slot 3 Column 5 Offset 0x10 Length 9
265 --
266 --e = 113007
267 --salary = [NULL]
268 --
269 --Slot 3 Column 7 Offset 0x3d Length 4
270 --
271 --b = 坏人
272 --
273 --Slot 4 Offset 0x12c Length 65
274 --
275 --Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
276 --
277 --Memory Dump @0x5F49C12C
278 --
279 --DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
280
281
282 --根据objectid运行下面语句看看页面属于哪个对象
283 SELECT
284 s.name AS N'架构名',
285 o.name AS N'表名'
286 FROM sys.sysobjects o INNER JOIN sys.schemas s ON o.uid=s.schema_id
287 WHERE o.id=44
288
289 --如果页是索引页的话运行下面这句,不是索引页不用运行
290 SELECT
291 id AS objectid,
292 indid AS N'索引id',
293 name AS N'索引名'
294 FROM sys.sysindexes WHERE id=44 AND indid=1
295
296
297 --如果页是索引页的话运行下面这句,不是索引页不用运行 clst是我自己数据库里的索引
298 EXEC sys.sp_helpindex @objname = N'clst' -- nvarchar(776)
299
300
301
302
303 -----------------------------------------------解决方案------------------------------------------------------------
304 --根据页类型是索引页还是数据页
305 --
306 --索引页:可以先Drop索引,然后再创建就修复了,没有任何数据损失.
307 --
308 --
309 --
310 --数据页:数据页根据以下三种解决方案
311 --
312 --
313 --三种解决方案
314 --(1)还原完全备份
315 --如果上一次的FULL BACKUP也存在这种一致性错误而你又没有及时发现,只能找上上一次的BACKUP了.
316 --所以你的维护计划里一定要有DBCC CHECKDB检查.
317 --
318 --
319 --(2)导出数据 前提:你要知道损坏的数据页属于哪个表你才知道要导出哪个表的数据
320 --1、新建文件组和数据文件,不用新建数据库,只需要在原来的数据库下新建文件组和数据文件
321 --2、在新文件组里重建损坏的表,意思是说新建一个表,这个表属于新建的文件组,而且表结构要跟损坏的表一样,例如损坏的表A(id int,name varchar(50)) 那么新建的表B的字段要跟原表A一样
322 CREATE TABLE B(id INT,NAME VARCHAR(50)) ON 新建的文件组
323 --3、将原始表数据导入到新表中 即把表A的数据导入到表B
324 --4、清空原始表
325 --
326 --(3)dbcc checkdb
327 --如果是金融公司的数据库,DBCC CHECKDB('DB Name', REPAIR_ALLOW_DATA_LOSS)就很危险了.