首页 > 业界动态

时间:2014-02-20 09:59:36

 一、当遇到下列情况时,可能会造成数据库的部分数据丢失:

1.       在对数据库进行写入操作时(如单据记账,成本计算,月末结账),电脑突然掉电或是电脑发生故障,正在写的表数据不全,在电脑重新启动时,不能通过日志修复;
2.       电脑硬盘发生物理损坏时,如磁道或扇区部分损坏时,数据将不能读取;
在以上情况发生后,通常会造成某些数据库表不能完全读取,或单据不能记账;这时需要使用SQL修复命令修复数据,根据数据损坏程度,修复后的数据库可能完全修复,也可能部分修复;
二、修复方法
1.       使用数据库检查命令找出损坏的表;
2.       再用表修复工具将表进行无损修复或有损修复;
三、操作步骤;
   某单位数据库硬盘出现坏道,在销售单记账时出现错误,造成销售单据不能记账;
   首先使用数据库检查命令对数据库进行问题检查;
   注意进行修复前应先将数据库进行备份;
1.       检查数据库
打开SQL查询分析器并选择需要修复的数据库,并打入数据库检查命令:
DBCC CHECKDB
并按F5运行命令
错误内容
显示数据库有错误
检查命令需要执行一段时间,执行完毕后如上图所示:
2.       找出有问题的表:
用红字体显示,需要将表名记下,方便在下一步进行修复
显示还有更多的表检查信息,均无问题,在此省略,只列出了有问题的表及部分无问题的
服务器: 消息 8909,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 ID (1:10578)。页首结构中的 PageId = (0:0)。
服务器: 消息 8909,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 ID (1:10579)。页首结构中的 PageId = (0:0)。
服务器: 消息 8909,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 ID (1:10756)。页首结构中的 PageId = (0:0)。
服务器: 消息 8909,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 ID (1:10757)。页首结构中的 PageId = (0:0)。
服务器: 消息 8909,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 ID (1:17694)。页首结构中的 PageId = (0:0)。
服务器: 消息 8909,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 ID (1:17695)。页首结构中的 PageId = (0:0)。
服务器: 消息 8939,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 (1:23464)。测试(m_headerVersion == HEADER_7_0)失败。值为 0 和 1。
服务器: 消息 8939,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 (1:23464)。测试((m_type >=DATA_PAGE && m_type <= UNDOFILE_HEADER_PAGE) || (m_type == UNKNOWN_PAGE && level == BASIC_HEADER))失败。值为 0 和 101。
服务器: 消息 8939,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 (1:23464)。测试(m_freeData >= PAGEHEADSIZE && m_freeData <= (UINT)PAGESIZE - m_slotCnt * sizeof (Slot))失败。值为 0 和 8192。
服务器: 消息 8909,级别 16,状态 1,行 1
表错误: 对象 ID 0,索引 ID 0,页 ID (1:23465)。页首结构中的 PageId = (0:0)。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 69575286,索引 ID 0: 未能处理页 (1:10756)。详细信息请参阅其它错误。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 69575286,索引 ID 0: 未能处理页 (1:10757)。详细信息请参阅其它错误。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 98099390,索引 ID 4: 未能处理页 (1:10578)。详细信息请参阅其它错误。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 98099390,索引 ID 4: 未能处理页 (1:10579)。详细信息请参阅其它错误。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 357576312,索引 ID 2: 未能处理页 (1:17694)。详细信息请参阅其它错误。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 357576312,索引 ID 2: 未能处理页 (1:17695)。详细信息请参阅其它错误。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 357576312,索引 ID 3: 未能处理页 (1:23464)。详细信息请参阅其它错误。
服务器: 消息 8928,级别 16,状态 1,行 1
对象 ID 357576312,索引 ID 3: 未能处理页 (1:23465)。详细信息请参阅其它错误。
'RM2004' 的 DBCC 结果。
CHECKDB 发现了 0 个分配错误和 10 个一致性错误,这些错误并不与任何单个的对象相关联。
'SPMXB' 的 DBCC 结果。
对象 'SPMXB' 有 0 行,这些行位于 0 页中。
'CW_KCK' 的 DBCC 结果。
对象 'CW_KCK' 有 26100 行,这些行位于 1742 页中。
CHECKDB 发现了 0 个分配错误和 2 个一致性错误(在表 'CW_KCK' 中,该表的对象 ID 为 69575286)。
以上说明,表CW_KCK有问题,需要记下;
't_SubTask_Detail' 的 DBCC 结果。
对象 't_SubTask_Detail' 有 0 行,这些行位于 0 页中。
'SPSX' 的 DBCC 结果。
对象 'SPSX' 有 0 行,这些行位于 0 页中。
'CkBalance' 的 DBCC 结果。
对象 'CkBalance' 有 2031 行,这些行位于 40 页中。
'SPZZY' 的 DBCC 结果。
对象 'SPZZY' 有 124571 行,这些行位于 3037 页中。
CHECKDB 发现了 0 个分配错误和 2 个一致性错误(在表 'SPZZY' 中,该表的对象 ID 为 98099390)。
'CwBalance' 的 DBCC 结果。
对象 'CwBalance' 有 0 行,这些行位于 0 页中。
…………………….
对象 'PHKDB' 有 0 行,这些行位于 0 页中。
'TJDZK' 的 DBCC 结果。
对象 'TJDZK' 有 100 行,这些行位于 1 页中。
'FHDZK' 的 DBCC 结果。
对象 'FHDZK' 有 120188 行,这些行位于 11990 页中。
CHECKDB 发现了 0 个分配错误和 4 个一致性错误(在表 'FHDZK' 中,该表的对象 ID 为 357576312)。
'tmpgroup' 的 DBCC 结果。
对象 'tmpgroup' 有 0 行,这些行位于 0 页中。
…………
'CKSPZZY' 的 DBCC 结果。
对象 'CKSPZZY' 有 0 行,这些行位于 0 页中。
CHECKDB 发现了 0 个分配错误和 18 个一致性错误(在数据库 'RM2004' 中)。
repair_allow_data_loss 是最低的修复级别(对于由 DBCC CHECKDB (RM2004 ) 发现的错误而言)。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
 
3.       对有问题的表进行修复:
有问题的表有:
CW_KCK
SPZZY
FHDZK
CKSPZZY
修复说明
--1、将数据库改为紧急模式,即不允许其他用户操作当前数据库,修复完表后需要将数据库模式恢复成多用户模式;
SP_DBOPTION 'RM2004','SINGLE USER','TRUE'
 
--2、使用修复命令
DBCC CHECKTABLE('CW_KCK',REPAIR_REBUILD)
--表示无损修复
DBCC CHECKTABLE('CW_KCK',REPAIR_FAST)
--表示快速无损修复
DBCC CHECKTABLE('CW_KCK',REPAIR_ALLOW_DATA_LOSS)
--表示有损修复,警告:此操作将会丢失数据请慎用!
 
--3、将数据库还原到多用户模式
SP_DBOPTION 'RM2004','SINGLE USER','FALSE'
 
 
修复数据表时,应先进行无损修复,如果不能成功再进行有损修复;
显示未修复错误
进行无损修复后,根据修复结果表明不能修复数据,需要再进行有损修复,有时不一定是丢失数据,因为修复的是数据页之间的数据链接;
已成功修复错误
上图显示修复成功;
 
再对表检查时,已经没有错误了
表已经无错误
 
依次对有错误的表进行修复;
对表修复完毕后,应再对数据库进行检查
数据库已经无错误
 
别忘了将数据还原成多用户模式
数据库修复已经完成了;