BCP恢复SQL Server 2000数据库 二

 

 

原始位置:http://soft.zdnet.com.cn/software_zone/2007/0918/512412.shtml

BCP恢复SQL Server 2000数据库二(1)

缺省情况下,SQL Server不允许修改status值。直接作update,系统提示服务器: 消息 259,级别 16,状态 2,行 1未启用对系统目录的特殊更新。系统管理员必须重新配置 SQL Server 以允许这种操作。

所以先执行SQL脚本,让SQL Server允许我们修改status值:

sp_configure 'allow updates', 1

RECONFIGURE WITH OVERRIDE

修改status到32768(紧急模式),执行SQL脚本:

update SysDatabases

set status=32768

where name='zytk'

在查询分析器中执行SQL脚本,检查数据库完整性。

dbcc checkdb ('ZYTK') with ALL_ERRORMSGS

执行结果有很多错误(具体执行结果见03CheckDB-ZYTK结果.txt),跟笔者估计一致,数据库的索引出了大问题。下面摘录其中一个错误:

对象 'cw_Check_Detail' 有 0 行,这些行位于 0 页中。

服务器: 消息 8936,级别 16,状态 1,行 1

表错误: 对象 ID 181575685,索引 ID 1。B 树链的链接不匹配。(1:4987)->next = (1:2601),但 (1:2601)->Prev = (1:4947)。

在查询分析器中执行SQL脚本,将数据库ZYTK的status修改为16:

update SysDatabases

set status=16

where name='zytk'

刷新数据库,ZYTK(紧急模式)转变为ZYTK。注意此时不能重新启动SQL Server服务!否则数据库ZYTK的状态还会变成置疑。这时,数据库处理算是成功一半!这个假正常模式(我的叫法)还是不能做数据库备份的。否则会提示如图5的错误。

靠BCP恢复SQL Server 2000数据库二(1)

 

BCP恢复SQL Server 2000数据库二(2)

不过这时可以看到那些可恨又可爱的表及表中的数据了。

在d:recovery下建立目录BCP,再在d:recoveryBCP下建立error目录。利用SQL Server数据库的SysObjects表可以生成批量的BCP命令:

从数据库中各表导出所有表的数据:

Use  %1

Select 'BCP  %1..' + name +

' out  d:recoveryBCP' +name + '.txt -c -S%2  -U%3 -P%4 >D:recoveryBCPerror out_'+name+'.txt' from  sysobjects where type = 'U' order by name

从数据文件导回到数据库中的各表:

Use  %1

Select 'BCP  %1..' + name +

' in  d:recoveryBCP' +name + '.txt -c -S%2  -U%3 -P%4 >D:recoveryBCPerrorin_'+name+'.txt' from sysobjects where type = 'U' order by name

  注意:type = "U",U必须大写,表用户自定义表。-S服务器,-P密码,%1为数据库,%2为本机SQL Server实例名,一般就是计算机名,%3为登录账户,一般为sa,%4为登录密码。

本文中具体的例子如下:

Select 'BCP  ZYTK..' + name +

' out  d:recoveryBCP' +name + '.txt -c -Stech  -Usa -P123456 >d: recoveryBCPerrorout_'+name+'.txt' from sysobjects where type = 'U' order by name

将上述SQL脚本的查询结果全选后另存为批处理文件zytk.bat。用于从数据库ZYTK中各表导出以表名命名的txt文件:

Select 'BCP  ZYTK015..' + name +

' in  d:recoveryBCP' +name + '.txt -c -Stech  -Usa -P123456 >d: recoveryBCPerrorin _'+name+'.txt' from sysobjects where type = 'U' order by name

将上述SQL脚本的查询结果全选后另存为批处理文件zytk015.bat。用于将上述各表的txt文件导回到数据库ZYTK015。执行zytk.bat,执行完毕后要检查D:recoveryBCPerror下的每个out_表名.txt文件(见Error_outFiles.rar),查看是否有误。当然导入后要检查in表名.txt文件,查看是否有误。这是必须的,笔者因想偷懒,结果因导入数据不完整而重新恢复多花了半天,教训啊!我处理的数据库表一共有166个,为了提高恢复准确性,最好能找个人一起帮助看着过程是否有误。

新建ZYTK015要保证跟ZYTK一样的表结构(如主键、索引等,本文不再赘述,本文是从ZYTK中生成SQL脚本,然后新建数据库(下转第71页)(上接第70页)ZYTK015后执行创建表、主键、索引脚本。当然一般还有视图、存储过程等加密过的,是不能导出为SQL脚本,那得想其它的办法,本文是还原2004年的数据库来实现的)。

执行zytk015.bat,执行完毕后要检查D:recoveryBCPerror每个in_表名.txt文件(见Error_inFiles.rar)。笔者遇到一个历史流水表导入失败,后来经过分时间段导入,多次试验才得以成功。恢复的时候一定要细心,并且记录关键步骤的操作内容,否则做到哪一步,自己都晕菜了,更不用说成功地恢复数据库了!如果在zytk015数据库中能看到数据,那就是大功告成了。不过不要得意哦,还得运行游泳收费系统来测试数据的正确性。测试之前记得要备份数据库哦。

最后,有个问题要说明一下:如果表间有关联,使用BCP恢复起来就麻烦一点。一般的做法可以把外键之类的表间关系去掉,等导入数据后在用SQL脚本重新创建这些关系。这个做法数据的有效性得由我们自己去判断了,如果有问题还得手工修改(一般需要开发人员协助,因为只有他们才能去查代码)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值