数据库无法附加:所指定的文件不是有效的SQL server数据库文件

myhorizon118 2011-09-02 10:25:47
各位大侠:
重启电脑后就发现数据库变成了置疑状态,我赶紧停止了服务器,然后将mdf和ldf文件备份出来。可是却无法将数据库分离出来,再刷新服务后原来的数据库名都找不到了。怀疑是文件头坏了,不知道该怎么办了。
做过如下操作:
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go

update sysdatabases set status=-32768 where dbid=DB_ID('test')

但是在执行语句:dbcc rebuild_log('test','d:\Data\test_log.ldf')
时报错: 服务器: 消息 5180,级别 22,状态 1,行 1
由于文件 ID 0(位于数据库 'AIS20110823094108' 中)无效,所以未能打开 FCB。

连接中断


另外还有一个报错:
服务器: 消息 5172,级别 16,状态 15,行 1
文件 'C:\Program Files\Microsoft SQL Server\MSSQL\data\AIS20110823094108_Data.mdf' 的文件头不是有效的数据库文件头。PageAudit 属性不正确。


试了很多种办法都不知道该怎么,特向各位高人求救!!!




...全文
2005 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hljlzj_wdl 2012-01-26
  • 打赏
  • 举报
回复
请问楼主,问题解决了吗?我也遇到这个问题了,和你的提示错误信息完全一样,我的程序是数据库都了,后来用数据恢复软件恢复回来的,但是就是用不了,折磨中.......
claro 2011-09-08
  • 打赏
  • 举报
回复
又是K3。。。

一定备份好数据,兄弟!!
myhorizon118 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qianjin036a 的回复:]
1.检查你原先的数据库文件是否还在.
2.在系统事务日志中检查是否有I/O错误.
3.如没有I/O错误,看原数据库文件是否能拷贝,如不能拷贝,停止SQL服务后再看是否能拷贝.
4.如果能将文件复制的话,试着用磁盘扫描软件扫描磁盘.
5.如果磁盘读写没问题的话,试着移走原数据库文件,再新建一个相同的数据库,数据库名和文件名都与原先的相同.,
停止服务,用原数据库文件覆盖新的文件,重启服务,……
[/Quote]


执行语句:DBCC CHECKDB('databasename')时报错
服务器: 消息 5180,级别 22,状态 1,行 1
由于文件 ID 0(位于数据库 'AIS20110823094108' 中)无效,所以未能打开 FCB。

连接中断

这到底是为什么呀,呜呜。。。。。。。
myhorizon118 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qianjin036a 的回复:]
1.检查你原先的数据库文件是否还在.
2.在系统事务日志中检查是否有I/O错误.
3.如没有I/O错误,看原数据库文件是否能拷贝,如不能拷贝,停止SQL服务后再看是否能拷贝.
4.如果能将文件复制的话,试着用磁盘扫描软件扫描磁盘.
5.如果磁盘读写没问题的话,试着移走原数据库文件,再新建一个相同的数据库,数据库名和文件名都与原先的相同.,
停止服务,用原数据库文件覆盖新的文件,重启服务,……
[/Quote]

我查看了系统日志文件 是有一个报错:




而且无法设置为单用户模式
myhorizon118 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
是不是相同的版本啊?
[/Quote]

都是SQL 2000,而且就算在出问题的那台电脑上都不能自己附加上去。
LiJiboRH 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 claro 的回复:]

学习。。。。
[/Quote],,,
claro 2011-09-02
  • 打赏
  • 举报
回复
学习。。。。
--小F-- 2011-09-02
  • 打赏
  • 举报
回复
--常规SQL SERVER数据库置疑后恢复步骤   
--1. 恢复步骤:
--a.将smlog_log.ldf文件备份到其它目录下;
--b.将源目录下的smlog_log.ldf文件改名为smlog_log_bak.ldf;
--c.执行以下语句修改数据库的状态:
use Master
go
update sysdatabases set status=32768 where name='数据库名称' --修改状态,設為緊急狀態
go
shutdown with nowait --停止数据库服务器
go
--d.退出SQL并在(COMMAND)命令行模式中通过下面的代码重新启动SQL:
sqlservr -c -T3608 -T4022 --安全模式启动SQL SERVER
--e.在查询分析器中执行以下语句来查看刚刚修改过状态的数据库状态:
select Name,Status from sysdatabases where Name='数据库名稱'
--f.执行以下代码新建日志文件:
dbcc traceon(3604)--跟踪
dbcc rebuild_log('数据库名称','日志文件全路徑') --文件名要有全路径和扩展名
--dbcc rebuild_log('prs_msc','d:\mscsql\mssql\data\prs_msc_log.ldf
--g.将数据库置回正常状态:
update sysdatabases set status=0 where name='数据库名称'
--h.重新启动数据库后执行以下语句检查数据库:
DBCC CHECKDB --如果执行完有错误用以下语句修复
--i.要修复数据库必需将数据库改为单用户模式:
Exce sp_dboption '数据库名称','single user','true'---('false'恢复多用户)
--j.执行以下语句修复数据库:
DBCC CHECKDB('数据库名称',REPAIR_ALLOW_DATA_LOSS)
REPAIR_ALLOW_DATA_LOSS:是比较高级的修复方式
REPAIR_FAST:是简单快速的修复方式
/*
處理状态就为"置疑"的數據庫
备份数据文件,然后按下面的步骤处理:
1.新建一个同名的数据库(数据文件与原来的要一致)
2.再停掉sql server(注意不要分离数据库)
3.用原数据库的数据文件覆盖掉这个新建的数据库
4.再重启sql server
5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用数据库的脚本创建一个新的数据库,并将数据导进去就行了.

*/
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1
GO
RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'
Go
sp_dboption '置疑的数据库名','single user','true'
Go
DBCC CHECKDB('置疑的数据库名')
Go
update sysdatabases set status=28 where name='置疑的数据库名'
Go
sp_configure 'allow updates',0
GO
reconfigure with override
Go
sp_dboption '置疑的数据库名', 'single user','false'
Go
areswang 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
是不是相同的版本啊?
[/Quote]
有可能是版本问题
-晴天 2011-09-02
  • 打赏
  • 举报
回复
1.检查你原先的数据库文件是否还在.
2.在系统事务日志中检查是否有I/O错误.
3.如没有I/O错误,看原数据库文件是否能拷贝,如不能拷贝,停止SQL服务后再看是否能拷贝.
4.如果能将文件复制的话,试着用磁盘扫描软件扫描磁盘.
5.如果磁盘读写没问题的话,试着移走原数据库文件,再新建一个相同的数据库,数据库名和文件名都与原先的相同.,
停止服务,用原数据库文件覆盖新的文件,重启服务,执行:

USE MASTER
GO

SP_CONFIGURE 'ALLOW UpdateS',1 RECONFIGURE WITH OVERRIDE
GO

Update SYSDATABASES SET STATUS =32768 Where NAME='置疑的同名数据库名'
Go

sp_dboption '置疑的同名数据库名', 'single user', 'true'
Go

DBCC CHECKDB('置疑的同名数据库名')
Go

update sysdatabases set status =28 where name='置疑的同名数据库名'
Go

sp_configure 'allow updates', 0 reconfigure with override
Go

sp_dboption '置疑的同名数据库名', 'single user', 'true'
Go
dawugui 2011-09-02
  • 打赏
  • 举报
回复
如果是:SQL2000附加SQL2005数据

具体方法
如题,若使用SQL2000附加SQL2005的数据库时在附加时会出现了错误602,提示“对sysindexes运行DBCC CHECKTABLE”因为数据库附加到2005的时候, 数据库文件已经自动升级到2005, 所以在2000下是无法再附加的(没有向上兼容的)直接restore或附加是不行的, 用脚本+导数据肯定没有问题。
2005转到2000的步骤步骤
1. 生成for 2000版本的数据库脚本
2005 的manger studio
-- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例
-- 右键要转到2000的库
-- 任务
-- 生成脚本
-- 在"脚本向导"的"选择数据库"中, 确定选择的是要转到2000的库
-- 勾选"为所选数据库中的所有对象编写脚本"
-- 在接下来的"选择脚本选项"中, 找到"为服务器版本编写脚本"项, 选择"SQL Server 2000"
-- 其他选项根据需要设置
-- 最后把脚本保存到一个 .sql 脚本文件

2. 在2000中创建目标数据库
在查询分析器(或2005的manger studio在打开脚本文件), 连接到SQL Server 2000,执行上面生成的脚本.以创建一个新的数据库

3. 将数据从2005导到2000
2005 的manger studio
-- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例
-- 右键要转到2000的库
-- 任务
-- 导出数据
-- 在"SQL Server 导入和导出向导"的"选择数据源"步骤中, 确定选择的是要导出的数  据库
-- 在"选择目标"步骤中, 连接到 2000, 并选择步骤2新建的库
-- 在"选择源表和源视图"中, 选择所有的表
-- 最后完成





dawugui 2011-09-02
  • 打赏
  • 举报
回复
是不是相同的版本啊?
//附加数据库 sp_attach_db 当使用 sp_attach_db 系统存储过程附加数据库时。 sp_attach_db:将数据库附加到服务器。 语法 sp_attach_db [ @dbname = ] 'dbname' , [ @filename1 = ] 'filename_n' [ ,...16 ] 参数 [@dbname =] 'dbname' 要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。 [@filename1 =] 'filename_n' 数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。 参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库中其它文件的系统表。 该列表还必须包括数据库分离后所有被移动的文件。 返回代码值:0(成功)或 1(失败) eg:下面的示例将 pubs 中的两个文件附加到当前服务器。 EXEC sp_attach_db @dbname = N'pubs', @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf' EXEC sp_attach_db @dbname = N'Ty20051029101451aaa', @filename1 = N'd:\5屏幕\Ty20051029101451aaa_data.mdf', @filename2 = N'd:\5屏幕\Ty20051029101451aaa_log.ldf' ---解决问题了 //删除数据库 DROP DATABASE 从Microsoft? SQL Server? 删除一个或多个数据库。删除数据库将删除数据库所使用的数据库文件和磁盘文件。 语法 :DROP DATABASE database_name [ ,...n ] 参数 :database_name 指定要删除的数据库名称。从 master 数据库中执行 sp_helpdb 以查看数据库列表。 eg: exec sp_helpdb database_name exec Drpo DataBase [Ty20051029101451aaa] //分离数据库 可以使用 sp_detach_db 存储过程分离该数据库,然后使用带有 FOR ATTACH 子句的 CREATE DATABASE 重新附加。 sp_detach_db Archive GO CREATE DATABASE Archive ON PRIMARY (FILENAME = 'c:\program files\microsoft sqlserver\mssql\data\archdat1.mdf') FOR ATTACH GO //显示当前数据库信息 --select * from Master..sysDatabases //新建---不行啊 CREATE DATABASE TestOA ALTER DATABASE TestOA SET OFFLINE WITH ROLLBACK IMMEDIATE RESTORE DATABASE TestOA From disk='C:\Documents and Settings\Administrator\桌面\帐套\data\Template.Dat' ALTER DATABASE TestOA SET OFFLINE WITH ROLLBACK IMMEDIATE exec sp_detach_db Km20051030011601 --分离数据库 exec sp_attach_single_file_db km20051030011601,'D:\TestDatabase\Km20051030011601.mdf'--只附加.mdf文件

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧