首页 > 代码库 > oracle 10G 清理垃圾表

oracle 10G 清理垃圾表

一次边学边干的oralce运维经历, 步步是坑啊。

起因: 一套运行了5年的系统, 客户近期反映比较慢。 

了解了一下运行环境: windows2003(16G + 4核) +  jdk(32) +tomcat  和 window2003(4G + 双核) + oracle10G

现场现象: 客户操作出入库单据, ie一片空白持续很长时间, 体验十分糟糕, 用客户的话说: 这一天做单的工作量对得起这份薪水。   

初步判断: tomcat连接数据库时候十分缓慢, 而且tomcat各种cpu,内存显示都比较正常, 所以把问题定位在数据库上, 然后发现数据库端由很多垃圾数据表, 大概4~5w张。

于是开始先删除这些表, 因为自己对oracle也不是很熟悉, 于是就理所当然的想着像sql server一样, drop table搞定。 

select table_name from user_tables where table_name like 'T\_%' escape '\'

首先通过语句查询出表名一共4.5w个。 然后使用文本编辑器, 产生了4.5W个语句格式如下:

DROP TABLE tablename;

使用青蛙执行脚本文件5个小时总算执行完毕, 以为一切ok。 这是客户提醒说他依稀记得, 这样drop表好像还需要执行个语句, 不然表依然在数据库。 

听后比较愕然, 度娘下, 结果真是。 表被drop 以后, 其实只是放到了一个叫垃圾箱的地方, 还要做垃圾回收。 再度娘下:

4.5w个表名转换了语句:

PURGE TABLE  tablename;

或者drop的时候使用

DROP TABLE tablename PURGE;

使用青蛙执行脚本文件20个小时语句执行2.7w, oralce直接宕机了。  这时候发现硬盘满了。 

这时候客户想看看是什么占用空间比较大, 删除了这么多表 , 依然这么大的空间。很不正常。

select * from dba_tablespaces;
发现一个叫UNDOTBS01 的表空间99%的使用率, 占用33G。

于是又问度娘, 度娘说:

这个表空间是:回滚表空间,用来存放撤消操作的记录

我勒个去, 真是涨姿势了, 以前最多也就是oralce里面写个兼容oralce的语句, 还真的没有搞过这种运维的工作的。那个汗啊~~~~~~~~~, 不过幸好有度娘@#@#¥@

分析下这个原因, 硬盘满了, 这个表空间无法增长了, 已经无法执行其他操作了。 慢、宕机也就很正常了。

--create undo tablespace undotBS2 datafile 'C:\UNDOTBS1.DBF' size 100m;
--alter system set undo_tablespace=undotBS2;
--drop tablespace undotbs1 including contents;


执行这些语句, 重启oralce实例。 然后执行
select * from dba_tablespaces;
发现UNDOTBS2 生效, 占100M。

这时候, oralce操作明显变快了。登陆系统、做业务也明显速度提升。 

总结:

oralce清理表, 需要加PURGE参数方可生效, 否则只是放到垃圾回收站: 

DROP TABLE tablename PURGE;

回滚表也需要适时清理,虽然可以自增长, 但是这个表空间过大, 影响oralce的运行效率:

--create undo tablespace undotBS2 datafile 'C:\UNDOTBS1.DBF' size 100m;
--alter system set undo_tablespace=undotBS2;
--drop tablespace undotbs1 including contents;



oracle 10G 清理垃圾表