快速進行表空間清理方案的編寫和操作

2021-09-27 05:39:11 字數 3941 閱讀 7896

一、查詢資料庫表空間使用率

注:文章中星號不顯示,如果有報錯右括號丟失,自己加上這兩個位置

二、查詢表空間t_spaces占用空間比較大的物件

select *

from (select segment_name,

segment_type,

tablespace_name,

sum(bytes / 1024 / 1024 / 1024) used_gb

from dba_segments

where tablespace_name = 't_spaces'

group by segment_name, segment_type, tablespace_name )

order by 4 desc;

經分析:占用表空間t_spaces使用率如上圖所示。

注:寫的比較久了,圖不見了,根據上面語句可以查詢出來占用空間最大的就是最前面的,因為使用了order by desc倒序排列。

結論:我們需要清理上圖表中資料,可將表空間t_spaces使用率降低。

三、建議刪除t_tab1表資料(因為該錶與歷史表t_tab1_his有重複資料)

資料分布情況

1、t_tab1分布情況如下:

select substr(tran_dt,1,6),count(*) from t_tab1 group by substr(tran_dt,1,6) order by 1;

備份exp test@test file=/aas/database_bak/t_tab1.dmp tables=t_tab1 log=/aas/database_bak/t_tab1.log

清理:truncate table t_tab1;

分割槽表:

備份:exp test@test file=/aas/database_bak/test1.dmp tables=test1 query=\"where tran_dt>='20190101'\" log=/aas/database_bak/test1.log statistics=none direct=y compress=n indexes=n constraints=n

清理:alter table test1 truncate partition m20181201;

alter table test1 truncate partition m20190101 update global indexes;

檢視索引是否失效:

select index_name,table_name,tablespace_name,status from dba_indexes where table_name='test1';

按照條件進行備份和清理:

備份:exp test@test file=/aas/database_bak/test2.dmp tables=test2 query=\"where tran_dt

清理:delete from test2 where tran_dt <20180101;

三種備份清理方法:面對非分割槽表、分割槽表、條件備份

檢視索引是否失效:

select index_name,table_name,tablespace_name,status from dba_indexes where table_name='test2';

四、清理t_tab1表資料(201611—201703)

1、查詢資料記錄數

select count(*) from t_tab1 partition (m20170101) ;--3800371

2、truncate分割槽表t_tab1資料

alter table t_tab1 truncate partition m20170101 update global indexes;

五、檢視索引是否失效(valid有效),若失效重建索引

select status from dba_indexes where table_name='t_tab1';

注:若有失效的索引,需要重建索引,重建索引語句如下:

alter index p_t_tab1 rebuild online;

七、收集統計資訊,資料匯入完成以後,表統計資訊還沒有執行,手動執行統計資訊收集

begin

dbms_stats.gather_table_stats

(ownname => 'test',

tabname => 'test1',

estimate_percent => dbms_stats.auto_sample_size,

method_opt => 'for all columns size repeat',

degree => 8,

cascade => true);

end;

/begin

dbms_stats.gather_table_stats

(ownname => 'test',

tabname => 'test2',

estimate_percent => dbms_stats.auto_sample_size,

method_opt => 'for all columns size repeat',

degree => 8,

cascade => true);

end;

/以上是非常簡便的oracle資料庫表空間清理方案,可以直接拿去使用。

小知識:

資料庫分割槽索引的幾個檢視

dba_ind_partitions:分割槽索引的分割槽情況和統計資訊。

dba_part_indexes:分割槽索引的概要統計資訊,可以檢視表中有那些分割槽索引,和分割槽索引的型別。

dba_indexes minus dba_part_indexes 可以得到每個表中哪些非分割槽索引

分割槽索引分為:本地索引和全域性索引。

分割槽索引不能對整體重建,必須對每個分割槽重建。

--查詢該使用者下有哪些是分割槽表

select * from dba_part_tables where owner='sroot'

dba_part_tables是sys使用者下的表.

將表遷移到其他表空間的命令

alter test1 move tablespace table_space;

重建索引

alter index test1_px rebuild online tablespace space_index;

delete之後,快速清理表佔據的磁碟空間!

收縮innodb儲存引擎表的空間大小 delete 了6000w日誌表記錄,但是表佔據的檔案大小一直沒有變化。後來,找到一招 alter table x engine innodb 搞定,而且速度很很快。mysql alter table order action engine innodb que...

delete之後,快速清理表佔據的磁碟空間!

收縮innodb儲存引擎表的空間大小 delete 了6000w日誌表記錄,但是表佔據的檔案大小一直沒有變化。後來,找到一招 alter table x engine innodb 搞定,而且速度很很快。mysql alter table order action engine innodb que...

Oracle表空間大小查詢和清理

統計表空間 select tablespace name 表空間,to char round bytes 1024,2 99990.00 實有,to char round free 1024,2 99990.00 g 現有,to char round bytes free 1024,2 99990....