分享、学习、提高
2007/11/29 19:28
前几天,帮一个朋友恢复MSSQL数据库。机子可能因为重启的原因导致了数据库不见了。
先备份,新建一个同名的数据库(ylmusic),停掉MSSQL服务,将备份的原数据库的文件并覆盖自动创建的文件。启动MSSQL服务,此时提示“ylmusic(置疑)”。参照sqlserver2000数据库置疑的解决方法,执行
引用
USE MASTER
go

SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
GO

UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='ylmusic'
Go

sp_dboption 'ylmusic', 'single user', 'true'
Go

DBCC CHECKDB('ylmusic')
Go

update sysdatabases set status =28 where name='ylmusic'
Go

sp_configure 'allow updates', 0 reconfigure with override
Go

sp_dboption 'ylmusic', 'single user', 'false'
Go
使用此方法,执行了约有2分多钟,出现了大量的错误提示,错误主要集中在几个表中。

尝试恢复,使用导入导出复制的办法,将旧数据库内容转移到新的数据库中,最后提示失败。因为有几个表没复制完全成功。经检查,就两个表没完全成功,其它正常。

尝试修复原数据库,
引用
alter database ylmusic set SINGLE_USER
dbcc checktable ('table1',repair_allow_data_loss)
alter database ylmusic set MULTI_USER


执行:alter database spjb_oa_new set SINGLE_USER
但一直不停下来,只好使用(如果数据库上面正在进行的其他操作不是很重要的话可以用)
alter database ylmusic set SINGLE_USER with ROLLBACK IMMEDIATE
将其设置为单用户模式。
然后执行
dbcc checktable ('table1',repair_allow_data_loss)
始终提示:
引用
服务器: 消息 7919,级别 16,状态 3,行 1
未处理修复语句。数据库需要处于单用户模式下。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。


此时,在企业管理器中已经可以看到此数据库已经为单用户了,但始终无法执行:(

几天前尝试了多次都是这样,昨天将数据下载回本机修复,一样的提示。

最后没办法,只能有多少能用的数据,就恢复多少吧。

table1原有8k条记录,只导入了1k多条。另一个表也大约只导入了1/8的记录。

执行select * from table1 where id<200,会显示一些数据,然后提示
引用
服务器: 消息 823,级别 24,状态 2,行 1


连接中断

而执行select * from table1 where id<100就可以,

于是使用select出多少条,就插入多少条,化了近半个小时手功执行将第一个数据表导入了,就10条有错的记录不能导入。
第二张表table2错的很BT,开始每隔几十条记录就错一次,后面有可能几条记录就错一次,最后没办法,写了个程序,让其忽略错误,自动复制。

其网站程序是asp的,因此就用asp写了一个。conn.asp中包含了连接数据库connect_db()的函数。

hx_update.asp
<!--#include file="conn.asp"-->
<%
dim fromi,endi
fromi = 1  '开始ID
endi = 5880  '结束ID

on error resume next
for i=fromi to endi

sql="insert into new_music..table1 select * from ylmusic..table1 where NClassID = "& i

'response.write sql & "<br>"
'Response.write i  & " / "
conn.execute(sql)
  if err then
  Response.write i  & " / "
  response.write err.description & "<br>"
  Err.Clear
'hx注:由于出错时会出现严重错误,直接就断开数据库连接了,因此必须再次连接数据库才能继续执行
  connect_db()
  end if
next

conn.close
set conn=nothing

%>

先将new_music的表的自动增长的去掉,不然没法导入。这个程序最终版大约也化了20多分钟,之前还走了一些弯路,比如每500个记录插入个一次等等。批量执行,终于OK。
发表评论
表情
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]