1、数据库膨胀处理方法一、收缩处理1.备份数据库。无疑安全保障总是第一位2.用 sa 登录查询分析器,dbcc checkdb ( 数据库名)。检查是否存在错误,存在错误则先修复数据库-设置为单一用户sp_dboption 数据库名,single, true -修复数据库dbcc checkdb(数据库名, REPAIR_ALLOW_DATA_LOSS)再次检查错误 dbcc checkdb (数据库名),若仍存在错误,则再次修复 dbcc checkdb(数据库名, REPAIR_ALLOW_DATA_LOSS),反复修复几次。若仍有无法修复的错误,转用下面的单表修复-设置回多用户sp_dbop
2、tion 数据库名,single, false -单表修复Dbcc checktable(表名) 或 dbcc checktable(表 ID 号码)若仍存在错误,再进行有损表修复Dbcc checktable(表名, REPAIR_ALLOW_DATA_LOSS) 或 dbcc checktable(表 ID 号码 , REPAIR_ALLOW_DATA_LOSS)3.收缩数据库清空日志DUMP TRANSACTION 数据库名 WITH NO_LOG截断日志BACKUP LOG 数据库名 WITH NO_LOG收缩数据库DBCC shrinkdatabase(数据库名)4.sa 登录指定数
3、据库,创建两存储过程dbo.sp_SOS -检索各表占用空间大小dbo.sp_defragment_indexes -重建索引5.执行 sp_SOS,检查各表大小,截图如下:6.仔细查看未使用空间 Unused(MB)和索引占用空间 Index(MB)较大的表。对这些表做如下分析操作:是否有主键。若无主键,则增加一列 ID(int 型) ,设置为标识列自动增长,并设置该列为主键是否存在 20 字节以上的 char 类型字段。若存在,则改成 varchar 类型检查索引列是否有允许 NULL 的列。若存在,则改成不允许 NULL检查索引列是否在不同的混合索引中存在共同的列。若存在,则修改索引将公
4、用的列单独建成一个索引,或多个字段合在一起建一个大混合索引注:妙手中 TJ_JYJGB,TJ_JKLOG,TJ_PACSJGB 表是接口相关表,未设置主键,数据量大,按说明添加主键。TJ_JKLOG该表已无实际作用,可直接 TRUNCATE TABLE TJ_JKLOGTJ_JYJGB检验数据中间表,若确认检验数据可以重新发送,可直接 TRUNCATE TABLE TJ_JYJGB,不能确认,则建议 DELTE TJ_JYJGB WHERE SHRQ 20 的字段及表select object_name(id) as 表名,* from syscolumns where xtype=175 a
5、nd length 20 and id in (select id from sysobjects where type=U)order by 表名-查找有索引,有数据的表select a.name as 表名, b.name as 索引名 from sysobjects a, sysindexes bwhere a.type = U and a.id = b.id and b.indid 0 and b.indid 0order by 表名7.数据库重建索引-执行sp_defragment_indexes 90简述:重建索引根据 dbcc showcontig 各表,检索各表的索引碎片,参数
6、 90 为扫描密度,即扫描密度在 90%以下的都进行索引重建。详细说明请查看 sp_defragment_indexes 备注及 SQL 相关帮助。8.再次执行 sp_SOS,检查各表大小,若仍存在索引占用空间 Index(MB)较大的表,则进入企业管理器进行手工清除/重建聚簇索引动作。如下图:二、添加作业任务自动重建索引新建作业取消聚簇索引勾勾后,关闭保存,再次进入勾选上保存。命名为 DBreindex,所有者为 sa步骤、新建步骤名:随意,因为只有一个步骤数据库:选中体检数据库命令:exec sp_defragment_indexes 70 即执行重建索引存储过程,参数给 70 即可转入高级页面设置输出文件:路径放置在数据库文件目录,命名为 dbreindex_log之后确定进入下一步。调度、新建调度反复出现、更改,默认每周一次、星期日、零点执行,频率每周一次即可,具体时间可根据实际情况调整。确定、确定、确定完成。