找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 6365|回复: 8

数据库手工修复案例分析

[复制链接]
发表于 2009-2-5 02:50:18 | 显示全部楼层 |阅读模式
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语句形成文挡,便于以后有类似问题可以自己解决。
发表于 2009-9-2 10:16:20 | 显示全部楼层
反复修复,学习楼主的不断探索精神
发表于 2009-9-4 17:19:39 | 显示全部楼层
真强悍,佩服啊!
发表于 2010-10-12 20:20:04 | 显示全部楼层
真是佩服佩服呀!
发表于 2010-10-23 10:18:51 | 显示全部楼层
看都看晕了。
发表于 2010-10-24 08:18:08 | 显示全部楼层
真是佩服佩服呀!
发表于 2010-10-25 12:31:24 | 显示全部楼层
有没有关于用友数据库方面的“材料” 看看
发表于 2012-2-4 22:09:46 | 显示全部楼层
好好学习。数据库修复是个难题啊。
回复 点赞 拍砖

使用道具 举报

发表于 2012-6-13 15:35:19 | 显示全部楼层
真强人啊!数据库这块得好好学学啊!
回复 点赞 拍砖

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-4-30 10:28 , Processed in 0.128113 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表