当前位置:网站首页>Oracle数据文件收缩_最佳实践_超简单方法
Oracle数据文件收缩_最佳实践_超简单方法
2022-08-03 05:27:00 【谷凯Jump】
Oracle数据文件收缩_最佳实践_超简单方法
前言
之前翻阅过无数文档,实践证明Oracle高水位降低后,数据文件占用服务器空间不会减小。
只能通过重新建立表空间来实现
如下图,表空间内容大小4.92GB,数据文件却分配了144GB

使用我的SQL,99%可行有效!超级便捷!拼接SQL+执行 两步完成
查询出待执行脚本
--查询出创建新表空间的SQL
select 'CREATE TABLESPACE '|| :MY_TABLE_SPACE ||'_TEMP DATAFILE ' as sql_text from dual
union all
select * from (
select ''''||file_name||'_TEMP'' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED'||
(case when row_number() over(partition by tablespace_name order by file_name desc)=1 then '' else ',' end)
as sql from dba_data_files where tablespace_name=:MY_TABLE_SPACE order by file_name)
union all
select 'LOGGING EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;' as sql_text from dual
union all
--查询出移动表空间的SQL--同时将重建索引的SQL查出
select movs.sql_text||
replace((case when movs.rn>1 then '' else
listagg((case when b.index_name like '%$$%' or b.index_name is null then '' else
'alter index '|| b.table_owner || '.' || b.index_name ||' rebuild;' end),';') within group (order by movs.table_name) end)
,';;',';') as sqltext2
from
(select mov.*,row_number() over (partition by table_name order by seq desc) as rn from
(
select 'alter table ' || owner || '.' || segment_name || ' move tablespace '|| :MY_TABLE_SPACE ||'_TEMP;' sql_text,owner,segment_name,segment_name as table_name,3 as seq from dba_segments where tablespace_name = :MY_TABLE_SPACE and segment_type='TABLE'
union all
select 'alter index ' || owner || '.' || segment_name || ' rebuild tablespace '|| :MY_TABLE_SPACE ||'_TEMP;' sql_text,owner,segment_name,segment_name as table_name,1 as seq from dba_segments where tablespace_name = :MY_TABLE_SPACE and segment_type='INDEX'
union all
select 'alter table ' || owner || '.' || table_name || ' move lob(' || column_name || ') store as(tablespace '|| :MY_TABLE_SPACE ||'_TEMP);' sql_text,owner,column_name as segment_name,table_name,2 as seq from dba_lobs where tablespace_name = :MY_TABLE_SPACE
) mov order by owner,table_name,segment_name,seq
) movs,user_indexes b where movs.owner=b.table_owner(+) and movs.table_name=b.table_name(+)
group by movs.owner,movs.table_name,movs.segment_name,movs.sql_text,movs.rn
union all
--查询出删除原表空间的SQL
select 'DROP tablespace ' || :MY_TABLE_SPACE || ' INCLUDING CONTENTS AND DATAFILES;' as sql_text from dual
union all
--查询出重建原表空间的SQL
select 'CREATE TABLESPACE ' || :MY_TABLE_SPACE || ' DATAFILE ' as sql_text from dual
union all
select sql_text from (
select ''''||file_name||''' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED'||
(case when row_number() over(partition by tablespace_name order by file_name desc)=1 then '' else ',' end)
as sql_text from dba_data_files where tablespace_name=:MY_TABLE_SPACE order by file_name)
union all
select 'LOGGING EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;' as sql_text from dual
union all
--查询出移动回去表空间的SQL--同时将重建索引的SQL查出
select movs.sql_text||
replace((case when movs.rn>1 then '' else
listagg((case when b.index_name like '%$$%' or b.index_name is null then '' else
'alter index '|| b.table_owner || '.' || b.index_name ||' rebuild;' end),';') within group (order by movs.table_name) end)
,';;',';') as sqltext2
from
(select mov.*,row_number() over (partition by table_name order by seq desc) as rn from
(
select 'alter table ' || owner || '.' || segment_name || ' move tablespace '|| :MY_TABLE_SPACE ||';' sql_text,owner,segment_name,segment_name as table_name,3 as seq from dba_segments where tablespace_name = :MY_TABLE_SPACE and segment_type='TABLE'
union all
select 'alter index ' || owner || '.' || segment_name || ' rebuild tablespace '|| :MY_TABLE_SPACE ||';' sql_text,owner,segment_name,segment_name as table_name,1 as seq from dba_segments where tablespace_name = :MY_TABLE_SPACE and segment_type='INDEX'
union all
select 'alter table ' || owner || '.' || table_name || ' move lob(' || column_name || ') store as(tablespace '|| :MY_TABLE_SPACE ||');' sql_text,owner,column_name as segment_name,table_name,2 as seq from dba_lobs where tablespace_name = :MY_TABLE_SPACE
) mov order by owner,table_name,segment_name,seq
) movs,user_indexes b where movs.owner=b.table_owner(+) and movs.table_name=b.table_name(+)
group by movs.owner,movs.table_name,movs.segment_name,movs.sql_text,movs.rn
union all
--查询出删除临时辅助表空间的SQL
select 'DROP tablespace ' || :MY_TABLE_SPACE || '_TEMP INCLUDING CONTENTS AND DATAFILES;' as sql_text from dual开始执行
CREATE TABLESPACE MESDATA_L1_TEMP DATAFILE
'+DATA/mesdb/datafile/mesdata_l1_01.dbf_TEMP' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED,
'+DATA/mesdb/datafile/mesdata_l1_02.dbf_TEMP' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED,
'+DATA/mesdb/datafile/mesdata_l1_03.dbf_TEMP' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED,
'+DATA/mesdb/datafile/mesdata_l1_04.dbf_TEMP' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
LOGGING EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;
alter table MES.XXXXX move lob(SQLTEXT) store as(tablespace MESDATA_L1_TEMP);
alter table MES.XXXXX move tablespace MESDATA_L1_TEMP;alter index MES.I_XXXXX_01 rebuild;alter index MES.I_XXXXX_02 rebuild;alter index MES.PK_XXXXX rebuild;
alter table MES.YYYYY move lob(MAPFILE) store as(tablespace MESDATA_L1_TEMP);
alter table MES.ZZZZZ move lob(XLSBODY) store as(tablespace MESDATA_L1_TEMP);alter index MES.PK_ZZZZZ rebuild;
DROP tablespace MESDATA_L1 INCLUDING CONTENTS AND DATAFILES;
CREATE TABLESPACE MESDATA_L1 DATAFILE
'+DATA/mesdb/datafile/mesdata_l1_01.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED,
'+DATA/mesdb/datafile/mesdata_l1_02.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED,
'+DATA/mesdb/datafile/mesdata_l1_03.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED,
'+DATA/mesdb/datafile/mesdata_l1_04.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
LOGGING EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;
alter table MES.XXXXX move lob(SQLTEXT) store as(tablespace MESDATA_L1);
alter table MES.XXXXX move tablespace MESDATA_L1;alter index MES.I_XXXXX_01 rebuild;alter index MES.I_XXXXX_02 rebuild;alter index MES.PK_XXXXX rebuild;
alter table MES.YYYYY move lob(MAPFILE) store as(tablespace MESDATA_L1);
alter table MES.ZZZZZ move lob(XLSBODY) store as(tablespace MESDATA_L1);alter index MES.PK_ZZZZZ rebuild;
DROP tablespace MESDATA_L1_TEMP INCLUDING CONTENTS AND DATAFILES;后续
如果数据为归档模式的话,移动表空间时会产生归档日志,注意处理一下。
<数据量比较小的话,有些用户会发现datafile是变小了,但是系统空间未变小,是因为有归档产生,则可以通过清理归档来释放>
某些情况下,有index失效的话,通过下面的SQL查询出失效的索引进行rebuild
select index_name,'alter index '|| index_name ||' rebuild;' as to_do_script from user_indexes where status <> 'VALID';如果查询出来的SQL中有BIN$开头的对象,可先使用如下指令清空回收站后再处理。
purge recyclebin ;数据库中不能使用LONG类型,否则会报错;这些表可以先通过删表重建的方式手动处理
ORA-00997: 非法使用 LONG 数据类型边栏推荐
猜你喜欢
随机推荐
树——前序
五、int和Integer有什么区别?
使用ZBrush制作恶魔模型
ZBrush+Substance Designer2021制作高品质3D角色模型全流程!
servlet learning (7) ServletContext
@JsonProperty和JSONField的区别?
servlet学习(七)ServletContext
ZEMAX | 如何使用渐晕系数
./autogen.sh: 4: ./autogen.sh: autoreconf: not found
域名管理常见问题:IP、域名和DNS之间的区别和关系
ZEMAX | 在设计抬头显示器(HUD)时需要使用哪些工具?
MATLAB给多组条形图添加误差棒
二分查找3 - 猜数字大小
大学毕业后,零基础想转行成为一名3D建模师,现在该做什么?
MySql数据格式转成Redis键值对格式
【随笔】平常心
【3D建模制作技巧分享】ZBrush快捷键如何设置
Dynamic adjustment of web theme (2) Extraction
6. What is the difference between Vector, ArrayList and LinkedList?(design, performance, safety)
详解SSL证书的分类以及如何选择合适的证书?









