数据库经常会由于规划不好或者一些其他原因导致用户的表建在system表空间的情况,这样会导致system表空间急剧膨胀而且无法缩小,并引发性能上的问题。因此建议对客户的所有数据库进行检查,并把数据表都挪到别的表空间。已经膨胀很大的system表空间的客户,建议重做数据库,并检查代码创建表的时候必须建在指定的表空间下。这样的好处是以后可以统一管理数据库表空间,并可以对数据库索引进行重建,以后也可以按类似的方法定期重建数据库索引,具体操作步骤如下:
1. 在做调整之前,一定要做完整的数据库备份。
2. 登陆系统所使用用户,用下面的语句检查数据库表所使用的表空间:
select*from user_all_tables;
tablespace_name列显示的是所使用的表空间的名称
3. 筛选出使用system表空间的表名
select*from user_all_tables wheretablespace_name =’SYSTEM’;
4. 复制table_name列到UltraEdit,使用列编辑模式,编辑命名,保存成sql脚本
然后切换至列模式
选中整列,编辑命令alter table tablename move tablespace tablespacename;
另存为1.sql
5. 用语句检查索引使用的表空间;
select index_name,table_owner,table_name,tablespace_name from user_indexes;
tablespace_name列显示的是所使用的表空间的名称
6. 参照第3步,复制index_name列UltraEdit,使用列编辑模式,编辑命名,保存成sql脚本
alter index inde_name rebuild tablespace tablespace_name;
7. 使用sqlplus登陆oracle数据库,按顺序执行脚本
C:\>sqlplususername/password@SID
SQLPLUS>@d:\1.sql
小机环境类似,使用oracle安装用户登陆,将脚本文件复制到/home/oracle目录
#/home/oracle>sqlplus username/password@SID
SQLPLUS>@1.sql
注:脚本文件过大,可能存在上万行,所以不建议在plsql中执行,可能会没响应。
8. 再次检查表使用的表空间,索引使用的表空间;
select*from user_all_tables;
select index_name,table_owner,table_name,tablespace_name from user_indexes;
9. 遇到有使用clob等大对象的表,由于索引的rebuil语句无法执行,可以先将原表更名,创建新表指定表空间,将原有数据导入新表,删除旧表;
alter table tablenameArename tablenameB;
create table tablenameA tablespace tablespacename as select * fromtablenameB;
drop table tablenameB;