升级到 SQL Server 2012(从 SQL Server 2005 或从 SQL Server 2008 R2)后,某些数据库一直出现奇怪的问题。
备份 ( .bak
) 适用于旧版本。我DBCC CHECKDB
在 SQL Server 2008 R2 上做,一切都很好。我创建了一个.bak
文件,在 SQL Server 2012 上将其恢复并运行DBCC CHECKDB
-> 表中出现 2 个一致性错误。
使用文章“升级到 SQL 2012:您不想错过的十件事DBCC CHECKDB WITH DATA_PURITY;
”一文中的建议,我在升级前后进行了尝试。
这是一个已知/常见问题吗?
错误详情如下:
消息 8970,级别 16,状态 1,服务器 NUX2012\S11,第 1
行行错误:对象 ID 277576027,索引 ID 2,分区 ID 581141175926784,分配单元 ID 581141175926784(行内数据类型),页面 ID (1:258) ,行 ID 1。创建的列“ID”不是 NULL,但在该行中是 NULL。消息 8970,级别 16,状态 1,服务器 NUX2012\S11,第 1
行行错误:对象 ID 277576027,索引 ID 2,分区 ID 581141175926784,分配单元 ID 581141175926784(行内数据类型),页面 ID (1:258) ,行 ID 2。创建的列“ID”不是 NULL,但在该行中是 NULL。
显然我检查了有问题的表,该ID
列没有任何带NULL
值的行。
嗯……这很有趣……
因此,索引在升级之前以某种方式损坏,当您看到上述错误时,您可以在升级之前和之后修复此问题,但只有在升级之后
DBCC
才能检测到问题。脚步:
DBCC CHECKDB
以获取列名。ALTER INDEX [my index name] ON [my table name] DISABLE;
一些外键可能会随之被禁用,不用担心)。ALTER INDEX [my index name] ON [my table name] REBUILD;
。DBCC CHECKDB;
以确保一切正常。这对我有用,但 YMMV。同样,您可以在 MS SQL 2008 R2 中执行上述操作,然后在 MS SQL 2012 上恢复新备份,或者在已经在 MS SQL 2012 上执行上述操作。