随笔 - 4  文章 - 0 评论 - 13 阅读 - 6476
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

某个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应该会报错的。

posted on   firstrose  阅读(3419)  评论(5编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示