sqlserver2012数据库,日志文件损坏修复

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

背景

        服务器突然断电导致数据库日志文件损坏数据库无法启动。

        本方案也同样适用于不小心删除数据库日志文件的情况。

相关报错

master数据库日志异常导致数据库无法启动

        无法在数据库“master”(数据库 ID 为 1)的分配单元 196608页 (1:59) 上重做事务 ID (0:0) 的日志记录 (531631:304:4)。页: LSN = (531625:888:19)分配单元 = 196608类型 = 1。日志: OpCode = 18上下文 2PrevPageLSN: (531631:56:8)。请从数据库备份还原该数据库或者修复它。

普通数据库日志异常导致数据库无法附加

       传递给数据库 'PerDB' 中的日志扫描操作的日志扫描号 (227783:55280:433) 无效。此错误可能指示数据损坏或者日志文件(.ldf)与数据文件(.mdf)不匹配。如果此错误是在复制期间出现的请重新创建发布。否则如果该问题导致启动期间出错请从备份还原。
无法打开新数据库 'MFXYDB'。CREATE DATABASE 中止。 (Microsoft SQL Server错误: 9003)

解决方案步骤

1、如果有数据库备份直接恢复备份文件是最好的我是刚好数据库无备份才选择此方案

2、操作前记得将对应的数据库文件备份

3、首先我们需要解决“master“数据库的问题不然无法启动数据库

  方案1因为我的数据库配置比较简单所以直接弃用原本的master库文件重装数据库来实现数据库的正常启动最简单无脑的方案

 :方案2如果是重要的生产库可以在另一个相同版本的数据库服务器上修复master文件然后再拷回生产库修复方案如下普通数据库的修复。这个方案理论上可以我自己没试过


4、数据库能够正常启动后开始附加其他的数据库此时数据库有损坏的话会提示附加失败

  方案1查找了各种方案有个看起来还靠谱的文章但是不适用2012的数据库附加数据库失败 日志文件(.ldf)与数据文件(.mdf)不匹配 sql server 错误9003 - 数据库 - 郑州网建d

1.我们使用默认方式建立一个供恢复使用的数据库(如pos)。可以在SQL  Server  Enterprise  Manager里面建立。
2.停掉数据库服务器。
3.将刚才生成的数据库的日志文件pos_log.ldf删除用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件pos_data.mdf。
4.启动数据库服务器。此时会看到数据库pos的状态为“置疑”。这时候不能对此数据库进行任何操作。
5.设置数据库允许直接操作系统表。此操作可以在SQL  Server  Enterprise  Manager里面选择数据库服务器按右键选择“属性”在“服务器设置”页面中
将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。
use  master
go
exec sp_configure  'allow updates',1
go
reconfigure  with  override
go
6.设置pos为紧急修复模式
update sysdatabases set status=-32768 where dbid=DB_ID('pos')
--此时可以在SQL  Server  Enterprise  Manager里面看到该数据库处于“只读置疑脱机紧急模式”可以看到数据库里面的表但是仅仅有系统表
7.下面执行真正的恢复操作重建数据库日志文件
go
dbcc rebuild_log('pos','D:Program FilesMicrosoft SQL ServerMSSQLDatapos_log.ldf')
go
--执行过程中如果遇到下列提示信息
--服务器:  消息  5030级别  16状态  1行  1
--未能排它地锁定数据库以执行该操作。
--DBCC  执行完毕。如果  DBCC  输出了错误信息请与系统管理员联系。
--说明您的其他程序正在使用该数据库如果刚才您在F步骤中使用SQL  Server  Enterprise  Manager打开了pos库的系统表那么退出SQL  Server
Enterprise  Manager就可以了。
--正确执行完成的提示应该类似于
--警告:  数据库  'pos'  的日志已重建。已失去事务的一致性。应运行  DBCC  CHECKDB  以验证物理一致性。将必须重置数据库选项并且可能
需要删除多余的日志文件。
--DBCC  执行完毕。如果  DBCC  输出了错误信息请与系统管理员联系。
--此时打开在SQL  Server  Enterprise  Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
8.验证数据库一致性可省略
go
dbcc checkdb('pos')
--一般执行结果如下
--CHECKDB  发现了  0  个分配错误和  0  个一致性错误在数据库  'pos'  中。
--DBCC  执行完毕。如果  DBCC  输出了错误信息请与系统管理员联系。
9.设置数据库为正常状态
go
exec sp_dboption 'pos','dbo use only','false'
go
--如果没有出错那么恭喜现在就可以正常的使用恢复后的数据库啦。
10.最后一步我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然我们可以在SQL  Server
Enterprise  Manager里面恢复也可以使用如下语句完成
exec sp_configure  'allow updates',0
go
reconfigure  with  override
go

 方案2删除原本的日志文件重新创建适用2012的数据库

假设数据库名称为MyDB

请按顺序执行以下步骤

1、将数据库的文件名MyDB.mdf改名为MyDB_1.mdf删除MyDB_log.ldf

(如果重命名失败关闭SQL SERVER服务)

2、新建数据库MYDB

3、关闭SQL SERVER服务

4、删除新生成的数据库文件 MyDB.mdb、MyDB_log.ldf并将原本的 MyDB_1.mdf改名为MyDB.mdf

5、启动SQL SERVER服务此时MyDB 为挂起状态


7、执行以下代码

--将数据库处于紧急模式
ALTER DATABASE MyDB  SET EMERGENCY

--将数据库更改为单用户模式
ALTER DATABASE MyDB SET SINGLE_USER

--重建数据库日志
DBCC CheckDB (MyDB , REPAIR_ALLOW_DATA_LOSS)

--恢复数据库为多用户模式
ALTER DATABASE MyDB  SET MULTI_USER

如果数据库文件比较大重建日志需要比较长的时间请耐心等待...

执行过程中可能会提示出错信息等...
8、重新刷新数据库数据库恢复正常

参考文章

如何修复处于recovery挂起状态的数据库 - abce - 博客园

Sql Server 2008 数据库附加失败提示9004错误解决办法_AMinfo的博客-CSDN博客_处理数据库ufdata 002 2011 的日志时出错。如果可能,请从备份还原。如果没有可用

总结

时刻记得数据库备份关键的时候可以救命

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6