我的Blog我做主^_^

走向一条通往JAVA的不归路...

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  64 随笔 :: 68 文章 :: 77 评论 :: 0 Trackbacks


在没有数据库日志的情况下数据的恢复:

由于误删的事务日志文件,导致数据库无法启动(置疑状态),数据无法取去,

方法:
新建一个同名数据库,把数据文件copy覆盖
打开系统表的操作权限
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
设置成为紧急状态
update sysdatabases set status = 32768 where name = 'databaseName'
然后刷新一下数据库
变成了紧急状态
然后再
update sysdatabases set status =26 where name = ''databaseName''
然后刷新一个数据库
一般情况下就应该可以了。

http://www.itpub.net/showthread.php?s=&threadid=32011&highlight=%C8%D5%D6%BE%CE%C4%BC%

太兴奋了,我的数据终于找回来了

数据库被置疑的解决办法 一:         
 
在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因:
1.错误的删除日志;
2.硬件(HD)损坏,造成日志和数据文件写错误;
3.硬盘的空间不够,比如日志文件过大;


解决办法:

这是最简单的办法是有数据库的全备份,然后恢复即可.
步骤:

1. 删除原始的数据库:
USE MASTER
GO
DROP DATABASE DB_SUEPECT


2.建立同名的数据库:
USE master
GO
CREATE DATABASE DB_SUSPECT
ON
( NAME = DBNAME_DAT,
FILENAME = 'C:',
SIZE = 10,
FILEGROWTH = 5 )
LOG ON
( NAME = 'DBNAME_LOG',
FILENAME = 'g:',
SIZE = 5MB,
FILEGROWTH = 5MB )
GO


3.恢复数据库:
RESTORE DATABASE DB_SUSPECT
FROM DBNAME_BACKUP.DAT


4.数据库完整性检测:
DBCC CHECKDB('DB_SUSPECT')

5.重新启动MSSQLSERVER服务.

如果没有全备份,那就要用一些特殊的方法:

1.设置数据库为紧急模式
Use Master
GO
sp_configure 'allow updates', 1
reconfigure with override
GO
UPDATE sysdatabases SET status = 32768 where name = 'DB_SUSPECT'
GO

2.停掉SQL Server服务:.Net STOP MSSQLSERVER

3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走:

4.启动SQL Server服务:.Net START MSSQLSERVER

5.重新建立一个同名的数据库DB_SUSPECT;

USE master
GO
CREATE DATABASE DB_SUSPECT
ON
( NAME = DBNAME_DAT,
FILENAME = 'C:',
SIZE = 10,
FILEGROWTH = 5 )
LOG ON
( NAME = 'DBNAME_LOG',
FILENAME = 'g:',
SIZE = 5MB,
FILEGROWTH = 5MB )
GO


6.设置数据库运行在单用户的模式:
USE MASTER
GO
ALTER DATABASE DB_SUSPECT SET SINGLE_USER
GO

7.停掉SQL服务:.Net STOP MSSQLSERVER

8.把原来的数据文件再覆盖回来:


9.启动SQL Server服务:.Net START MSSQLSERVER

10.重新设置SQLSERVER的状态:
USE MASTER
GO
EXEC sp_resetstatus "DB_SUSPECT"

11.数据库完整性检测:
DBCC CHECKDB('DB_SUSPECT')

12.恢复数据库为多用户模式:
USE MASTER
GO
ALTER DATABASE DB_SUSPECT SET MULTI_USER
GO

13.恢复SQLSERVER原始的配置:
USE MATER

GO

UPDATE sysdatabases SET status = 4194320 where name = 'DB_SUSPECT'
GO

14.配置SQLSERVER不允许更新系统表:
USE MASTER
GO
sp_configure 'allow updates', 0
reconfigure with override
GO

15.重新启动MSSQLSERVER服务:

最好重新启动操作系统

16.备份数据库:

可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT
补充一点,如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限.

Zach的灵验脚本
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
=====================================
该文章转载自网络大本营:
http://www.xrss.cn/Info/7753.Html


数据库被置疑的解决办法方法二:

SQL Server数据库多数据文件恢复技术
由于截断数据库日志或者其他需要,我们需要由单个数据文件中恢复数据库。下面的操作需要用sa的身份在SQL Server 查询分析器中登录,并一直假设我们要恢复的数据库是test,数据文件是C:\Program Files\Microsoft SQL Server\MSSQL\data\test_data.mdf。同时如果你需要截断日志文件,请在数据库脱机后将日志文件改名。

如果您的mdf文件是当前数据库产生的并且是单个数据日志的,那么一般情况下你可以很轻松的使用sp_attach_single_file_db恢复数据库,操作语句如下:
sp_attach_single_file_db @dbname = ’test’, @physname = ’C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf’
会出现类似下面的提示信息
设备激活错误。物理文件名 ’C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF’ 可能有误。
已创建名为 ’C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF’ 的新日志文件。
如果目的是截断日志,你可以将刚才改名的日志文件删除或者备份了。 

但是,如果您的数据库文件是从其他计算机上复制过来的或者有多个数据或日志文件,那么很不幸,上述办法多半行不通了。你也许会得到类似下面的错误信息
服务器: 消息 1813,级别 16,状态 2,行 1
未能打开新数据库 ’test’。CREATE DATABASE 将终止。
设备激活错误。物理文件名 ’C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF’ 可能有误。
我们需要用下面的操作来试着恢复(此操作具有很大的危险性,请确认在操作时您的数据库不在使用中)。
我们使用默认方式建立一个供恢复使用的数据库(如test)。如果是多数据文件的,请确认新建数据文件的名称及数目和要恢复的数据文件一致。日志文件就不必了; 
停掉数据库服务器; 
将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf; 
启动数据库服务器。此时会看到数据库test的状态为“置疑”; 
设置数据库允许直接操作系统表。在SQL Server 企业管理器里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中; 
设置test为紧急修复模式
update sysdatabases set status=-32768 where dbid=DB_ID(’test’)
此时可以在SQL Server 企业管理器里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表; 
下面重建数据库日志文件
dbcc rebuild_log(’test’,’C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf’)
执行过程中,如果遇到下列提示信息:
服务器: 消息 5030,级别 16,状态 1,行 1
未能排它地锁定数据库以执行该操作。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
说明其他程序正在使用该数据库,如果您正在使用SQL Server 企业管理器,那么关闭它。
正确执行完成的提示应该类似于:
警告: 数据库 ’test’ 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
此时打开在SQL Server 企业管理器里面会看到数据库的状态为“只供DBO使用”; 
验证数据库一致性(可省略)
dbcc checkdb(’test’)
在进行了多个验证后,最后的执行结果一般如下:
CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 ’test’ 中)。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系; 
设置数据库为正常状态
sp_dboption ’test’,’dbo use only’,’false’
如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦; 
最后一步,我们要将步骤5中设置的“允许对系统目录直接修改”一项恢复。在SQL Server 企业管理器里面选择数据库服务器,按右键,选择“属性”,取消在“服务器设置”页面中将“允许对系统目录直接修改”的选择。 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1425440



posted on 2007-03-31 16:04 java_蝈蝈 阅读(7733) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: