修改日期 | 修改人 | 备注 |
2019-04-01 14:17:41[当前版本] | 梁 | 补充 |
2019-03-14 11:01:35 | 柯 | 1 |
2018-12-29 16:34:34 | 梁 | 补充 |
2018-12-29 15:56:56 | 梁 | 补充 |
数据库坏了怎么办?数据库置疑了怎么办?数据库修复简要办法
------------下文的语句中的MenuItem是举例的,具体表名,需要大家根据情况,自行替换------------
------------如果数据库是置疑的,从第一步开始------------
------------如果数据库不是置疑的,从11开始------------
------------开始修复数据库之前,一定要先备份一下数据库,以防万一------------
------------进行数据库修复之前,必须要停止易石的所有服务,退出易石的所有客户端程序------------
01、分离数据库
企业管理器=》找到置疑的数据库=》右键=》所有任务=》分离数据库
02、将坏的数据库文件备份到单独文件夹
03、解压一个空白数据库出来(注意SQL版本)
服务端安装目录下\Server\Data下有两个压缩文件,如下图:
其中yumstonedata.zip是2000/2005/2008数据库的空白数据库文件,yumstonedata2012.zip是SQL2012的。按需解压。
04、附加空白数据库
解压出空白数据库文件以后=》企业管理器=》数据库=》右键=》所有任务=》附加数据库=》找到解压出来的yumstone_data.MDF=》确定
05、停止SQL服务
开始=》运行=》Services.msc=》找到SQL服务=》右键=》停止
06、删除之前解压出来的空白数据库文件,MDF和LDF都删除。
07、拷贝原先备份的坏数据库的mdf文件,粘贴到data目录。
08、启动SQL服务
开始=》运行=》Services.msc=》找到SQL服务=》右键=》停止
09、打开查询分析器,依次执行下列语句,每行都需要执行一次,记得修改第三步Log文件的路径。
--第一、
exec sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE /* 打开修改系统表的开关 */
--第二、
update sysdatabases set status=32768 where name='yumstone' /* 设置数据库状态 */
--第三、
DBCC REBUILD_LOG ('yumstone','c:\Program Files\Yumstone\4.0\Server\Data\yumstone_Log.LDF') /* 重建LDF文件 */
--第四、
update sysdatabases set status=0 where name='yumstone' /* 重置数据库状态 */
--第五、
restore database yumstone WITH RECOVERY /* 恢复数据库 */
--第六、
exec sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE /* 关闭打开修改系统表的开关 */
10、上述语句执行完以后,几乎就可以解除置疑。
11、SQL企业管理器=》找到有问题的数据库Yumstone=》右键=属性=》选项=》设置为单用户=》确定
12、关闭SQL企业管理器=》打开SQL查询分析器=》选择master数据库=》执行DBCC检查
dbcc checkdb('yumstone')
13、找出全部有问题的表,比如下述描述中的MemberItem表就是有问题的,其他的错误信息可以忽略。
CHECKDB 发现了 0 个分配错误和 4 个一致性错误(在表 'MemberItem' 中,该表的对象 ID 为 155147598)。
14、对上一步找出来的有问题的表,执行语句dbcc dbReindex('MenuItem'),尝试进行索引修复。
执行索引修复语句,如果SQL反馈如下信息,表示修复成功。否则不成功。
15、对于重建索引修复不了的表,执行语句dbcc checktable('MenuItem'),尝试进行表修复。
CheckTable语句修复的时候,有三个参数;先执行无参数语句,然后根据执行结果最后面的提示,增加参数。
Repair_fast:快速修复,数据无损
Repair_rebuild:重建表的结构和索引,也不会丢失数据。
Repair_Allow_data_loss:允许数据丢失的方式,进行数据库表修复。(出现这种提示,就肯定要丢掉部分数据了)
增加参数以后,语句会变成右侧的样式: dbcc checktable('MenuItem',Repair_Allow_data_loss)
checkTable语句可能需要执行多次,直到不再出现报错为止。
16、对于checktable修复不了的表,需要用bcp指令导出数据;bcp导出的时候,会自动过滤掉坏的数据,然后清除完表内容以后,再导入即可。(-U后面跟的是SQL的管理员账号sa,-P后面跟的是SQL管理员的密码)
操作方式如下:
A、关闭查询分析器
B、开始=》运行=》CMD
C、执行bcp指令,例如:bcp yumstone.dbo.MenuItem out c:\MenuItem.txt -c -Usa -P此处填写SQL的sa账号的密码
D、打开查询分析器,执行语句:Truncate table MenuItem
E、关闭查询分析器,并打开CMD程序
F、执行bcp指令,例如:bcp yumstone.dbo.MenuItem in c:\MenuItem.txt -c -Usa -P此处填写SQL的sa账号的密码
17、在对Yumstone数据库,做dbcc检查,确保没问题,如果有问题,重复上述步骤。
18、最后执行语句 exec yum_reindex对Yumstone数据库的所有表重建索引。
19、查询分析器执行下述语句,以修复计数器(防止计数器异常)。
declare @ReindexTable varchar(256),@ExecSQL varchar(2000),@RowNum numeric(18,0)
select @RowNum=count(*) from sysobjects where xtype='U'
DECLARE Bill_Cursor CURSOR FOR select name FROM sysobjects where xtype='U' order by name
OPEN Bill_Cursor
WHILE @RowNum > 0 begin FETCH NEXT FROM Bill_Cursor into @ReindexTable
set @ExecSQL='DBCC CHECKIDENT('''+@ReindexTable+''',RESEED)'
Execute(@ExecSQL)
set @RowNum=@RowNum-1
end
CLOSE Bill_Cursor
DEALLOCATE Bill_Cursor
20、关闭查询分析器,打开企业管理器,改成多用户模式。
21、启动软件服务=》运行易石程序=》验证问题是否解决。