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 FilesMicrosoft SQL Server 2000Data数据库日志文件名.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:MSSQLDatamy_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
- 首先在SQL Server中创建一个同名的数据库,叫[YourDB]。
- 然后停止SQL Server的数据库引擎服务,拷贝原先的YourDB.mdf到你刚才新建的[YourDB]数据库的文件目录并覆盖之。
- 启动SQL Server的数据库引擎服务
- 之后你会发现[YourDB]这个数据在SQL Server的状态是(Recovery Pending)
- 依次执行下面脚本:
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 - 之后就应该可以在SQL Server中正常使用和访问[YourDB]数据库了
这个方法适合还原那些没有损坏的mdf数据库文件到Sql Server,但是如过你的mdf文件因为意外情况(比如服务器意外断电)导致其损坏,那这个方法还是不行。遇到这种情况只有通过像ApexSQL这样的专业工具来恢复数据了。