一、 数据库置疑修复:
--1、使用对应版本的数据库安装程序,安装与客户数据库同名的数据库,依次执行如下语句:
use master
go
sp_configure 'allow', 1
go
reconfigure with override
go
/* 设置数据库状态为紧急模式*/
update sysdatabases set status = 32768 where name = 'cspos_v6'
/*SQL2005或者SQL2008设置数据库状态为紧急模式*/
ALTER database cspos_v6 SET EMERGENCY
go
--2、停止sql server服务,删除log文件,用客户损坏的数据文件覆盖原数据文件,开启sql server服务,依次实现如下语句:
--可修改数据库日志文件的生产目录,最好是与数据文件一致;
DBCC REBUILD_LOG ('cspos_v6', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\cspos_v6_Log.LDF' )
go
/* SQL2000 设置数据库状态为正常模式*/
update sysdatabases set status = 0 where name = 'cspos_v6'
/*SQL2005或者SQL2008设置数据库状态为正常模式*/
ALTER database cspos_v6 SET online
go
sp_configure 'allow', 0
reconfigure with override
go
USE master
go
SP_configure 'allow update',1
go
RECONFIGURE WITH OVERRIDE
go
update sysdatabases set status=-32768 where name='byposv5'
--数据库名称
go
dbcc rebuild_log('byposv5','D:\bydata\byposv5_rebuild_log') --重新建立日志
Go
update sysdatabases set status=26 where name='byposv5'
Go
Sp_configure 'allow update',0
Go
Reconfigure with override
GO
/*
说明:
此语法为商贸通V5数据库置疑修复语法。
如果是其它版本的数据库则需要把语法中相应的数据库名称改掉即可.
操作此语法时 软件前台、后台需要全部退出执行。
以上语法最好一条一条分别执行,如有疑问请与我们电话联系。
*/
二、 数据库损坏修复
USE master
Go
--单用户模式
EXEC sp_dboption 'cspos_v6', 'single user', 'TRUE'
go
--如果返回结果出现了红色的提示文字,说明数据库中存在错误,需要修复,可进行多次交叉修复
DBCC CHECKDB ('cspos_v6',repair_fast) --快速修复
DBCC CHECKDB ('cspos_v6',repair_rebuild) --一般修复
DBCC CHECKDB ('cspos_v6',repair_allow_data_loss) --高级修复
Go
--再次数据库检查,如果返回结果中没有了红色的提示文字,说明修复成功;
DBCC CHECKDB ('cspos_v6')
Go
--退出前请执行以下语句返回到多用户模式
EXEC sp_dboption 'cspos_v6', 'single user','FALSE'
Go
三、BCP数据的导入导出
--注意:BCP的前提是新数据库必须与原损坏的数据库 结构必须一致(表明与字段必须一致,如不一致会导致对应数据表无法导入)
--以锐捷商通V6数据库为例进行,需要处理其他数据库问题,将cspos_v6修改为其他对应的数据库名称即可
--在使用前,指定服务器名称
--1.首先在D盘建立TESTDB目录,并在查询分析器中选择锐捷商通数据库运行:(-U 接用户名,-P 对应用户的密码 -S 对应的服务器名)
use cspos_v6
select 'bcp cspos_v6..'+name + ' out '+'d:\testdb\'+name+'.txt -c -Usa -S服务器名小写 -P' FROM SYSOBJECTS WHERE TYPE = 'U'
ORDER BY NAME
--把查询的结果集全部复制下来,新建一个文本文件取名为“导出.bat”把结果集复制进去并保存,把该文件存放在d盘目录下。
--2.在查询分析器中选择锐捷商通数据库运行:
use cspos_v6
select 'bcp cspos_v6..'+name + ' IN '+'d:\testdb\'+name+'.txt -c -Usa -S服务器名小写 -P ' FROM SYSOBJECTS WHERE TYPE = 'U'
ORDER BY NAME
--把查询的结果集全部复制下来,新建一个文本文件取名为“导入.bat”把结果集复制进去并保存,把该文件存放在d盘目录下。
--3.运行“导出.bat”(注意:该文件双击即可运行),数据库中的数据会倒出到TESTDB目录中。
--4.删除原来的问题数据库,使用软件的数据库安装程序,重新建立新的数据库。
--5.在查询分析器中选择锐捷商通数据库运行:
/*由于不写入删除记录,所以当数据较大时,使用 truncate table 速度快*/
use cspos_v6
select 'truncate table '+name FROM SYSOBJECTS WHERE TYPE = 'U'
--然后把返回的结果集复制,新建一个查询分析器窗口,把复制的内容粘贴下运行!
--6.最后运行“导入.bat” ,导入成功后就恢复数据库了!
四、数据库修复技巧
--当数据库较大时,每次修复时间会比较久,可在检查数据库时记录下出错的表名,针对单个数据表进行修复;
--修复表错误语句,替换表名为需要修复的数据表名
DBCC CHECKTABLE(table_name, REPAIR_REBUILD )
DBCC CHECKTABLE(table_name, repair_allow_data_loss )
--重建表索引
DBCC DBREINDEX(table_name)
--以下是重建制定数据库所有表索引的语句
use cspos_v6--数据库名请根据修复的数据库进行跟换。
go
declare @tablename varchar(100)
declare test_cur cursor for
select name from sysobjects
where type ='U'
open test_cur
fetch test_cur into @tablename
while @@fetch_status=0
begin
DBCC DBREINDEX (@tablename)
fetch test_cur into @tablename
end
close test_cur
deallocate test_cur
go
--如果数据库修复过程中出现表主键(或唯一索引)损坏,反复执行修复语句仍然报错,需要手工将
该表的主键删除掉,然后删除重复的数据后,重建主键(或唯一索引)
五、数据库修复需要注意的问题
--1、修复完数据库之后,需要对有identity列的数据表进identity列的修复,以免出现客户不能正常销售的情况:
--语法:
DBCC CHECKIDENT(table_name,RESEED)
--针对软件中存在自动增长列的情况下 , 直接执行如下语句即可,需要指定数据库名称
--修复自动增长列identity语句:
use cspos_v6 --数据库名请根据修复的数据库进行跟换。
go
declare @tablename varchar(100)
declare test_cur cursor for
select object_name(id) from syscolumns
where status=128
open test_cur
fetch test_cur into @tablename
while @@fetch_status=0
begin
DBCC CHECKIDENT (@tablename, RESEED)
fetch test_cur into @tablename
end
close test_cur
deallocate test_cur
go
--2、修复完自增列之后,首先备份数据库,保证客户的数据库环境;
--3、按照原来客户的版本升级客户数据库,以修复损坏的存储过程和触发器;
--4、对数据库的进行测试,前台销售、批发单据、批发单据,以及档案的查询等
--5、没有问题后,将修复好的数据库发给客户。
六、数据库损坏的原因:
1.错误的删除日志;
2.硬件(HD)损坏(HD 出现逻辑坏道 或者 物理坏道) , 造成日志和数据文件写错误;
3.硬盘的空间不够,比如日志文件过大;
4.病毒原因;
5.非法关机;