DBA在維護資料庫的時候,oracle dump檔案的數量可能會非常龐大,在處理這些dump檔案的時候,直接rm 可能會遇到Argument list too long這種問題。在linux系統中,删除大量的小檔案的時候,直接使用rm -rf *,花費的時間長,而且如果我們一次操作的檔案資料過多就會出現Argument list too long的錯誤。
例:
[[email protected] adump]$ ls -l | wc -l
229007
該目錄下有接近23W個檔案,在我們執行統一操作的時候會出現以下的錯誤。
[[email protected] adump]$ rm *.aud
-bash: /bin/rm: Argument list too long
[[email protected] oemrep]$ cp adump/* testdump/
-bash: /bin/cp: Argument list too long
下面介紹删除大量檔案的方法:
方法一:
使用ls+xargs方式:
ls | xargs -n 10 rm -fr
xargs就是将ls的輸出,每10個為一組(以空格為分隔符),作為rm -rf的參數;也就是說将所有檔案名10個為一組,由rm -rf删除。
用這種方法删除上面的23w個檔案,僅僅用了10多s
方法二:
使用reync指令,該指令删除大量大小檔案都很迅速
rsync --help | grep delete
--del an alias for --delete-during
--delete delete extraneous files from destination dirs
--delete-before receiver deletes before transfer, not during
--delete-during receiver deletes during transfer (default)
--delete-delay find deletions during, delete after
--delete-after receiver deletes after transfer, not during
--delete-excluded also delete excluded files from destination dirs
--ignore-errors delete even if there are I/O errors
--max-delete=NUM don't delete more than NUM files
其中--delete-before接收者在傳輸之前進行删除操作
1、先建立一個空目錄
mkdir /data/blank
2、用rsync删除目标目錄
rsync --delete-before -d -a -H -v --progress --stats /u01/app/oracle/admin/oemrep/adump /data/blank
或者
rsync --delete-before -d /data/blank/ /var/edatacache/
這樣/var/edatacache目錄就被快速的清空了。
選項說明:
–delete-before 接收者在傳輸之前進行删除操作
–progress 在傳輸時顯示傳輸過程
-a 歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性
-H 保持硬連接配接的檔案
-v 詳細輸出模式
–stats 給出某些檔案的傳輸狀态
-d transfer directories without recursing
方法三:
使用find -exec指令:find .... -exec [command] {} \;
适合crontab任務,大批量删除檔案較上面方法慢一些。find指令的參數比較多,使用也比較靈活。
如删除10天以前生成的檔案:
find /u01/app/oracle/admin/cedb/adump -name "cedb_ora*.aud" -mtime +10 -exec rm -f {} \;
-mtime -n n天以内
-mtime +n n天以前
-mmin -n n分鐘以内
-mmin +n n分鐘以前 ..等等