当前位置: 首页 > article >正文

数据库损坏常规处理方法

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

http://www.kler.cn/news/337479.html

相关文章:

  • 深入浅出(五)nlohmann/json库
  • 看门狗电路设计
  • Cherno游戏引擎笔记(73~90)
  • 高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
  • 使用 Promise
  • Ansys Speos | 智能手环心率传感器仿真
  • Android input系统原理二
  • 什么是方差
  • 神经网络激活函数之前的加权求和 | 矩阵相乘运算法则(清晰版)
  • LeetCode讲解篇之70. 爬楼梯
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-2
  • 【Canvas与标牌】盾形银底红带Best Quality Premium标牌
  • Ubuntu24.04远程开机
  • C++基础(12)——初识list
  • 【数据结构】【栈】算法汇总
  • 基于SpringBoot+Vue+MySQL的民宿预订平台
  • MySQL 实验 10:数据查询(3)—— 聚合函数与分组查询
  • S7---基本介绍
  • SpringBoot框架下的教育系统开发全解析
  • Android OpenGLES2.0开发(四):矩阵变换和相机投影