数据库损坏常规处理方法

时间:2024-10-08 12:50:14
交替重复执行。
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