数据库日志文件丢失时的恢复步骤
微软有一篇文章讲如何只靠日志文件恢复数据库的,这里的问题是日志文件丢失的情况
最终成功恢复的全部步骤
设置数据库为紧急模式
ü 停掉SQL Server服务;
ü 把应用数据库的数据文件XXX_Data.mdf移走;
ü 重新建立一个同名的数据库XXX;
ü 停掉SQL服务;
ü 把原来的数据文件再覆盖回来;
ü 运行以下语句,把该数据库设置为紧急模式;
运行“Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go”
执行结果:
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。
接着运行“update sysdatabases set status = 32768 where name = 'XXX'”
执行结果:
(所影响的行数为 1 行)
ü 重启SQL Server服务;
ü 运行以下语句,把应用数据库设置为Single User模式;
运行“sp_dboption 'XXX', 'single user', 'true'”
执行结果:
命令已成功完成。
ü 做DBCC CHECKDB;
运行“DBCC CHECKDB('XXX')”
执行结果:
'XXX' 的 DBCC 结果。
'sysobjects' 的 DBCC 结果。
对象 'sysobjects' 有 273 行,这些行位于 5 页中。
'sysindexes' 的 DBCC 结果。
对象 'sysindexes' 有 202 行,这些行位于 7 页中。
'syscolumns' 的 DBCC 结果。
………
ü 运行以下语句把系统表的修改选项关掉;
运行“sp_resetstatus "XXX"
go
sp_configure 'allow updates', 0
reconfigure with override
Go”
执行结果:
在 sysdatabases 中更新数据库 'XXX' 的条目之前,模式 = 0,状态 = 28(状态 suspect_bit = 0),
没有更新 sysdatabases 中的任何行,因为已正确地重置了模式和状态。没有错误,未进行任何更改。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。
ü 重新建立另外一个数据库XXX.Lost;
DTS导出向导
ü 运行DTS导出向导;
ü 复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;
ü 选择“在SQL Server数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;
ü 所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;
ü 于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;
ü 视图和存储过程是执行SQL语句添加的。
这样,XXX.Lost数据库就可以替换原来的应用数据库了。
18:16 | 添加评论 | 阅读评论 (1) | 固定链接 | 引用通告 (0) | 记录它 | SQL Server
Sql Server数据库被置疑后解决方法
现象:数据库Log日志太大了,shrink不掉。于是想把数据库文件卸下来,删除log,再附加上。附加失败。
提示错误:
服务器: 消息 1813,级别 16,状态 2,行
1
未能打开新数据库 'metadb'。CREATE DATABASE 将终止。
设备激活错误。物理文件名 'd:/metadb.LDF' 可能有误。
环境:MSSQL SERVER 2000 企业版
解决过程:
1.建一个新库newdb
2.停掉数据库。删除新库的log文件,将metadb.mdf覆盖newdb.mdf。
3.启动数据库服务器。数据库newdb的状态为“置疑”。
4. 允许对系统目录直接修改
USE MASTER
GO
SP_CONFIGURE'ALLOW UPDATES',1
GO
RECONFIGUREWITH
GO
UPDATESET STATUS=-32768 WHERE DBID=DB_ID('NEWDB')
5.重建LOG
DBCC('NEWDB','C:/PROGRAM FILES/MICROSOFT SQL SERVER/MSSQL/DATA/NEWDB_LOG.LDF')
6.DBCC检查
DBCC('NEWDB')
7.设置数据库为正常状态
UPDATESET STATUS =28 WHERE NAME='NEWDB'
GO
8 不允许对系统目录直接修改
SP_CONFIGURE'ALLOW UPDATES',0
GO
RECONFIGUREWITH
GO
另外:
Zach说他每次遇到这种数据库置疑情况,就运行下面这个脚本,屡试不爽:
======================================================
--before running any script, run the following to set the
master database to allow updates
USE master
GO
sp_configure 'allow updates', 1
GO
RECONFIGURE WITH OVERRIDE
GO
--Run the following script
UPDATE master..sysdatabases SET status = status ^ 256
WHERE name = 'Database_Name'
--Run the following script
exec SP_resetstatus Database_Name
--stop and start the MSDTC at this stage
--After the procedure is created, immediately disable
updates to the system tables:
exec sp_configure 'allow updates', 0
GO
RECONFIGURE WITH OVERRIDE
GO
=====================================
处理置疑的基本步骤:
执行 sp_configure 以允许对系统表进行更新,然后用 RECONFIGURE WITH OVERRIDE 语句强制实施该配置;
数据库重置紧急模式;
执行sp_resetstatus关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项(只有系统管理员才能执行)。执行该过程后,立即重启 SQL Server服务;
执行 sp_configure 以禁止对系统表进行更新,然后用 RECONFIGURE WITH OVERRIDE 语句强制实施该配置。
status ^ 256的意思就是:
--------------------------------------------------------------------------------------------------------
Constant Value Description
SQLDMODBStat_Suspect 256 Database integrity is suspect for the referenced database.
--------------------------------------------------------------------------------------------------------
不同的是,有时候丢失了数据库日志文件,额外需要以下步骤:
? 把应用数据库设置为Single User模式;
? 做DBCC CHECKDB;
才可以。
但是几位网友的实践结果就是这个DBCC CHECKDB执行失败。一位网友yang说:“但是 DBCC CHECKDB就是执行不了,总是说“该数据库处于回避恢复模式”。我已经试了很多次了,就是改变不了这个状态。”
还有一位Rui执行DBCC CHECKDB时报错:“Server: Msg 943, Level 14, State 1, Line 1 Database 'his_yb' cannot be opened because its version (539) is later than the current server version (515).”
对于Yang,可能他没有一步一步做,。我的切身体会是,把应用数据库设置为Single User模式后就可以做DBCC CHECKDB。之后呢,也许SQL Server重启后自动检查数据库是否正常。但是数据应该是可以读出来的,至少可以被DTS Wizard读出来的。这时候的数据库还存在问题,比如我的组件使用数据库时,报告说:“发生错误:-2147467259,未能在数据库 'XXX' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。”
对于Rui,他碰到的那个错误
Server: Msg 943, Level 14, State 1, Line 2
Database 'XXXX' cannot be opened because its version (536) is later than
the current server version (515).
这表明Rui正试图:
从一个SQL Server 2000(version 539,536之类的)的数据库备份恢复到一个SQL Server 7.0中
或者
把一个SQL Server 2000(version 539,536之类的)的数据库attach到一个SQL Server 7.0中,
这是不允许的。如果你必须使用这个SQL Server 2000的数据备份,那么请您首先把这个备份倒入SQL Server 2000,最后用DTS把数据库从SQL Server 2000上transfer到SQL Server 7.0上。