科脉等超市系统数据库损坏常规修复方法数据库损坏常规处理方法-sql server数据库修复-删除表中重复的数据
广告:
一、数据库为什么会损坏
在了解数据库损坏之前,首先我们要了解一下SQL Server是如何将数据保存到数据文件(MDF、NDF等),无论数据更新还是插入,数据都需要首先在内存中Buffer Pool驻留,然后通过CheckPoint和Lazy writer等过程将内存中的数据再持久化到磁盘,所以在这个过程中,会受到很多方面的影响,比如:电压不稳定、突然断电、温度过高或过低、潮湿程度、非法关机、硬盘坏道等都有可能会造成数据库损坏。
通过上述,我们不难看出数据库损坏是会受到很多方面影响,无法完全避免数据库损坏,因此为了把数据库损失降到最低,建议勤做数据备份。如果遇到数据库损坏,我们应当如何处理?
二、数据库损坏常规修复方法
温馨提示:修复数据库前,请做好数据备份,因为在修复数据库过程中可能会造成数据丢失或者修复不了,如经过常规修复后还有问题,
数据库损坏常规修复方法可分别为:一致性错误修复和数据库置疑修复,以下修复数据库名称都假设以kmjxc为准,(如库名不是kmjxc请更改对应的库名)
2.1、SQL2000数据库置疑修复必要条件
1.原库的MDF数据文件必须是完好的
2.1.1、修复步骤1:前期准备
停止SQL数据库服务,将置疑数据库的MDF文件和LDF文件复制备份一份(复制到其他路径);
启动SQL数据库服务,进入SQL企业管理器,在左侧数据库里面找到置疑的库,右键删除。
2.1.2、修复步骤2:仓库科脉空库
使用御商安装包DB_setup 文件夹中的db_setup.exe程序,创建一个空库,空库的名称与原库一致;
将上一步中备份的置疑数据库的MDF文件复制过来覆盖现创建的空库。
2.1.3、修复步骤3:把数据库设置为紧急模式
打开SQL查询分析器,选到master数据库,输入以下语句执行(一条一条执行)
sp_configure 'allow',1
reconfigure with override
update sysdatabases set status=32768 where name = 'kmjxc'
2.1.4、修复步骤4:重建数据库日志文件
D:\MSSQL$PROD\Data\ 为存放数据库文件的路径
KMJXC_log2.ldf 为一个新的不存在的文件,在执行以下语句时将自动建立
dbcc rebuild_log('kmjxc','D:\MSSQL$PROD\Data\KMJXC_log2.ldf')
2.1.5、修复步骤5:取消数据库紧急模式
打开SQL查询分析器,选到master数据库,输入以下语句执行(一条一条执行)
update sysdatabases set status=0 where name = 'kmjxc'
restore database kmjxc with recovery
sp_configure 'allow',0
reconfigure with override
2.1.6、修复步骤6:重启SQL服务
以上操作完成后,打开服务管理器(要在开始菜单中找到或右下角的状态栏中找到),将SQL Server服务停止,再启动。到此,置疑修复完成,可到企业管理器中查看数据库是否正常。
2.2、SQL2005\2008数据库置疑修复
2.2.1、修复步骤1:设置数据库为紧急模式
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
alter database 置疑数据库名 set emergency
go
2.2.2、 修复步骤2:设置单用户模式
alter database置疑数据库名set single_user
2.2.3、 修复步骤3:建数据库日志文件
dbcc checkdb('置疑数据库名',REPAIR_ALLOW_DATA_LOSS)
2.2.4、修复步骤4:取消单用户模式
alter database置疑数据库名set multi_user
2.2.5、修复步骤5:取消数据库紧急模式
alter database 置疑数据库名set online
三、 数据库一致性错误修复
修复数据库名称都假设以kmjxc为准,(如库名不是kmjxc请更改对应的库名)
修复步骤1:检测数据库
打开SQL查询分析器,选择需要检测的数据库,执行dbcc checkdb语句可以检测数据库是否有分配性和一致性错误
修复步骤2:设置数据库为单用户
如在检测出有分配性和一致性错误,证明数据库已损坏,需要将数据库设置为单用户才能进行数据库的修复,使用以下语句设置数据库为单用户
EXEC sp_dboption ' kmjxc ', 'single user', 'TRUE'
修复步骤3:修复数据库、数据库索引
使用以下语句进行数据库修复,先执行修复数据库,再执行修复数据库索引,这两个可交替重复执行。
dbcc checkdb ('kmjxc',repair_allow_data_loss) -- 修复数据库
dbcc checkdb ('kmjxc',REPAIR_REBUILD) -- 修复数据库索引
修复步骤4:查询错误ID的表名
在修复数据库的过程中,如果有出现个别错误是某个表损坏,会有提示表ID,可使用以下语句查询这个ID是哪张表,再针对这张表进行修复。
SELECT * FROM sysobjects where id = ‘此处填入表ID’ --查询错误ID的表名
修复步骤5:修复表、表索引
使用以下语句进行数据库修复,先执行修复表,再执行修复表索引,这两个可交替重复执行。
dbcc checktable ('此处填入表名',repair_allow_data_loss) -- 修复表
dbcc checktable ('此处填入表名',REPAIR_REBUILD) -- 修复表索引
修复步骤6:设置数据库为多用户
修复完成后,需要将数据库设置成多用户模式
EXEC sp_dboption 'kmjxc', 'single user', 'false'
修复步骤7:发生键次错误,索引重复的处理方法
以pos_t_saleflow_pre表为例在SQL查询分析器的左侧,找到pos_t_saleflow_pre表,展开,在约束中找到以PK开头的主键约束,右键 – 在新窗口中编写对象脚本为 – 创建,将创建出来的脚本保存作个备份,记住脚本中是以哪个字段为主键(以下语句中会使用到,因语句中以主键分组来查询是否有重复),然后再右键删除此主键约束,再使用以下语句查询是否有重复值,如果有,则删除。删除重复值后,再用备份的脚本重新创建主键。
--查询是否存在重复的数据
dbcc checktable('pos_t_saleflow_pre')
select flow_no, flow_id
from pos_t_saleflow_pre
group by flow_no, flow_id
having count(1) > 1
--删除表中重复的数据
while exists(select flow_no, flow_id
from pos_t_payflow_pre
group by flow_no, flow_id
having count(1) > 1)
begin
set rowcount 1
delete a
from pos_t_payflow_pre a
inner join (select flow_no, flow_id
from pos_t_payflow_pre
group by flow_no, flow_id
having count(1) > 1) b on a.flow_no = b.flow_no and a.flow_id = b.flow_id
set rowcount 0
end
四、小结
此文档阐述了数据库损坏的概念、及数据库常规的修复操作步骤。如按数据库常规修复步骤无法修复,请联系第三方专业修复公司。
数据库问题修复联系电话:13631399978(微信同号)
广告: