数据库损坏常规处理方法

一、数据库为什么会损坏
在了解数据库损坏之前,首先我们要了解一下 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值