首页 > 代码库 > 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;
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 清理垃圾表