项目的数据过多的占用系统表空间后会造成系统的效率降低,影响系统 的性能。如果数据库对象占用系统表空间过大就需要移动该对象到指定的项目数据表空间。可以在不运行emp或者imp程序的情况下移动一个非分区表。移动非分区表时可以修改表的存储参数,这被用于移动一个表从一个表空间到另一个表空间或者重组表以消除数据行的迁移。
当一个非分区表被重组时表的结构被保存但是该表上的所有的索引都失效必须重建索引,尤其是primary key index。
一、移动占用system表空间容量过大的数据库对象(表段)
1、排查占用system表空间的数据库对象时首先确定当期登录用户拥有的数据库对象所存储的表空间是否是system表空间。在数据库中占用磁盘空间的最直接对象就是segment,因此判断数据库占用磁盘空间的大小实际上就是判断存储该数据库对象的segment中包含的extents的个数,extents是oracle分配磁盘空间的最小单位。oracel为避免使用数据库分配空间过程中频繁的调用递归算法降低系统的 效率,故设置分配磁盘空间的最小单位是extents。dba_segments数据字典中存储了segment的分配信息。
select segment_name,segment_type,tablespace_name from dba_segments where owner='USER_NAME';
判断当前登录用户拥有的DB对象存储的表空间是否是system
一般查询出的segment对象的type为table或者index最为常见
2、如果要移动表必须确定该表上的所有的索引,包含主键的唯一索引和建立在其他列上的索引
select index_name,table_name,tablespace_name,status from dba_indexes where owner='USER_NAME' and table_name='TARGET_TABLE_NAME';
获得目标表上的所有索引,判断其tablespace和status。
3、从系统表空间中移动目标表到指定的项目表空间
alter table schema.table_name
move tablespace tablespace_name
4、确定目标表已经移动到目标表空间
select segment_name,segment_type,tablespace_name from dba_segments where owner='USER_NAME';
确定移动后目标表是否有效
select object_name,object_type,status from dba_objects where owner='USERNAME';
移动目标表后建立在该目标表上的索引可能会失效status变为unused
5、从dba_indexes中查看索引的状态是否有效
select index_name,table_name,tablespace_name,status from dba_indexes where owner='USER_NAME' and table_name='TARGET_TABLE_NAME';
status状态变为unused
6、重建index并且移动index到指定的项目表空间
alter index schema.index_name rebuild
tablespace tablespace_name;
7、确定移动后的index是否有效
select index_name,table_name,tablespace_name,status from dba_indexes where table_name='TARGET_TABLE_NAME' and owner='USERNAME';
注:index关联到表,dba_indexes中关联到目标表的index,查询时可以由table关联需要移动的index。移动目标表然后移动该表上建立的索引完成移动system表空间中占据空间较大的DB对象。