以CMS的t_cms_send_content_log举例:
CMS_DATA表空间默认空闲:1015.0625
插入1W条数据之后,CMS_DATA空闲:1011.875,空间被占用:3.1875
1.采用delete操作删除表记录:
delete from t_cms_send_content_log;
commit;
delete之后,表空间占用大小无变化,数据未释放
空间无变化,CMS_DATA空闲:1011.875,空间仍然被占用:3.1875
2.采用truncate table 操作删除表记录:
Truncate table t_cms_send_content_log;
Truncate之后,表空间CMS_DATA 被释放,回复空闲到默认:1015.0625
3.进行表空间碎片整理
ALTER TABLESPACE CMS_DATA COALESCE;
ALTER TABLESPACE CMS_INDX COALESCE;
碎片整理之后,表空间占用没有变化
3.创建新的CMS_DATA_1、CMS_INDX_1表空间和原有表空间相同大小,将该表切换到新表空间,再切换回来。
(1)赋予CMS的dba操作权限:
(2)切换表所属空间,到新建表空间:
alter table t_cms_send_content_log move tablespace CMS_DATA_1;
执行:
select tablespace_name,sum(bytes)/1024/1024 from dba_free_space
group by tablespace_name
CMS_DATA 目前空闲:1014.875,3.0的空间被释放。
CMS_DATA_1 空闲:1023.9375
(3)恢复到原有表空间:
alter table t_cms_send_content_log move tablespace CMS_DATA;
CMS_DATA 目前空闲:1014.8125,约3.0的空间被释放。
CMS_DATA_1 空闲:1023.9375
(4)重建索引
查看unusable 状态的索引,
select * from user_indexes where status = 'UNUSABLE';
重建查询结果中的索引
Alter index 索引名称 rebuild
Alter index 索引名称 UNUSABLE --索引重置为不可用
结论:
1. 对无用日志表,全表删除记录时。建议采用truncate table进行操作。表空间可以得到即时释放。
2. 定期做表空间碎片整理
3. 通过切换表空间delete数据可以得到释放。
记录删除后,表空间依然没有释放,不能重用!
以下SQL命令可以释放删除后的空间:
truncate table tabname;
alter table tabname move tablespace tbsname;
alter index indname rebuild on tablespace tbsname;
或者exp后在imp
create table tnamenew as select * from tnameold;
truncate table tnameold;
insert into tnameold (select * from tnamenew);
CMS_DATA表空间默认空闲:1015.0625
插入1W条数据之后,CMS_DATA空闲:1011.875,空间被占用:3.1875
1.采用delete操作删除表记录:
delete from t_cms_send_content_log;
commit;
delete之后,表空间占用大小无变化,数据未释放
空间无变化,CMS_DATA空闲:1011.875,空间仍然被占用:3.1875
2.采用truncate table 操作删除表记录:
Truncate table t_cms_send_content_log;
Truncate之后,表空间CMS_DATA 被释放,回复空闲到默认:1015.0625
3.进行表空间碎片整理
ALTER TABLESPACE CMS_DATA COALESCE;
ALTER TABLESPACE CMS_INDX COALESCE;
碎片整理之后,表空间占用没有变化
3.创建新的CMS_DATA_1、CMS_INDX_1表空间和原有表空间相同大小,将该表切换到新表空间,再切换回来。
(1)赋予CMS的dba操作权限:
(2)切换表所属空间,到新建表空间:
alter table t_cms_send_content_log move tablespace CMS_DATA_1;
执行:
select tablespace_name,sum(bytes)/1024/1024 from dba_free_space
group by tablespace_name
CMS_DATA 目前空闲:1014.875,3.0的空间被释放。
CMS_DATA_1 空闲:1023.9375
(3)恢复到原有表空间:
alter table t_cms_send_content_log move tablespace CMS_DATA;
CMS_DATA 目前空闲:1014.8125,约3.0的空间被释放。
CMS_DATA_1 空闲:1023.9375
(4)重建索引
查看unusable 状态的索引,
select * from user_indexes where status = 'UNUSABLE';
重建查询结果中的索引
Alter index 索引名称 rebuild
Alter index 索引名称 UNUSABLE --索引重置为不可用
结论:
1. 对无用日志表,全表删除记录时。建议采用truncate table进行操作。表空间可以得到即时释放。
2. 定期做表空间碎片整理
3. 通过切换表空间delete数据可以得到释放。
记录删除后,表空间依然没有释放,不能重用!
以下SQL命令可以释放删除后的空间:
truncate table tabname;
alter table tabname move tablespace tbsname;
alter index indname rebuild on tablespace tbsname;
或者exp后在imp
create table tnamenew as select * from tnameold;
truncate table tnameold;
insert into tnameold (select * from tnamenew);