SQL Server的“错误:9004”

客户的一台现场采集电脑崩溃,无法启动。用PE引导后,将MDF和LDF数据复制出来,往正常的数据库附加时,报如下错误:

处理数据库 ‘databasename‘ 的日志时出错。如果可能,请从备份还原。如果没有可用备份,可能需要重新生成日志。无法打开新数据库 ‘databasename‘。CREATE DATABASE 中止。 (Microsoft SQL Server,错误: 9004)


查找资料以后,凡是带有“update sysdatabases set status=-32768 where dbid=DB_ID(‘test‘)”这个语句的,一律无效,会报“不允许对系统目录进行即席更新。”,sql server2005以后不允许更新系统目录了。

以下方法经我测试有效:

解决步骤:
1.使用默认方式建立一个供恢复使用的数据库(如database_forrestore)。
2.停止数据库实例服务。
3.将刚才生成的数据库的日志文件database_forrestore.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件database_forrestore_data.mdf。
4.启动数据库服务器。此时会看到数据库database_forrestore不可访问。
5. ALTER DATABASE database_forrestore SET EMERGENCY
6. ALTER DATABASE database_forrestore SET SINGLE_USER【这一步是为了执行下面的dbcc】
7. ALTER DATABASE database_forrestore REBUILD LOG ON (NAME=dbname_log, FILENAME=‘d:\data\database_forrestore_log.ldf‘)
    执行后,会有警告信息“警告: 数据库 ‘database_forrestore‘ 的日志已重新生成。已失去事务的一致性。RESTORE 链已断开,服务器不再有以前的日志文件的上下文,因此您需要了解它们的内容。应运行 DBCC CHECKDB 验证物理一致性。数据库已置于 dbo-only 模式。在准备使数据库可用时,需要重置数据库选项,并删除所有多余的日志文件。”
8. DBCC CHECKDB(<dbname>, REPAIR_ALLOW_DATA_LOSS) 【这一步时,我这里报655错误,版本不兼容,让我升级数据库,我的sqlserver服务器是2012,用sp_dbcmptlevel查看database_forrestore 其兼容级别是110,也是2012,应该不存在兼容问题,但是这一步就是执行不了,可以跳过】
9. ALTER DATABASE database_forrestore  SET MULTI_USER【恢复多用户模式】
10. ALTER DATABASE database_forrestore  SET ONLINE 【联机,可以在数据库上的右键菜单中执行】

11.刷新,至此,数据应该回来了

这里还有个英文版可以参考

ERROR : 9004 An error occurred while processing the log for database.
If possible, restore from backup.
If a backup is not available, it might be necessary to rebuild the log.

If you receive above error it means you are in great trouble. This error occurs when database is attempted to attach and it does not get attached. I have solved this error using following methods. Hope this will help anybody who is facing the same error.

Microsoft suggest there are two solution to this problem.

1) Restore from a backup.

  • Create Empty Database with same name and physical files (.ldf and .mdf).
  • Shut down SQL Server.
  • Replace the files which you want to attach with this new empty database files.
  • Start SQL Server.
  • Database will be in suspect mode which means so far everything going as it should be.
  • Next is to put database in emergency mode. ALTER DATABASE <DatabaseName> SET EMERGENCY will change the database status to emergency.
  • A database which is in emergency mode can be repaired with allowing some data loss. DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS will do the task.
  • In this process some of the data may be lost but database will in working condition with most of the data retrieved from log.

2) Rebuild the log.

  • Create database using CREATE DATABASE FOR ATTACH_REBUILD_LOG.
  • This may fix the problem right away if database which is attempted to be attach is shut down properly. If database is corrupt it will be not restored correctly.
  • Next DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS should be ran to bring back the database operational. This may loose some data but it may bring back database in working condition.
  • In this option as log is rebuilt SQL Server does not use log file to retrieve any data. In this process none of the log operation like transaction rollback will work.

I prefer to use the first method if it works. First method has worked sevral time without any issue. Syntax of the CREATE database can be found on Book Online for further guidance.

Reference : Pinal Dave (http://blog.SQLAuthority.com)

SQL Server的“错误:9004”

时间: 2024-11-11 02:26:27

SQL Server的“错误:9004”的相关文章

SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)

在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period exceeded.(Microsoft SQL Server, 错误1222)",对应的中文错误提示为"已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222)",如下截图所示,不管是用一般权限的账号还是具有sysadmin角色的登录名都是如此. 这

用户 &#39;sa&#39; 登录失败。 (Microsoft SQL Server,错误: 18456)

今天登陆数据库的时候,却忽然登陆了不了,并且提示了这样的错: 解决方法: 1.用Windows身份登录数据库 2.安全性==>登录名==>双击sa 3.重设密码 4.状态==>登录:启用==>确定 5.右击服务器名==>属性 6.重启数据库,和数据库服务. 用户 'sa' 登录失败. (Microsoft SQL Server,错误: 18456)

The database could not be exclusively locked to perform the operation(SQL Server 5030错误解决办法)(转)

Microsoft SQL Server 5030错误解决办法 今天在使用SQL Server时,由于之前创建数据库忘记了设置Collocation,数据库中插入中文字符都是乱码,于是到DataBase的Options中修改Collocation,出现了The database could not be exclusively locked to perform the operation这个错误,无法修改字符集为Chinese_PRC_90_CI_AS. 解决办法找了很久才找到,如下: 1.执

SqlServer2005 provider: TCP 提供程序, error: 0 - 由于目标计算机积极拒绝,无法连接。) (Microsoft SQL Server,错误: 10061)问题解决

环境:win7 32位 数据库:sqlserver2005 报错过程: 按照sqlserver2005默认流程一步步安装的,以前启动一直正常, 今天启动本机安装的sqlserver2005,点击""登陆,时,报错:错误信息如下: 标题: 连接到服务器 ------------------------------ 无法连接到 XGL. ------------------------------ 其他信息: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到

sql server 2008出现 数据库主体在该数据库中拥有架构,无法删除。 (Microsoft SQL Server,错误: 15138)

在用sql server 2008做数据挖掘时,出现用户无法访问的问题,所以给相应的数据库添加一个登入用户zhang,并赋予相应的权限.在调试时,发现还是存在问题,故想删除这个用户zhang,并新建一个用户.出现错误提示: 数据库主体在该数据库中拥有架构,无法删除. (Microsoft SQL Server,错误: 15138) 解决方案: 先删除此用户对应的架构,然后在删除对应的用户 具体步骤: 1.相应数据库-->安全性-->构架,先删除对应的构架 2.相应数据库-->安全性--&

用户、组或角色 &#39;zgb&#39; 在当前数据库中已存在。 (Microsoft SQL Server,错误: 15023)

在使用SQL Server 时,我们经常会遇到一个情况:需要把一台服务器上的数据库转移到另外一台服务器上.而转移完成后,需要给一个"登录"关联一个"用户"时,往往会发生错误: "错误15023:当前数据库中已存在用户或角色" 这个问题非常棘手,几经排常找到了原因与解决方法,因为这个问题与解决方法均比较复杂,所以把这个过程中的一些经验纪录下来与大家分享,希望能对大家以后的类似操作有所帮助. 原因及解决办法如下: 首先介绍一下sql server中&

SQL Server 还原错误“restore database正在异常终止 错误 3154”

今天在还原数据库时,先建立相同名字的数据库,然后在该数据库上右键还原数据库.遇到了这样的一个错误: “备份集中的数据库备份与现有的 'RM_DB' 数据库不同. RESTORE DATABASE 正在异常终止. (Microsoft SQL Server,错误: 3154) ” 很显然,这是由于备份的数据库版本和我现在还原的数据库版本不一样导致的. 最终通过以下方法解决了此类问题: (1)直接在“数据库”上右键菜单->还原文件和文件组 (2)直接写入数据库名字-RM_DB,点击确定,OK!还原成

SQL Server出现错误: 4014

SQL Server出现错误: 4014 线下的测试机器老是报错,从errorlog里看到大量的4014错误 A fatal error occurred while reading the input stream from the network. The session will be terminated (input error: 0, output error: 0). 错误: 4014,严重性: 20,状态: 16. 于是谷歌了一下,发现了一篇文章:https://www.mssq

SQL SERVER 9003错误解决方法 只适用于SQL2000

SQLSERVER 9003错误解决方法 只适用于SQL2000 (只适用于SQL2000) "无法打开新数据库 'POS'.CREATE DATABASE 中止. (Microsoft SQL Server,错误: 9003)" 看是9003错误,就想到可能是由于日志文件的原因,再看数据库文件可能损坏,于是想到dbcc checkdb指令. 方法如下: 1.我们使用默认方式建立一个供恢复使用的数据库(如pos).可以在SQL Server Enterprise Manager里面建立