|
U8知识库
问题号: |
3112 |
解决状态: |
临时解决方案 |
软件版本: |
数据库 |
软件模块: |
MSSQL2000 |
行业: |
通用 |
关键字: |
数据库手工修复案例分析 |
适用产品: |
sql数据库 |
问题名称: |
数据库手工修复案例分析 |
问题现象: |
问题描述:1、不能以2004年1月1日去整理现存量
2、不能对2004年7月1日的采购入库单进行列表
3、收发存汇总表不能查询
4、不能连续修改采购入库单据,修改第一张可以,继续修改第二张提示网络连接失败,然后退出。
问题产生原因:估计是近段时间不间断停电导致数据库损坏。
建议:将处理过程或SQL语句形成文挡,便于以后有类似问题可以自己解决。 |
问题原因: |
由于非法操作(断电等)导致数据表结构损坏,部分数据表的主外键、索引异常错误,导致产品部分功能出错。 |
解决方案: |
(调整过程中涉及到数据记录删除操作时请先与用户协商处理)
问题答复:
修复工作如下:
1、首先使用数据库修复脚本对数据库反复修复检查(修复了4遍),直至再修复时错误提示不变,即只剩下无法修复的错误为止,对该数据最后剩下13个一致性错误无法修复,提示信息“CHECKDB 发现了 0 个分配错误和 13 个一致性错误(在数据库 ‘UFDATA_002_2004‘ 中)”。
使用脚本:数据检查.sql
2、根据提示信息中的具体错误信息,如“服务器: 消息 2601,级别 14,状态 3,行 1。不能在具有唯一索引 ‘RRKey‘ 的对象 ‘RdRecord‘ 中插入重复键的行。数据行(1:65607:15)(由 RID = (1:65607:15) 标识)的索引值为 cWhCode = ‘422‘ and bRdFlag = 1 and cCode = ‘0000005913‘。”,从查询分析器中查看现象:
select * from rdrecord where ccode=‘0000005913‘(有记录)
select * from rdrecord where id=‘308090‘(无记录)
下面尝试修正错误。
3、修复数据表Rdrecord(子表rdrecords无错误):
a、重命名rdrecord为rdrecord2;
b、将原收发记录主表rdrecord2中记录复制到新表rdrecord中
select * into rdrecord from rdrecord2,删除Rdrecord2;
c、尝试创建表间关系及rdrecord的索引、主键等时,创建索引RRKey失败,查询
cwhcode+ccode+brdflag上存在的重复值(非法记录),根据提示‘发生在重要主键401上’,查询仓库401,
select count(ccode),ccode from rdrecord where cwhcode=‘401‘ group by ccode,brdflag having count(ccode)>1,查询结果显示ccode=0000000264,0000000265的记录重复。
select * from rdrecord where cwhcode=‘401‘ and ccode in (‘0000000264‘,‘0000000265‘) and brdflag=0,对每个单据号存在2条记录,删除7月1号的单据(实际中应征询用户意见进行妥当处理)
delete from rdrecords where id in (‘308307‘,‘308309‘)
delete from rdrecord where id in (‘308307‘,‘308309‘)
再次创建索引RRkey时发现在仓库408、410、422、423等等上均存在非法重复值,观察数据记录,发现错误记录均在2004-07-01号。
通过以下sql语句查询所有非法记录:
select id,ccode,cwhcode,brdflag from rdrecord where ccode in (
select ccode from rdrecord group by ccode,brdflag,cwhcode having count(ccode)>1) and ddate=‘2004-07-01‘ order by ccode,cwhcode,
通过以下sql语句删除7月1号的非法记录信息:
delete from rdrecords where id in (select id from rdrecord where ccode in (
select ccode from rdrecord group by ccode,brdflag,cwhcode having count(ccode)>1) and ddate=‘2004-07-01‘)
delete from rdrecord where ccode in (
select ccode from rdrecord group by ccode,brdflag,cwhcode having count(ccode)>1) and ddate=‘2004-07-01‘
4、根据提示信息中的具体错误信息,如“违反了 PRIMARY KEY 约束 ‘aaaaaTransVouch_PK‘。不能在对象 ‘TransVouch‘ 中插入重复键。
服务器: 消息 8951,级别 16,状态 1,行 1
表错误: 表 ‘TransVouch‘(ID 785437872)。索引 ‘aaaaaTransVouch_PK‘(ID 2)中下列行的键缺少或无效:”,数据表TransVouch损坏,尝试修复该数据表。
5、同上步骤3,修复数据表TransVouch:
a、重命名TransVouch为TransVouch2;
b、将原收发记录主表rdrecord2中记录复制到新表rdrecord中
select * into transVouch from Transvouch2,,删除transVouch2;
c、试图创建关系索引时提示“服务器: 消息 1505,级别 16,状态 1,行 1
CREATE UNIQUE INDEX 终止,因为发现了索引 ID 2 的重复键。最重要的主键为 ‘0000000949‘。”,查询select * from transvouch where ctvcode=‘0000000949‘,发现有重复记录,故索引创建失败。删除7月1号的重复记录:
(查询)select * from transvouch where ctvcode=‘0000000949‘
select * from transvouchs where ctvcode=‘0000000949‘
由于子表transvouch与主表transvouch通过ctvcode关联,现主表和子表中各存在2条记录,因无法定位子表中哪条记录属于7月1号单据的表体,暂只删除主表中重复记录(由日期关系判断子表transvouchs中autoid较小的记录应为7月1号的表体内容,建议征询用户意见后再决定删除哪条记录,也可后期在界面上删除表体行记录):
(删除)delete from transvouch where ctvcode=‘0000000949‘ and dtvdate=‘2004-07-01‘
6、执行创建关系、索引、主外键脚本,脚步执行成功。
rdrecordCreate.sql;
TransVouchCreate.sql;(此两个脚本可通过企业管理器来创建)
7、再次用数据库修复检查脚本进行复查,检查结果显示数据库结构/数据正确无误。
CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 ‘UFDATA_002_2004‘ 中)。
数据检查.sql
8、查看采购入库单列表时显示记录异常(只有表头信息),故怀疑rdrecord中存在部分非法记录,其在子表rdrecords中无对应记录。
(查询:)select id from rdrecord where id not in (select distinct id from rdrecords)
(删除:)delete from rdrecord where id not in (select distinct id from rdrecords)
数据修复工作完成!
进入产品查看问题:
1、修复数据库后整理现存量成功;
2、采购入库单列表查询正常;
3、收发存汇总表可查询;
4、可连续修改采购入库单。
注意:
1、建议用户定期备份数据;
2、不可非法关机、随意插拔USB设备等。 |
补丁编号: |
|
录入日期: |
2005-6-28 |
最后更新时间: |
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册账号
×
问题描述:1、不能以2004年1月1日去整理现存量
2、不能对2004年7月1日的采购入库单进行列表
3、收发存汇总表不能查询
4、不能连续修改采购入库单据,修改第一张可以,继续修改第二张提示网络连接失败,然后退出。
问题产生原因:估计是近段时间不间断停电导致数据库损坏。
建议:将处理过程或SQL语句形成文挡,便于以后有类似问题可以自己解决。 |
|