数据库修复常用语句

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个

红包金额最低5元

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

抵扣说明:

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

余额充值