1.重建数据库索引,执行成功会显示查询已成功执行
DECLARE @tUseTable TABLE(iSno INT IDENTITY(1,1),
cTableName VARCHAR(256))
--取出用户表
INSERT INTO @tUseTable
(cTableName)
SELECT Ts.[name]
FROM sysobjects AS Ts
WHERE Ts.xtype='U'
DECLARE @iCurSno INT
DECLARE @iCount INT
SELECT @iCount=COUNT(*)
FROM @tUseTable AS Tu
SET @iCurSno=1
DECLARE @cSQL NVARCHAR(2000)
DECLARE @cName VARCHAR(256)
WHILE @iCurSno<=@iCount
BEGIN
--取出表名
SELECT @cName=Tu.cTableName
FROM @tUseTable AS Tu
WHERE Tu.iSno=@iCurSno
PRINT @cName
SET @cSQL='DBCC DBREINDEX ('''+@cName+''', '''', 0)'
EXEC sp_executesql @cSQL
SET @iCurSno=@iCurSno+1
END
SELECT Tu.cTableName FROM @tUseTable AS Tu
2.DBCC数据库表,必须退出所有程序,包括客户端的程序,重启数据库服务,才能执行,执行的时候有5个DBCC,要分别注释,整体执行,每次1个,有错误只要不是数据库正在被使用就继续执行,正在被使用就是有东西在访问数据库,重复上面退出的过程
)
set @dbname = 'dbi_client'--要修复的数据库名称
EXEC sp_dboption @dbname, 'single user', 'true'
--DBCC UPDATEUSAGE (@dbname)
--DBCC CHECKALLOC (@dbname,REPAIR_ALLOW_DATA_LOSS)
--DBCC CHECKCATALOG (@dbname)
DBCC CHECKDB(@dbname,REPAIR_REBUILD)
--DBCC CHECKDB(@dbname,REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS
/*
USE T8_Member60--要修复的数据库名称
exec sp_msforeachtable 'DBCC CHECKTABLE(''?'',REPAIR_ALLOW_DATA_LOSS)'
exec sp_msforeachtable 'DBCC DBREINDEX(''?'')'
exec sp_msforeachtable 'DBCC CHECKCONSTRAINTS(''?'')'
--*/
USE MASTER
EXEC sp_dboption @dbname, 'single user', 'false'
go
3.严重损坏实际就是指定表损坏
1.1.先确定哪个表损坏 重建索引的时候会提示
在报错之后最后一行停止的表,就是损坏的表,例如TCF_ss
2.确认DBCC+重建索引仍不能修复后,尝试导出重新创建
在数据库表上右键编写脚本,导出创建表的命令,保存
然后 select * into tcf_ss1 from tcf_ss(这句如果报错,直接修复的可能性就不大了)
之后在tcf_ss表上右键删除tcf_ss表,再执行建表命令
之后insert into tcf_ss
select * from tcf_ss1;
最后再执行重建索引,还有表错误,反复执行上述过程直到不报错为止再运行一遍DBCC
4.SQL2000置疑处理流程
--例如:tcgem是置疑数据库名,首先找到数据库所在目录tcgem.mdf文件,进行备份
--操作步骤:
--1.在sql server企业管理器下,新建一个数据库名如:newdb
--2.停止sql server服务,找到新建newdb数据库文件目录,删除新库newdb_log.ldf文件
--3.将tcgem.mdf重命名为newdb.mdf文件,将此文件覆盖新建newdb.mdf
--4.启动sql server服务,此时新建数据库newdb的状态为“置疑”
--5.执行下面sql,逐条进行操作
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
update sysdatabases set status=-32768 where dbid=DB_ID('newdb')
--6.重建newdb数据库log文件,下面sql中newdb数据库的路径要设置正确
dbcc rebuild_log('newdb','C:\Program Files\Microsoft SQL Server\MSSQL\Data\newdb_log.ldf')
--7.dbcc检查
sp_dboption 'newdb', 'single user', 'true'
Go
--dbcc checkdb('newdb')
--8.设置数据库为正常状态
update sysdatabases set status =28 where name='newdb'
Go
--9.不允许对系统目录直接修改
sp_configure 'allow updates',0
go
reconfigure with override
go
sp_dboption 'newdb','dbo use only','false'
go
--10.修复成功后,建议用<修复坏的数据库sql>和<重建索引sql>进行修复
--11.修复完成后,在sql server企业管理器下备份newdb数据库,删除原置疑tcgem数据库
--11.将备份的newdb数据库文件,还原到sql server中,还原数据库库可命名为tcgem
6.sql server 2005(2008)数据库置疑处理方法
---打开sql server查询分析器,把下面sql语句中 dbname 换为要修复的库名,如:tcgem6
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
alter database tcgem6 set emergency
go
alter database tcgem6 set single_user
go
dbcc checkdb('tcgem6',REPAIR_ALLOW_DATA_LOSS)
go
alter database tcgem6 set multi_user
go
alter database tcgem6 set online
go
SQL2008R2无日志附加数据库方法
第一步:先建立一个同名数据库,停止SQL SERVER2008服务,将原来的.mdf数据库文件覆盖刚新建的.mdf数据库文件,重新启动数据库
第二步:查询分析器执行,
alter database NEWDBNAME set emergency
declare @databasename varchar(255)
set @databasename='NEWDBNAME'
exec sp_dboption @databasename, N'single', N'true'dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS) --将目标数据库置为单用户状态dbcc checkdb(@databasename,REPAIR_REBUILD)
exec sp_dboption @databasename, N'single', N'false'
第三步:以上代码请同时运行,可能会出现“数据库其他多个文件与数据库主文件不匹配....”错误,请多次重试执行以上代码 。
SQL2008R2清空数据库LDF日志文件方法
1.对应库执行p_shrinklog.sql存储过程
2.然后对应库执行 exec p_shrinklog ‘数据库名’
如图提示就直接收缩掉了,时间看LDF大小,一般200G的需要3秒左右
10-08
15万+
09-12
36万+
07-04
2341
08-30
1286