使用PL/SQL删除百萬條記錄的大表:
最近開發人員對測試環境資料庫進行了壓力測試,資料庫中産生了大量的髒資料。有幾張大表裡資料量均在百萬甚至千萬條的記錄數。開發人員現提出需求如下:
隻清理其中的部分髒資料,不允許對這些表使用truncate操作。于是就有了下面的PL/SQL清理腳本:
1.編寫删除資料表資料的腳本内容如下:
$ cat data_del.sql
set serveroutput on
show serveroutput
DECLARE
V_LOGNUM NUMBER;
V_NEEDARC NUMBER;
BEGIN
SELECT count(1) INTO V_LOGNUM FROM V$LOG;
LOOP
SELECT count(1) INTO V_NEEDARC FROM V$ARCHIVE;
IF V_NEEDARC < V_LOGNUM - 1 THEN
EXIT;
ELSE
DBMS_LOCK.SLEEP(60);
END IF;
END LOOP;
DELETE FROM T_USER.T_TABLE_NAME WHERE mobile='13800138000' AND rownum < 100;
IF SQL%ROWCOUNT = 0 THEN
COMMIT;
END;
/
2.編寫調用腳本:
$vim clear_dirt_data.sh
source ~/.bash_profile
@data_del.sql;
exit;
EOF
此腳本程式,通過利用dbms_output.sleep()過程,在删除過程中當需要歸檔的日志檔案達到認定的限制時,使删除過程暫時停止,等待ARCH程序将日志檔案歸檔後再繼續進行,進而達到避免歸檔日志檔案來不及歸檔,導緻資料庫挂起的問題。 此方法适用于oracle的各個版本。
本文轉自vcdog 51CTO部落格,原文連結:http://blog.51cto.com/255361/846956,如需轉載請自行聯系原作者