数据库损坏常规处理方法
一、数据库为什么会损坏
在了解数据库损坏之前,首先我们要了解一下
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
原文地址:https://blog.csdn.net/xushugang007/article/details/142677606
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!