如果只是因为停电的原味,是可以成功修复的,但是提示以下问题
故障2:
未能读取并闩锁页 (1:246)(用闩锁类型 SH)。sysindexes 失败。
原因:bw9kbzpro_01 的表sysindexes 表损坏,sysindexes表记录索引与表的关系,所有现在无法列出表
解决方法(百威官方给出的办法):
1.首先将数据库修复为“不质疑”,修复后仍然无法正常使用
2.导出表信息truncate.sql,使用账套管理工具 建立账套2 bw9kbzpro_01,sql分析器打开truncate.sql执行
3.导出表内容生成bcpout.bat,执行bcpout.bat,D盘会产生txt文件
4.将第三步导出的txt导入数据库2 bw9kbzpro_02,执行bcpin.bat
5.备份数据库2 bw9kbzpro_02,还原到数据库bw9kbzpro_01
引用以下方法:
注意:1.本说明中的bw9kbzpro_01 表示置疑的数据库(也有可能数据库并没有置疑,只是数据库文件太大,需要
通过此工具把数据导出,生成一个新的数据库,达到减小数据库空间的目的),bw9kbzpro_02表示新建的
临时数据库,而实际上由于可能存在多帐套的情况,具体是哪个帐套置疑,要根据实际情况来修改
本工具中的bw9kbzpro_01或者bw9kbzpro_02,还有bcpin.bat 与 bcpout.bat,truncate.sql中
的相应内容(可以用记事本打开来,替换掉)。
2.另外此工具是在服务器上执行的。
3.由于软件的版本在不断更新,数据库表名也在增加,而bcpin.bat 、bcpout.bat 、truncate.sql 这
三个文件中的表名也需要更新才能保证导入导出的数据的完整性。为了防止漏掉一些新的表,因此你可以通过
在SQLSERVER查询分析器中执行下面的命令分别来生成这三个文件的内容,然后复制下来,分别替换到这三个文件。
-- 生成truncate.sql文件中的命令的语法:
select 'if EXISTS(SELECT * FROM bw9kbzpro_02..sysobjects WHERE name = ' + char(39) + name + char(39) + ')'+char(13)+
'delete from bw9kbzpro_02..'+name from bw9kbzpro_01..sysobjects where type='U' and name not in ('sys_t_sheet_setup','sys_t_mode_file','sys_t_image') order by name
-- 生成bcpout.bat文件中的命令的语法:
select 'bcp bw9kbzpro_01..'+name+' out d:\'+name+'.txt -c -S127.0.0.1 -Ubwsa -Pbw99588399' from bw9kbzpro_01..sysobjects where xtype='U' and name not in ('sys_t_sheet_setup','sys_t_mode_file','sys_t_image') order by name
-- 生成bcpin.bat文件中的命令的语法:
select 'bcp bw9kbzpro_02..'+name+' in d:\'+name+'.txt -c -S127.0.0.1 -Ubwsa -Pbw99588399' from bw9kbzpro_01..sysobjects where xtype='U' and name not in ('sys_t_sheet_setup','sys_t_mode_file','sys_t_image') order by name
4.此工具可以适用于百威软件的所有版本,你只需把 bcpin.bat 、bcpout.bat 、truncate.sql 这三个文件
还有本文里面所有命令中的 数据库名替换成该版本对应的数据库名即可。
具体步骤:
1.打开SQLSERVER的企业管理器,点开控制台根目录->SQLSELRVER组->在它的下一级(LOCAL或计算机名)上点
鼠标右键,点属性,出现SQLSERVER属性(配置),然后把"允许对系统目录直接进行修改"。
2.打开SQLSERVER的查询分析器,登录进入,然后在窗口中输入:
update sysdatabases set status=32768 where name='bw9kbzpro_01'
然后按F5键,执行。
3.然后把sqlserver服务停止,再重新启动。
重新生成 bcpin.bat 、bcpout.bat 、truncate.sql 文件的内容,以确保防止漏掉一些新的表。
(按前面的 注意事项的第3点做)
4.运行bcpout.bat,从老的数据库bw9kbzpro_01帐套中导出
5.建立一个新的帐套bw9kbzpro_02, 然后打开后台,进入到新的帐套bw9kbzpro_02
6.退出后台,进入SQLSERVER查询分析器,打开truncate.sql,按F5键执行,用于清空新的帐套中的初始数据
7.运行bcpin.bat 导入数据到新的帐套,导入数据的时间和数据量有关
8.完成之后即可使用新的帐套bw9kbzpro_02,进入后台打开新的帐套bw9kbzpro_02后确认数据都导成功后
9.进入新帐套之后,点关于本软件中,双击图片,出现SQL语句输入,点插入及更新输入以下命令:
truncate table bw9kbzpro_02..sys_t_sheet_setup
insert into bw9kbzpro_02..sys_t_sheet_setup select * from bw9kbzpro_01..sys_t_sheet_setup
truncate table bw9kbzpro_02..sys_t_mode_file
insert into bw9kbzpro_02..sys_t_mode_file select * from bw9kbzpro_01..sys_t_mode_file
truncate table bw9kbzpro_02..sys_t_image
insert into bw9kbzpro_02..sys_t_image select * from bw9kbzpro_01..sys_t_image
最后用下面的命令,比较一下,bw9kbzpro_01和 bw9kbzpro_02 两个帐套的数据量是否一至。只有一至才说明修复成功:
以下命令必须是在SQLSERVER查询分析器中执行.
在执行以下命令时,因为原数据库中的某些表可能有损坏,会导致执行失败,在错误信息前一行会显示该表名。为了让
语句能继续执行,请将该表名替换到语句中的 '坏表1','坏表2','坏表3' 如果有多个表出错,依此类推。
语句执行完之后,如果两个帐套有些表数据量不同时,会显示'此表记录不相等'的表名,以及两个帐套的记录数,以便查原因。
declare @data1 nvarchar(100)
declare @data2 nvarchar(100)
declare @sql nvarchar(4000)
declare @table varchar(100)
declare @rtn int
select @rtn = 0
select @data1='bw9kbzpro_01'
select @data2='bw9kbzpro_02'
use bw9kbzpro_01
declare cc cursor for select a.name from bw9kbzpro_01..sysobjects a,bw9kbzpro_02..sysobjects b
where a.name=b.name and a.xtype = 'U' and a.name not in ('坏表1','坏表2','坏表3...') order by 1
open cc;
while 1 = 1
begin
fetch cc into @table
if @@fetch_status <> 0 break
print '正在处理表:'+@table
select @sql = 'declare @reccount1 numeric(16,0) ' + char(10) + 'select @reccount1=count(*) from ' + @data1 + '..' + @table +char(10)
select @sql =@sql+ 'declare @reccount2 numeric(16,0) ' + char(10) + 'select @reccount2=count(*) from ' + @data2 + '..' + @table +char(10)
select @sql =@sql+ 'if @reccount1<>@reccount2 print ' + char(39)+'此表记录不相等:' +@table+char(39)+'+char(9)+convert(varchar,@reccount1)+char(9)+convert(varchar,@reccount2)'
exec @rtn = sp_executesql @sql
end
deallocate cc
10.到帐套控制台中把新帐套备份,然后恢复到老的帐套中。
11.第4步中导出到d盘的那些 txt 文件不要急于删除,待确认数据无误方可删除。你可以将这些文件剪切到其它目录下也行。