阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

SQL2000下修复某数据库的经历

191次阅读
没有评论

共计 811 个字符,预计需要花费 3 分钟才能阅读完成。

某个 SQL2000 的数据库,在通过备份 / 还原的方法升级到 2005 时发生错误:

查找解决方法未果

正好最近在看 @一线码农 的《sql server 之旅》,就想自己试试解决这个问题

首先运行 dbcc checkdb 命令,结果如下:

仔细查看出错信息,里面反复提到一个“对象 ID 2”。另外,信息里还提到“该文本的所有者是由 RID = (1:152:9) id = 213575799 and indid = 37 标识的数据记录”。联想到最近看的《sql server 之旅》,觉得第二段信息可能是在说某个数据表。于是 select 之:

果然都有对应的表!

分别 select 这两个表,发现问题出在 sysindexes 上:

这和上面的出错信息也是一致的。

立刻尝试用 dbcc checkdb 和 dbcc checktable 修复,但是却得到以下回应:

DBCC 语句的修复级别导致回避了此修复

至此尝试进入了死胡同……

再次查看,发现出错信息里有 2 条比较有意思。一条说某节点未被引用,一条说没发现另外一个节点。两个节点的槽号和文本 ID 都是一样,只有页不同。手贱看了看页号,发现 342=0x156,4194646=0x400156,只差一个字节!

灵机一动,这个错误肯定是页号因为某种原因错了!

突然想起,在 DBCC 命令那篇里面提到 DBCC IND 命令,干脆死马当活马医:

但是看不出什么鬼,很明显我没人家那水平……

干脆 Page 一下:

找到 slot9 的偏移,看看有没有 0x400156:

好像撞大运了……

参考《第六站》,脱机,打开 mdf,找到 Slot9 对应偏移 8192*152+0x860=0x130860,把那个 40 改成 00

 

联机,dbcc checkdb,没有查出错误!

再次尝试在 SQL2005 中恢复,成功!

附加收获:SQL2000 貌似没有 checksum,否则我改 mdf 应该会报错的。

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-09/146986.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计811字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中