My Life My Dream!

守信 求实 好学 力行
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

【问题记录】SQL Server 2014数据库日志故障处理

Posted on 2021-08-10 16:44  召冠  阅读(691)  评论(0编辑  收藏  举报

SQL Server 2014 一个项目数据库做大数据量delete 长时间未完成,执行kill无响应后,运维人员对SQL Server进行了强制重启。重启后有时该数据库处于无法访问状态,再重启(关闭Server服务,等待3分钟后启动)有时可以访问数据库,但该库中与最初delete有关的几个数据表无法访问。执行任何DML、DDL操作,均处于被阻塞无响应的状态,阻塞源为SQL Server系统会话(状态为DB Startup)。该数据库状态为online,log_reuse_wait_desc状态为:CHECKPOINT 或 Active_Transaction

 

最后通过停机后,删除物理日志文件,重建一个空的同名日志文件,附加后,rebuild log 解决。

建议后续使用SQL Server 2016及以上版本,2014貌似有不少问题,或至少更新至SP3以上补丁。

 

数据库SQL Server 2000如何修复置疑的数据库(日志损坏)

use master

sp_configure 'allow updates',1

reconfigure with override

 

exec sp_dboption @databasename, N'single', N'true'

 

update sysdatabases set status=-32768 where dbid=db_id('换成自己数据库名');

dbcc rebuild_log('换成自己数据库名', 'C:\Program Files\Microsoft SQL Server 2000\Data\数据库日志文件名.LDF')

dbcc checkdb('换成自己数据库名')

dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)

dbcc checkdb(@databasename,REPAIR_REBUILD)

 

exec sp_dboption @databasename, N'single', N'false'

 

 

sql server 2005 日志损坏

use master 
declare @databasename varchar(255) 
set @databasename='要恢复的数据库名称' 
exec sp_dboption @databasename, N'single', N'true' --将目标数据库置为单用户状态 
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS) 
dbcc checkdb(@databasename,REPAIR_REBUILD) 
exec sp_dboption @databasename, N'single', N'false'--将目标数据库置为多用户状态 

SQL Server 2008 R2 - Rebuild Log

use master
ALTER DATABASE [dbname] SET EMERGENCY
ALTER DATABASE my_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE my_db REBUILD LOG ON (NAME=my_db,FILENAME='C:\MSSQL\Data\my_db_log.ldf')
DBCC CHECKDB ([dbname])
ALTER DATABASE my_db SET MULTI_USER WITH ROLLBACK IMMEDIATE;

 

 

SQL Server如何附加只有mdf的数据库文件

有时候SQL Server意外断电会导致SQL Server的ldf日志文件丢失或者损坏,这个时候你如果直接附加mdf文件到SQL Server会失败,这里提供一个方法可以还原只有mdf的数据库文件,这里我们假设你要还原的数据库文件是YourDB.mdf

  1. 首先在SQL Server中创建一个同名的数据库,叫[YourDB]。
  2. 然后停止SQL Server的数据库引擎服务,拷贝原先的YourDB.mdf到你刚才新建的[YourDB]数据库的文件目录并覆盖之。
  3. 启动SQL Server的数据库引擎服务
  4. 之后你会发现[YourDB]这个数据在SQL Server的状态是(Recovery Pending)
  5. 依次执行下面脚本:
    ALTER DATABASE [YourDB] SET EMERGENCY
    DBCC checkdb([YourDB]) ALTER DATABASE [YourDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE DBCC CheckDB ([YourDB], REPAIR_ALLOW_DATA_LOSS) ALTER DATABASE [YourDB] SET MULTI_USER
  6. 之后就应该可以在SQL Server中正常使用和访问[YourDB]数据库了

这个方法适合还原那些没有损坏的mdf数据库文件到Sql Server,但是如过你的mdf文件因为意外情况(比如服务器意外断电)导致其损坏,那这个方法还是不行。遇到这种情况只有通过像ApexSQL这样的专业工具来恢复数据了。