美文网首页oracle
ORACLE 釋放表及其表空間測試

ORACLE 釋放表及其表空間測試

作者: 轻飘飘D | 来源:发表于2020-11-16 15:23 被阅读0次

1.準備--表空間使用率視圖創建

SQL>
 grant select on dba_free_space to test;
 grant select on dba_data_files to test;
 grant select on v_$temp_extent_pool to test;
 grant select on v_$temp_space_header to test;
 grant select on dba_temp_files to test;


create or replace view v_xag_tablespace_stat as
select tablespace_type,tablespace_name,autoext
       ,max_mb,used_mb,round(100 * used_mb / max_mb) pct_used
from
(
 select 'USER' as tablespace_type,a.tablespace_name as tablespace_name,autoext
       ,a.bytes_alloc - nvl(b.bytes_free, 0) as used_mb
       ,a.maxbytes as max_mb
 from
 (
   select f.tablespace_name,f.autoextensible as autoext
          ,trunc(sum(f.bytes)/power(2,20)) as bytes_alloc
          ,trunc(sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes))/power(2,20)) as  maxbytes
   from dba_data_files f
   group by tablespace_name,autoextensible
 ) a left join
 (
   select f.tablespace_name,trunc(sum(f.bytes)/power(2,20)) as bytes_free
   from dba_free_space f
   group by tablespace_name
 ) b on (a.tablespace_name=b.tablespace_name)
 union all
 select 'TEMP' as tablespace_type,h.tablespace_name as tablespace_name,f.autoextensible as autoext
       ,trunc(sum(nvl(p.bytes_used, 0)) / power(2, 20)) used_mb
       ,trunc(sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes))/power(2, 20)) max_mb
 from v$temp_space_header h left join v$temp_extent_pool p on(p.file_id=h.file_id and p.tablespace_name=h.tablespace_name)
     join dba_temp_files f on(f.file_id = h.file_id and f.tablespace_name = h.tablespace_name)
 group by h.tablespace_name,autoextensible
);

2.創建測試用途的表空間

--drop tablespace sp1 including contents and datafiles;

create tablespace sp1 datafile 
'/u02/oradata/MPCDB/MPTEST/sp1.dbf' size 32M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED
extent management local segment space management auto;

create tablespace i_sp1 datafile 
'/u02/oradata/MPCDB/MPTEST/i_sp1.dbf' size 16M AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
extent management local segment space management auto;

create tablespace sp2 datafile 
'/u02/oradata/MPCDB/MPTEST/sp2.dbf' size 32M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED
extent management local segment space management auto;

create tablespace i_sp2 datafile 
'/u02/oradata/MPCDB/MPTEST/i_sp2.dbf' size 16M AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
extent management local segment space management auto;

create tablespace sp3 datafile 
'/u02/oradata/MPCDB/MPTEST/sp3.dbf' size 32M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED
extent management local segment space management auto;

create tablespace i_sp3 datafile 
'/u02/oradata/MPCDB/MPTEST/i_sp3.dbf' size 16M AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
extent management local segment space management auto;

3.檢查表空間使用率

[oracle@DB01 ~]$ sql TEST/123456@127.0.0.1:1521/MPTEST

SQL> SET SQLFORMAT ansiconsole

SQL> select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','I_SP1','I_SP2','I_SP3') order by 2;
-----------------------------------------------------------------------------------------------------
TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   1        0         
USER             I_SP2            YES      32767   1        0         
USER             I_SP3            YES      32767   1        0         
USER             SP1              YES      32767   1        0         
USER             SP2              YES      32767   1        0         
USER             SP3              YES      32767   1        0 

4.創建測試表

create table tb1 tablespace sp1
as 
select rownum row_no,rpad('M',9,'A') || rownum ca,rpad('M',9,'B') cb,rpad('M',9,'C') cc from dual 
connect by level<=300000;

alter table tb1 add constraint pk_tb1 
primary key(row_no) using index tablespace i_sp1;

create index idx_tb1_01 on tb1(ca) tablespace i_sp1;

#用上面同樣方法創建 tb2、tb3 表

5.檢查空間使用情況

SQL> select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','I_SP1','I_SP2','I_SP3') order by 2;
TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   16       0         
USER             I_SP2            YES      32767   16       0         
USER             I_SP3            YES      32767   16       0         
USER             SP1              YES      32767   17       0         
USER             SP2              YES      32767   17       0         
USER             SP3              YES      32767   17       0  

--查看一个表所占的空间大小   
SQL> SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.segment_name,u.segment_type FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME like '%TB%' order by 3,2;
TABLE_SIZE  SEGMENT_NAME  SEGMENT_TYPE  
9MB         IDX_TB1_01    INDEX         
9MB         IDX_TB2_01    INDEX         
9MB         IDX_TB3_01    INDEX         
6MB         PK_TB1        INDEX         
6MB         PK_TB2        INDEX         
6MB         PK_TB3        INDEX         
16MB        TB1           TABLE         
16MB        TB2           TABLE         
16MB        TB3           TABLE   

6.刪除一半數據

delete from tb1 t where mod(row_no,2)=0; --刪除偶數
delete from tb2 t where mod(row_no,2)=0; --刪除偶數
delete from tb3 t where mod(row_no,2)=0; --刪除偶數
commit;

7.再次空間檢查(發現空間未見減少)

SQL> select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','I_SP1','I_SP2','I_SP3') order by 2;
TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   16       0         
USER             I_SP2            YES      32767   16       0         
USER             I_SP3            YES      32767   16       0         
USER             SP1              YES      32767   17       0         
USER             SP2              YES      32767   17       0         
USER             SP3              YES      32767   17       0  

--查看一个表所占的空间大小   
SQL> SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.segment_name,u.segment_type FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME like '%TB%' order by 3,2;
TABLE_SIZE  SEGMENT_NAME  SEGMENT_TYPE  
9MB         IDX_TB1_01    INDEX         
9MB         IDX_TB2_01    INDEX         
9MB         IDX_TB3_01    INDEX         
6MB         PK_TB1        INDEX         
6MB         PK_TB2        INDEX         
6MB         PK_TB3        INDEX         
16MB        TB1           TABLE         
16MB        TB2           TABLE         
16MB        TB3           TABLE   

--檢查方法3
SELECT A.TABLESPACE_NAME,      
       FILENUM,   
       TOTAL "TOTAL (MB)",  
       F.FREE "FREE (MB)",
       TO_CHAR(ROUND(FREE * 100 / TOTAL, 2), '990.00') "FREE%", 
       TO_CHAR(ROUND((TOTAL - FREE) * 100 / TOTAL, 2), '990.00') "USED%",    
       ROUND(MAXSIZES, 2) "MAX (MB)"
  FROM (SELECT TABLESPACE_NAME,          
               COUNT(FILE_ID) FILENUM,        
               SUM(BYTES / (1024 * 1024)) TOTAL,          
               SUM(MAXBYTES) / 1024 / 1024 MAXSIZES      
          FROM DBA_DATA_FILES       
         GROUP BY TABLESPACE_NAME) A,     
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / (1024 * 1024))) FREE     
          FROM DBA_FREE_SPACE      
         GROUP BY TABLESPACE_NAME) F
 WHERE A.TABLESPACE_NAME = F.TABLESPACE_NAME
 and A.TABLESPACE_NAME like '%SP%'
 order by 1;
------------------------------------------
TABLESPACE_NAME  FILENUM  TOTAL (MB)  FREE (MB)  FREE%    USED%    MAX (MB)  
SP1              1        32          15           46.88    53.13  32767.98  
SP2              1        32          15           46.88    53.13  32767.98  
SP3              1        32          15           46.88    53.13  32767.98 

8.分析表(空間未見減少)

analyze table tb1 compute statistics; 
or
analyze table tb1 compute statistics for table for all indexes for all indexed columns;

說明:
analyze table my_table compute statistics;  
等价于:
analyze table my_table compute statistics for table for all indexes for all columns;

SQL> 
SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.segment_name,u.segment_type FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME like '%TB%' order by 3,2;
TABLE_SIZE  SEGMENT_NAME  SEGMENT_TYPE  
9MB         IDX_TB1_01    INDEX         
9MB         IDX_TB2_01    INDEX         
9MB         IDX_TB3_01    INDEX         
6MB         PK_TB1        INDEX         
6MB         PK_TB2        INDEX         
6MB         PK_TB3        INDEX         
16MB        TB1           TABLE         
16MB        TB2           TABLE         
16MB        TB3           TABLE   

9.move (降低高水位) --案例1

优点:可以移动表到其他表空间,
在执行命令时 不需要执行alter table table_name enable row movement

缺点:表move 会导致表中的索引失效,要rebuild;同时表会产生行级锁;
在此如果表中有LOB字段 时要用一下命令来实现表空间移动:
alter table owner.table_name move tablespace tablespace_name lob (lob_column) store as lob segment  tablespace tablespace_name;
也可以单独move lob,index要rebuild

--不move到新空間
SQL> alter table tb1 move;

SQL> select index_name,table_name,tablespace_name,index_type,status  from dba_indexes  where table_owner='TEST' and status!='VALID';
INDEX_NAME  TABLE_NAME  TABLESPACE_NAME  INDEX_TYPE  STATUS    
PK_TB1      TB1         I_SP1            NORMAL      UNUSABLE  
IDX_TB1_01  TB1         I_SP1            NORMAL      UNUSABLE  

SQL> alter index PK_TB1 rebuild;
SQL> alter index IDX_TB1_01 rebuild;

SQL> select index_name,table_name,tablespace_name,index_type,status  from dba_indexes  where table_owner='TEST' and status!='VALID';

10.空間檢查(發現空間減少)

SQL> select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','I_SP1','I_SP2','I_SP3') order by 2;

TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   9        0         
USER             I_SP2            YES      32767   16       0         
USER             I_SP3            YES      32767   16       0         
USER             SP1              YES      32767   9        0         
USER             SP2              YES      32767   17       0         
USER             SP3              YES      32767   17       0  

--查看一个表所占的空间大小   
SQL> SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.segment_name,u.segment_type FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME like '%TB%' order by 3,2;

TABLE_SIZE  SEGMENT_NAME  SEGMENT_TYPE  
5MB         IDX_TB1_01    INDEX         
9MB         IDX_TB2_01    INDEX         
9MB         IDX_TB3_01    INDEX         
3MB         PK_TB1        INDEX         
6MB         PK_TB2        INDEX         
6MB         PK_TB3        INDEX         
8MB         TB1           TABLE         
16MB        TB2           TABLE         
16MB        TB3           TABLE  

--檢查方法3
SELECT A.TABLESPACE_NAME,      
       FILENUM,   
       TOTAL "TOTAL (MB)",  
       F.FREE "FREE (MB)",
       TO_CHAR(ROUND(FREE * 100 / TOTAL, 2), '990.00') "FREE%", 
       TO_CHAR(ROUND((TOTAL - FREE) * 100 / TOTAL, 2), '990.00') "USED%",    
       ROUND(MAXSIZES, 2) "MAX (MB)"
  FROM (SELECT TABLESPACE_NAME,          
               COUNT(FILE_ID) FILENUM,        
               SUM(BYTES / (1024 * 1024)) TOTAL,          
               SUM(MAXBYTES) / 1024 / 1024 MAXSIZES      
          FROM DBA_DATA_FILES       
         GROUP BY TABLESPACE_NAME) A,     
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / (1024 * 1024))) FREE     
          FROM DBA_FREE_SPACE      
         GROUP BY TABLESPACE_NAME) F
 WHERE A.TABLESPACE_NAME = F.TABLESPACE_NAME
 and A.TABLESPACE_NAME like '%SP%'
 order by 1;
------------------------------------------
TABLESPACE_NAME  FILENUM  TOTAL (MB)  FREE (MB)  FREE%    USED%    MAX (MB)  
I_SP1            1        16          7            43.75    56.25  32767.98  
SP1              1        32          23           71.88    28.13  32767.98  
SP2              1        32          15           46.88    53.13  32767.98  
SP3              1        32          15           46.88    53.13  32767.98 

11.move (降低高水位) --案例2--移動到新空間中

create tablespace sp2_new datafile 
'/u02/oradata/MPCDB/MPTEST/sp2_new.dbf' size 32M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED
extent management local segment space management auto;

create tablespace i_sp2_new datafile 
'/u02/oradata/MPCDB/MPTEST/i_sp2_new.dbf' size 16M AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
extent management local segment space management auto;

alter index PK_ACC_MERCHANTACCOUNTDET_1 rebuild partition PD1812  TABLESPACE I_PD1812 logging;


SQL> alter table tb2 move tablespace sp2_new;       ---移动表到其它表空间

SQL> select index_name,table_name,tablespace_name,index_type,status  from dba_indexes  where table_owner='TEST' and status!='VALID';
-----------------------------------------------------------------------------------------------------
INDEX_NAME  TABLE_NAME  TABLESPACE_NAME  INDEX_TYPE  STATUS    
PK_TB2      TB2         I_SP2            NORMAL      UNUSABLE  
IDX_TB2_01  TB2         I_SP2            NORMAL      UNUSABLE 

SQL> alter index PK_TB2 rebuild tablespace i_sp2_new; 
SQL> alter index IDX_TB2_01 rebuild tablespace i_sp2_new; 

SQL> select index_name,table_name,tablespace_name,index_type,status  from dba_indexes  where table_owner='TEST' and status!='VALID';

12.空間檢查(發現空間減少)

SQL> select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','SP2_NEW','I_SP1','I_SP2','I_SP3','I_SP2_NEW') order by 2;

TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   9        0         
USER             I_SP2            YES      32767   1        0         
USER             I_SP2_NEW        YES      32767   9        0         
USER             I_SP3            YES      32767   16       0         
USER             SP1              YES      32767   9        0         
USER             SP2              YES      32767   1        0         
USER             SP2_NEW          YES      32767   9        0         
USER             SP3              YES      32767   17       0 

--查看一个表所占的空间大小   
SQL> SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.segment_name,u.segment_type FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME like '%TB%' order by 3,2;

TABLE_SIZE  SEGMENT_NAME  SEGMENT_TYPE  
5MB         IDX_TB1_01    INDEX         
5MB         IDX_TB2_01    INDEX         
9MB         IDX_TB3_01    INDEX         
3MB         PK_TB1        INDEX         
3MB         PK_TB2        INDEX         
6MB         PK_TB3        INDEX         
8MB         TB1           TABLE         
8MB         TB2           TABLE         
16MB        TB3           TABLE 

13.收縮空間 shrink space (回收相应的索引)

优点:降低高水位时索引不会失效

缺点:不能将表移动到其他表空间;高水位降低效果没有move明显;
同时在执行命令前要先执行(alter table table_name enable row movement允许行移动)也会表会产生行级锁,
shrink比move更耗费cpu,产生很多current block这样生成巨大的redo与undo 如果表中索引很少可以建议使用move降低高水位

alter table tb3 enable row movement;   --开启行迁移功能。

alter table tb3 shrink space cascade;  -- 调整HWM时将阻塞DML操作 ,收缩表并降低hwm,并且回收相应的索引。

alter table tb3 disable row movement;   --關閉行迁移功能。

14.空間檢查

SQL> SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.segment_name,u.segment_type FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME like '%TB%' order by 3,2;
TABLE_SIZE  SEGMENT_NAME  SEGMENT_TYPE  
5MB         IDX_TB1_01    INDEX         
5MB         IDX_TB2_01    INDEX         
4.5625MB    IDX_TB3_01    INDEX         
3MB         PK_TB1        INDEX         
3MB         PK_TB2        INDEX         
2.625MB     PK_TB3        INDEX         
8MB         TB1           TABLE         
8MB         TB2           TABLE         
7.625MB     TB3           TABLE         

SQL>  select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','SP2_NEW','I_SP1','I_SP2','I_SP3','I_SP2_NEW') order by 2;
TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   9        0         
USER             I_SP2            YES      32767   1        0         
USER             I_SP2_NEW        YES      32767   9        0         
USER             I_SP3            YES      32767   9        0         
USER             SP1              YES      32767   9        0         
USER             SP2              YES      32767   1        0         
USER             SP2_NEW          YES      32767   9        0         
USER             SP3              YES      32767   9        0         

SQL> select index_name,table_name,tablespace_name,index_type,status  from dba_indexes  where table_owner='TEST' and status!='VALID';

no rows selected

15.改变数据文件所占空间大小(OS 上空間大小)

如果想改变数据文件所占空间大小可执行如下语句:
alter database datafile 'filename' resize 8g重定义数据文件的大小(不能小于该数据文件已用空间的大小)。

alter database datafile '/u02/oradata/MPCDB/MPTEST/sp3.dbf' resize 24M;
alter database datafile '/u02/oradata/MPCDB/MPTEST/i_sp3.dbf' resize 12M;

16.收縮空間 shrink space(不回收相应的索引)

create table tb22 tablespace sp2
as 
select rownum row_no,rpad('M',9,'A') || rownum ca,rpad('M',9,'B') cb,rpad('M',9,'C') cc from dual 
connect by level<=300000;

alter table tb22 add constraint pk_tb22
primary key(row_no) using index tablespace i_sp2;

create index idx_tb22_01 on tb22(ca) tablespace i_sp2;

delete from tb22 t where mod(row_no,2)=0; --刪除偶數
commit;

SQL>  select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','SP2_NEW','I_SP1','I_SP2','I_SP3','I_SP2_NEW') order by 2;
TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   9        0         
USER             I_SP2            YES      32767   16       0         
USER             I_SP2_NEW        YES      32767   9        0         
USER             I_SP3            YES      32767   9        0         
USER             SP1              YES      32767   9        0         
USER             SP2              YES      32767   17       0         
USER             SP2_NEW          YES      32767   9        0         
USER             SP3              YES      32767   9        0 

alter table tb22 enable row movement;   --开启行迁移功能。
alter table tb22 shrink space; --( 调整HWM时将阻塞DML操作),收缩表,并且降低hwm
alter table tb22 disable row movement;   --關閉行迁移功能。

--索引未收縮
SQL>  select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','SP2_NEW','I_SP1','I_SP2','I_SP3','I_SP2_NEW') order by 2;
TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   9        0         
USER             I_SP2            YES      32767   16       0         
USER             I_SP2_NEW        YES      32767   9        0         
USER             I_SP3            YES      32767   9        0         
USER             SP1              YES      32767   9        0         
USER             SP2              YES      32767   9        0         
USER             SP2_NEW          YES      32767   9        0         
USER             SP3              YES      32767   9        0 

--收縮索引shrink space (不回收相应的索引)
alter index pk_tb22 shrink space;
alter index idx_tb22_01 shrink space;

SQL>  select * from v_xag_tablespace_stat t where t.tablespace_name in('SP1','SP2','SP3','SP2_NEW','I_SP1','I_SP2','I_SP3','I_SP2_NEW') order by 2;
TABLESPACE_TYPE  TABLESPACE_NAME  AUTOEXT  MAX_MB  USED_MB  PCT_USED  
USER             I_SP1            YES      32767   9        0         
USER             I_SP2            YES      32767   9        0         
USER             I_SP2_NEW        YES      32767   9        0         
USER             I_SP3            YES      32767   9        0         
USER             SP1              YES      32767   9        0         
USER             SP2              YES      32767   9        0         
USER             SP2_NEW          YES      32767   9        0         
USER             SP3              YES      32767   9        0 

相关文章

网友评论

    本文标题:ORACLE 釋放表及其表空間測試

    本文链接:https://www.haomeiwen.com/subject/hababktx.html