1. 程式人生 > >辰風的專欄--Oracle/ClearCase管理員日記

辰風的專欄--Oracle/ClearCase管理員日記

 
    在一個ORACLE資料庫執行過程中,有時候會遇到要批量刪除資料的情況,如一個儲存歷史資料的表中有大量的資料已經不需要保留,要將這部分資料刪除。
以下就這種情況可以採取的方法進行討論。

1、使用TRUNCATE命令進行刪除。
如果是整個表的資料都要刪除的話,使用TRUNCATE TABLE命令是理想的選擇。它刪除了表中的所有資料,並且因為不寫REDO LOG FILE,所以速度很快。刪除的同時,表的索引和約束條件仍然存在。這種方法適用於ORACLE的各個版本。但是當要刪除的資料只是表中的一部分時,這種方法便行不通了。

2、直接進行DELETE操作。
直接使用DELETE命令進行刪除,如果刪除的資料量較大時,可能導致回滾段出錯。這是因為在刪除資料的過程中,不斷擴充套件回滾段,直到回滾段的最大範圍數
或回滾段所在表空間空閒空間用完而出錯。解決這個問題可以通過給刪除資料的事務指定一個足夠大的回滾段或者將回滾段所在表空間的AUTOEXTEND選項開啟,同時將回滾段的MAXEXTENTS改大或設為UNLIMITED。不過這樣仍存在一個隱患,如果刪除的資料量大,同時資料庫工作于歸檔模式下時,有可能導致日誌切換頻繁,所有日誌檔案都處於需要歸檔的狀況,而歸檔程序來不及歸檔日誌檔案的情況出現,這時資料庫將被掛起,直到有可用的日誌檔案後才恢復正常。
所以這種方法也不理想。

3、通過PL/SQL迴圈分段刪除。
第三種方法是專門針對上面第二種方法進行優化改進的。這種方法通過一段PL/SQL程式迴圈分段刪除資料,逐步提交事務,達到縮小事務規模,安全刪除資料的目的。
例如有一個數據表t_table,我們將對其中欄位c_date滿足小於2001年1月1日的記錄進行刪除,可以採用以下的PL/SQL程式。

1 DECLARE
2 V_TEMP NUMBER;
3 BEGIN
4 LOOP
5 BEGIN
6 SELECT 1 INTO V_TEMP FROM t_table WHERE c_date < to_date(2000/01/01,yyyy/mm/dd) AND rownum = 1;
7 DELETE FROM t_table WHERE c_date < to_date(2000/01/01,yyyy/mm/dd) AND rownum < 100;
8 COMMIT;
9 EXCEPTION
10 WHEN NO_DATA_FOUND THEN
11 EXIT;
12 END;
13 END LOOP;
14 END;

程式的第1和第2行聲明瞭一個臨時變數。第4到第13行定義了一個迴圈,在這個迴圈中第6行不斷檢查表中是否還有滿足條件的記錄,如果有,第7行程式便執行刪除操作,每次刪除100記錄,同時提交事務。當表中已無滿足條件的記錄時,便引起NO_DATA_FOUND的異常,從而退出迴圈。通過分批刪除,逐步提交,縮小了事務的規模,從而達到避免出現回滾段錯誤的目的。然而這種方法依然存在因日誌切換頻繁,而歸檔程序來不及歸檔日誌檔案而導致資料庫掛起的可能性。下面的程式通過ORACLE所提供的dbms_lock包中的過程sleep,解決了這個問題,從而達到安全快速大量刪除資料的目的。

1 DECLARE
2 V_LOGNUM NUMBER; -- 資料庫中擁有的日誌檔案數
3 V_NEEDARC NUMBER; -- 需要歸檔的日誌檔案數
4 BEGIN
5 SELECT count(1) INTO V_LOGNUM FROM V$LOG;
6 LOOP
7 LOOP
8 SELECT count(1) INTO V_NEEDARC FROM V$ARCHIVE;
9 IF V_NEEDARC < V_LOGNUM - 1 THEN
10 EXIT;
11 ELSE
12 DBMS_LOCK.SLEEP(60);
13 END IF;
14 END LOOP;
15
16 DELETE FROM t_table WHERE c_date < to_date(2000/01/01,yyyy/mm/dd) AND rownum < 100;
17 IF SQL%ROWCOUNT = 0 THEN
18 EXIT;
19 END IF;
20 COMMIT;
21 END LOOP;
22 END;
程式中的第2和第3行聲明瞭兩個變數v_lognum和v_needarc來儲存資料庫中日誌檔案的數量和當前需要歸檔的日誌檔案數量。
第5行獲取了資料庫中日誌檔案的數量。
第6行到第21行開始了刪除資料的迴圈,第7行到第14行是一個子迴圈,不斷檢測當前需要歸檔的日誌檔案的數量v_needarc是否小於資料庫的日誌檔案總數v_lognum減去1,如果滿足條件,則退出子迴圈,開始刪除資料。否則的話便呼叫dbms_lock.sleep()過程,使程式休眠60秒,然後繼續子迴圈,檢測需歸檔的日誌檔案數量。
第17到19行,檢查刪除資料的結果,如果已無資料,則退出,程式結束。
這個程式,通過利用dbms_output.sleep()過程,在刪除過程中當需要歸檔的日誌檔案達到認定的限制時,使刪除過程暫時停止,等待ARCH程序將日誌檔案歸檔後再繼續進行,從而達到避免歸檔日誌檔案來不及歸檔,導致資料庫掛起的問題。
此方法適用於oracle的各個版本。

4、使用NOLOGGING選項重新建表。
在ORACLE 8以後的版本中,CREATE TABLE命令提供了NOLOGGING的選項,在建表時不用寫日誌檔案。
這樣當我們在刪除大量的資料時可以將要保留的資料通過CREATE TABLE ... NOLOGGING ... AS SELECT * FROM...的方法將要保留的資料備份到另一個表中,將原來的表刪除,然後再 ALTER TABLE RENAME TO 命令將備份的表改為原來表的名字。
這個方法由於不寫日誌檔案,所以速度很快,但是原來的表所擁有的索引和約束都將不存在,需重新建立。另外這個方法只適用於ORACLE 8以後的版本,ORACLE7.3中也可採用這個方法,但NOLOGGIN關鍵字要由UNRECOVERABLE代替。

前面比較了在ORACLE中如何批量刪除資料的幾種方法,以上這幾種方法均在oracle 8i for windows,oracle 7.3 for windows,oracle 7.1 for netware中測試通過,在應用中可以根據實際情況選擇一種合適的方法進行處理。

相關推薦

專欄--Oracle/ClearCase管理員日記

     在一個ORACLE資料庫執行過程中,有時候會遇到要批量刪除資料的情況,如一個儲存歷史資料的表中有大量的資料已經不需要保留,要將這部分資料刪除。以下就這種情況可以採取的方法進行討論。 1、使用TRUNCATE命令進行刪除。 如果是整個表的資料都要刪除的話,使用TRU

Oracle數據庫巡檢工具V1.0

oracle巡檢工具風哥Oracle數據庫巡檢工具V1.0下載地址:http://www.itpux.com/thread-5927-1-1.html風哥Oracle數據庫巡檢工具V1.0

這裏是零度的個人博客

clas post pos 個人 div 個人博客 log class 博客 這裏是辰風的辰風的辰風和零度辰風和零度辰風的這裏是辰風的辰風的辰風和零度辰風和零度辰風的這裏是辰風的辰風的辰風和零度辰風和零度辰風的這裏是辰風的辰風的辰風和零度辰風和零度辰風的這裏是辰風的辰風的辰

活動:Oracle數據庫門徒視頻套餐優惠活動

oracle視頻教程活動:2018年風哥Oracle數據庫門徒視頻優惠活動: 課程名稱:Oracle DBA數據庫高級工程師培訓專題1.1(系列78套.超越OCP/OCM) 專題鏈接:http://edu.51cto.com/topic/1121.html 買就送:1.送風哥終身門徒資格、風哥終身技術交流機會

04.Oracle數據庫實戰入門-Oracle安裝配置視頻教程

入門 配置 風哥 視頻 數據庫 更多 鏈接 風哥oracle oracl 04.風哥Oracle數據庫實戰入門-Oracle安裝配置視頻教程鏈接:https://pan.baidu.com/s/1UDhT_A_e62sZshQ5n2toYQ 提取碼:pqca 請分享鏈接到

51CTO-哥-ORACLE學習計劃(持續更新中)

第一模組(2018年11月10號-2018年12月8號) 學前指導(3節課)Linux(41節課)泛Unix作業系統(4節課)Oracle(97節課)(第5章1天、第6章1天、第7章1天、第8章2天、第9章2天、第10章2天、第11章3天、第12章3天、第13章2天)--》總共17天 學習時間 每天晚上2

讀左耳聽專欄:09渴望、熱情與選擇

渴望、熱情與選擇 這裡是我看了耗子叔專欄後的摘抄,加上自己的思考或總結。 加班太嚴重完全沒時間學習怎麼辦? 一方面:現在社會有些公司工作壓力大,經常加班,可以理解。 另一方面:我們在通宵打遊戲,追美劇,泡妞的時候,從來不會給自己找藉口說時間不夠。我們總是

Oracle個人學習日記:(一)decode 使用

遇到的需求: DISORDER為排序欄位 需要調整某兩個的資料的DISORDER SQL語句: update t_article_manage set disorder=decode( di

Oracle使用管理員賬號用sqlplus登陸失敗,提示ERROR

初學Oracle, 沒有賬號密碼,想試著用管理員賬號檢視本機後哪些使用者和列表,上網找了很多帖子,一開始,用 sqlplus /nolog 是成功的。 但是,用 sqlplus "/ as sysdba" 是失敗的,並且提示 ERROR: OR

oracle入坑日記<一> 安裝

學習日記系列(前輩/大神勿噴) 日記記錄版本為Oracle 12C。 一、下載 下載地址:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html 下載系統對應版本。下載後解壓,雙擊s

oracle管理員登陸上之後建立新使用者並給許可權的步驟

例項方法 單獨的程序中執行指定的字串命令 jdbc:oracle:thin:@localhost:1521:orcl oci 需要oracle客戶機  叢集 thin:只需要驅動jar 執行緒是應用程

ORACLE 修改管理員密碼

oralce 忘記管理密碼後,理論上是不能找回來,但是在伺服器上可以修改管理員密碼,前提是你能登陸伺服器上,獲取到最高許可權。 不管是在windows還是linux下,命令都是一樣 1、在命令列輸入   sqlplus /nolog    2、進入sqlplus

oracle忘記管理員密碼?建立新使用者,賦予管理員許可權

忘記系統管理員密碼?簡單粗暴操作。 win+R,輸入sqlplus,開啟oracle的sqlplus; 使用者名稱中輸入:sys as sysdba 回車 不用輸入密碼,直接敲回車,顯示成功連線到oracle,以系統管理員身份登入到oracle. 如果你不確定你將要建立的使

oracle菜鳥日記1

1. 在查詢資料字典檢視的時候,使用where語句時,要注意後面的字元型別的查詢需要大寫,因為資料庫儲存的時候預設將字典裡面的每個欄位裡面的內容按照大寫來儲存的。 例如:select * from user_constraints where table_name='大寫表

oracle菜鳥日記7

1. 注意在oracle中的00,01這類的詞,這類都屬於數字型 比如: grouping(deptno) || grouping(job)=‘00或者01’ 2. 對於列名是漢字的可以加雙引號表示,而如果要在列中使用漢字則目前我還真不知道怎麼做。。。。。 3. 高階分組:

oracle 數據庫管理員

行修改 技術 應該 項目 用戶登錄 shu rac 並且 對數 一、數據庫管理員每個oracle數據庫應該至少有一個數據庫管理員(dba),對於一個小的數據庫,一個dba就夠了,但是對於一個大的數據庫可能需要多個dba分擔不同的管理職責。那麽一個數據庫管理員的主要工作是什麽

WinXP系統中的Oracle數據庫如何以管理員身份登錄

.com sql oracle數據 word pass 登錄認證 dba 命令行 打開 打開命令行,輸入:sqlplus sys/password as sysdba ,如下圖所示:    註意事項:   如果輸入正確的管理員密碼和用戶名,當然可以登錄管理員用戶。

oracle學習日記1-oracle的連線

1.sqlplus /nolog --執行sqlplus命令,進入sqlplus環境,nolog引數表示不登入,只是啟動了一個客戶端程序,並沒有與伺服器連線。 2.1:在dos視窗輸入sqlplus system/oracle再輸入使用者名稱和密碼,此時說明連線到Oracle資料庫了,連線到

window 10 刪除帶有管理員許可權的Oracle資料夾

因為檔案已經被刪除就不附圖解釋了   因為檔案安裝的方式錯誤,所以本是按照正常步驟解除安裝Oracle,前面的禁用Orace服務與刪除Oracle登錄檔都沒有出錯,但到最後一步---------Oracle資料夾竟然有管理員許可權,讓我一下午的時間都花在這裡了,抓狂。   我也不是到是自己在哪一步作對了,

Oracle EBS 報錯:此責任無可用函式。 更改責任或與您的系統管理員聯絡。

解決:修改配置檔案        1.FND: Diagnostics (FND:診斷)            啟用設為”是”     &n