資料清理的遺留問題處理(二)
之前嘗試了歷史資料的清理,在邏輯層面清除了資料,可以參見 http://blog.itpub.net/23718752/viewspace-1814000/
但是從物理層面來看,資料檔案還是那麼大,空間還是沒有釋放掉。
從計劃的500多G資料空間清理到了90G
SEGMENT_TYPE SIZE_MB
------------------ ----------
INDEX PARTITION 260279
TABLE PARTITION 294120
然後在經過一番清理之後,對應的段空間一下子就將下來了。
EGMENT_TYPE SIZE_MB
------------------ ----------
INDEX PARTITION 31823
TABLE PARTITION 47218
最後全部清理完
check segement size summary from year xxx
no rows selected
現在問題來了。清理資料檔案該怎麼做。思路應該是在dba_segments裡面去找是否存在相應的段。如果沒有即代表著可以刪除這些資料檔案。
有的朋友可能會說為什麼一定要清掉這些資料檔案,這個也有歷史原因,就是表空間和時間也有關係,比如某年的某月可能就會根據邏輯生成一個表空間,按照這種思路,儘管我清除了端資料,但是放著那些資料檔案,它們是不會被使用到的,還是佔著地方,所以需要直接清掉,給後續的資料留空間。
目前想達到的效果就是,根據表空間能夠查出來,如果某個表空間沒有對應的段物件,顯示為0,標誌著可以清理。
select tablespace_name,count(*) from dba_segments where tablespace_name in ('xxxxx','xxx') group by tablespace_name;
xxxxx 0
xxx 0
但是實際上去寫的時候發現還是沒那麼好弄,經過一番折騰寫出了一個基本實現要求的語句,但是算是一個初始版本,因為結果顯示還是有些牽強。
select tablespace_name,count(*)cnt from dba_segments where tablespace_name like '%DATA%2012%' group by tablespace_name
union
select tablespace_name,null cnt from dba_segments where tablespace_name like '%DATA%2012%' group by tablespace_name
TABLESPACE_NAME CNT
------------------------------ ----------
SERLOG_DATA_20120705 0
SERLOG_DATA_20120705 11
SERLOG_DATA_20120706 0
SERLOG_DATA_20120706 19
SERLOG_DATA_20121007 0
SERLOG_DATA_20121007 31
SERLOG_DATA_20121008 0
SERLOG_DATA_20121010 0
按照這個情況,只有表空間SERLOG_DATA_20121010是可以刪除的。其他的都會和一個dummy列並存。
當然sql寫成這樣也是醉了,能實現基本需求也行,但是成百上千的表空間,我覺得還是不好。繼續改進。使用了minus的方式。
select tablespace_name from dba_tablespaces s1 where tablespace_name like '%DATA%2012%'
minus
select tablespace_name from dba_segments s1 where tablespace_name like '%DATA%2012%' group by s1.tablespace_name
這種方式就會做一個減法,先把相關的表空間羅列出來,然後在dba_segements裡面過濾組合只會顯示有段物件的表空間。
這樣那些隱藏著的表空間都會一一羅列出來。
直接使用drop tablespace來清理。
檢視asm磁碟空間,清理前剩餘80多G
GROUP_NUMBER NAME FREE_MB TOTAL_MB
------------ ------------------------------ ---------- ----------
1 ARCH 204740 204800
2 DATA 84336 6383104
清除多餘的資料檔案,可以看到立馬剩出了快400G.
GROUP_NUMBER NAME FREE_MB TOTAL_MB
------------ -------------------- ---------- ----------
1 ARCH 204740 204800
2 DATA 390360 6383104
這個時候別被這些成績所迷惑,刪除分割槽的同時會清楚分割槽索引,這些分割槽索引的空間又是不少。至於有多少呢,我們還是使用minus的方式來清理。
清除多餘的索引資料檔案,清理之後剩餘了近1T的空間。
GROUP_NUMBER NAME FREE_MB TOTAL_MB
------------ -------------------- ---------- ----------
1 ARCH 203906 204800
2 DATA 981640 6383104
這個例子不是說明minus清理有多好,是想說清理的時候,邏輯清理100%完成,物理清理很可能會漏掉,清理了不到50%,這樣我們的工作就不徹底,半途而廢。
但是從物理層面來看,資料檔案還是那麼大,空間還是沒有釋放掉。
從計劃的500多G資料空間清理到了90G
SEGMENT_TYPE SIZE_MB
------------------ ----------
INDEX PARTITION 260279
TABLE PARTITION 294120
然後在經過一番清理之後,對應的段空間一下子就將下來了。
EGMENT_TYPE SIZE_MB
------------------ ----------
INDEX PARTITION 31823
TABLE PARTITION 47218
最後全部清理完
check segement size summary from year xxx
no rows selected
現在問題來了。清理資料檔案該怎麼做。思路應該是在dba_segments裡面去找是否存在相應的段。如果沒有即代表著可以刪除這些資料檔案。
有的朋友可能會說為什麼一定要清掉這些資料檔案,這個也有歷史原因,就是表空間和時間也有關係,比如某年的某月可能就會根據邏輯生成一個表空間,按照這種思路,儘管我清除了端資料,但是放著那些資料檔案,它們是不會被使用到的,還是佔著地方,所以需要直接清掉,給後續的資料留空間。
目前想達到的效果就是,根據表空間能夠查出來,如果某個表空間沒有對應的段物件,顯示為0,標誌著可以清理。
select tablespace_name,count(*) from dba_segments where tablespace_name in ('xxxxx','xxx') group by tablespace_name;
xxxxx 0
xxx 0
但是實際上去寫的時候發現還是沒那麼好弄,經過一番折騰寫出了一個基本實現要求的語句,但是算是一個初始版本,因為結果顯示還是有些牽強。
select tablespace_name,count(*)cnt from dba_segments where tablespace_name like '%DATA%2012%' group by tablespace_name
union
select tablespace_name,null cnt from dba_segments where tablespace_name like '%DATA%2012%' group by tablespace_name
TABLESPACE_NAME CNT
------------------------------ ----------
SERLOG_DATA_20120705 0
SERLOG_DATA_20120705 11
SERLOG_DATA_20120706 0
SERLOG_DATA_20120706 19
SERLOG_DATA_20121007 0
SERLOG_DATA_20121007 31
SERLOG_DATA_20121008 0
SERLOG_DATA_20121010 0
按照這個情況,只有表空間SERLOG_DATA_20121010是可以刪除的。其他的都會和一個dummy列並存。
當然sql寫成這樣也是醉了,能實現基本需求也行,但是成百上千的表空間,我覺得還是不好。繼續改進。使用了minus的方式。
select tablespace_name from dba_tablespaces s1 where tablespace_name like '%DATA%2012%'
minus
select tablespace_name from dba_segments s1 where tablespace_name like '%DATA%2012%' group by s1.tablespace_name
這種方式就會做一個減法,先把相關的表空間羅列出來,然後在dba_segements裡面過濾組合只會顯示有段物件的表空間。
這樣那些隱藏著的表空間都會一一羅列出來。
直接使用drop tablespace來清理。
檢視asm磁碟空間,清理前剩餘80多G
GROUP_NUMBER NAME FREE_MB TOTAL_MB
------------ ------------------------------ ---------- ----------
1 ARCH 204740 204800
2 DATA 84336 6383104
清除多餘的資料檔案,可以看到立馬剩出了快400G.
GROUP_NUMBER NAME FREE_MB TOTAL_MB
------------ -------------------- ---------- ----------
1 ARCH 204740 204800
2 DATA 390360 6383104
這個時候別被這些成績所迷惑,刪除分割槽的同時會清楚分割槽索引,這些分割槽索引的空間又是不少。至於有多少呢,我們還是使用minus的方式來清理。
清除多餘的索引資料檔案,清理之後剩餘了近1T的空間。
GROUP_NUMBER NAME FREE_MB TOTAL_MB
------------ -------------------- ---------- ----------
1 ARCH 203906 204800
2 DATA 981640 6383104
這個例子不是說明minus清理有多好,是想說清理的時候,邏輯清理100%完成,物理清理很可能會漏掉,清理了不到50%,這樣我們的工作就不徹底,半途而廢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1814723/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 遺留程式碼處理技巧與案例演示
- 資料預處理-資料清理
- 安裝Linux後的遺留問題(轉)Linux
- 資料處理--pandas問題
- mysql 問題處理二則MySql
- Python資料處理(二):處理 Excel 資料PythonExcel
- 大資料處理需留意哪些問題大資料
- 資料庫響應慢問題處理資料庫
- Oracle資料庫中的逐行處理問題NEOracle資料庫
- 近期處理的Oracle資料庫問題總結Oracle資料庫
- .net網站自動化部署-致兩年前的遺留的問題網站
- 二、Git 問題彙總及處理Git
- 資料庫升級問題處理一則資料庫
- Oracle資料庫無效物件問題處理Oracle資料庫物件
- 資料預處理- 資料清理 資料整合 資料變換 資料規約
- 一次OWB資料庫效能問題處理資料庫
- 處理問題的方法
- xml處理的問題XML
- Java 大資料量處理問題Java大資料
- 乾貨丨RPA工程中的資料處理問題
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- 使用資料庫處理併發可能導致的問題資料庫
- 有關分散式資料庫事務處理的問題分散式資料庫
- 一次資料庫不能歸檔問題的處理資料庫
- WannaCry兩年後捲土重來,NSA遺留問題尚未解決
- iview Tree資料格式問題,無限遞迴樹處理資料View遞迴
- Oracle日常問題處理-資料庫無法啟動Oracle資料庫
- 資料庫主機重啟卡住問題處理分享資料庫
- Windows 下處理資料庫無法啟動問題Windows資料庫
- cassandra業務資料一致性問題處理?
- DELETE TABLE資料後,查詢變慢,問題處理delete
- 解決Oracle中Exp/Imp大量資料處理問題Oracle
- 在 React 中處理資料流問題的一些思考React
- python中多程式處理資料庫連線的問題Python資料庫
- 資料庫無響應問題的緊急處理和分析資料庫
- 在PHP中怎麼解決大量資料處理的問題PHP
- 一個關於資料庫閃回區問題的處理資料庫
- 【轉】 一次資料庫不能歸檔問題的處理資料庫