天天看點

【資料架構改造必讀】一種零業務影響下的大表重構方法

目錄

快速改造表方法

執行個體

随着資訊技術的發展,業務的可用性要求越來越高,在高可用的環境中,如果需要改變表的定義是比較棘手的,特别是對于7x24的系統,需要停止業務來改造表定義的代價是非常大的。oracle提供的基本文法可以修改表的基本屬性,但對于普通表、分區表、索引組織表之間的轉換,是無法完成的,那麼有哪些方法可以 轉換呢?筆者在此給讀者一個方法。

part 1

方法介紹

在oracle優化過程中,經常會遇到普通表日積月累之後變大了,dba一般建議改造成分區表,常用的改造方法、步驟如下:

1、 停業務,停監聽等;

2、 将全表資料使用資料泵導出;

3、 drop原表,建立分區表;

4、 将資料導入分區表中,恢複業務;

這樣下來,一般需要停機幾個小時,甚至需要熬夜實施。現在有一種方法,可以線上實施,并且不會影響業務,它就是線上重定義功能。(筆者已經多次成功實施)

從oracle 9i開始,提供了線上重定義的功能,通過調用dbms_redefinition包來實作,那它是如何實作的呢?我們先來了解下線上重定義。

線上重定義:通過調用dbms_redefinition包,在瞬間鎖表的情況下,将表改造成理想的表。它使用資料同步原理,需要雙倍空間(原來的表和索引 算一份),将資料全量同步到目标表,再做一次增量同步,這些過程都不會鎖表,不影響業務使用,最後做一次增量資料同步和表定義對換,完成表轉換,此時會鎖 表,經驗告訴筆者鎖表時長在1s内(根據增量資料大小略有不同)。

常用場景:

1. 普通表、分區表、索引組織表之間的互相轉換;

2. 将表遷移至其他表空間;

3. 修改表的存儲屬性;

4. 重建表以減少碎片;

優點:

1. 對業務影響非常小,鎖表時間非常短,僅在結束時瞬間存在;

2. 速度較快,在實踐中15g的表僅用了12min;

缺點:

1. 需要使用與原表同樣大小的存儲空間,包括索引、lob字段等;

2. 需要占用一定的系統資源;

實作步驟:

1. 檢查表能否進行線上重定義,通過主鍵或rowid兩種方法;

2. 建立目标表結構,空表,索引等不用建立;

3. 開始進行線上重定義,先全量同步一次資料;

4. 同步依賴的對象,包括索引、限制、觸發器、權限等;

5. 做一次增量資料同步;

6. 完成線上重定義;

7. 清理舊表,釋放空間;

8. 收集統計資訊,檢查索引名,并行度等;

dbms_redefinition包:

1. absort_redef_table:清理重定義的錯誤和中止重定義;

2. can_redef_table:檢查表是否可以進行重定義;

3. copy_table_dependents:同步依賴的對象,如索引、權限、限制、觸發器等;

4. finish_redef_table:結束線上重定義;

5. register_dependents_objects:注冊依賴的對象,如索引、限制、觸發器等;

6. start_redef_table:開始線上重定義;

7. sync_initerim_table:同步增量資料;

8. unregister_dependent_object:不注冊依賴的對象,如索引、限制、觸發器等;

線上重定義支援兩種重定義的方法,一種是基于主鍵,一種是基于rowid。其中rowid的方法是10g以後才支援,且不能用于索引組織表,而且重定義完成後會存在隐藏列m_row$$。預設采用主鍵的方式。

part 2

小實驗

在工作中,普通表轉換成分區表是最常見的,今天一起和大家來做個小實驗。

背景:需要将hjadm.rec_code_result表改造成分區表hjadm. rec_code_result_target,目标表已經建立好了,原表存在主鍵。

第一步: 檢查表能否進行線上重定義

【資料架構改造必讀】一種零業務影響下的大表重構方法

總結:檢查表通過主鍵可以進行重定義。如果表沒有主鍵,那麼使用rowid的方法,調用的是dbms_redefinition.cons_use_rowid。

第二步: 建立目标表

在實施前已經建立好表hjadm. rec_code_result_target。

第三步: 開始進行線上重定義

【資料架構改造必讀】一種零業務影響下的大表重構方法

總結:開始進行重定義會比較慢,因為需要做一次全量資料同步。全量資料同步完成後,檢查了一下記錄數,已存在增量資料了。

第四步: 同步依賴的對象

【資料架構改造必讀】一種零業務影響下的大表重構方法

總結:複制相關的依賴對象,完成後檢查結果沒有報錯。若是9i的資料庫,可以手工建立相關的對象。

第五步: 做一次增量資料同步

【資料架構改造必讀】一種零業務影響下的大表重構方法

總結:結束重定義,此時會鎖表,交換表涉及的資料字典中的相關資料。

第六步: 完成線上重定義

【資料架構改造必讀】一種零業務影響下的大表重構方法

第七步: 清理舊表,釋放空間

【資料架構改造必讀】一種零業務影響下的大表重構方法

總結:将舊表删除,以釋放空間。

第八步: 收集表的統計資訊,檢查索引名、并行度等,檢查無效對象,最好編譯一下

ps:此步比較容易忘記。

總結:此表約有5g的資料,整個操作過程約10min完成,僅在完成重定義的時候鎖了一下表,在1s内完成,對業務的影響幾乎為零。

線上重定義的功能對7x24的oltp系統有非常大的優勢,在重定義的過程中,也不影響業務的使用,業務仍然可以對其通路、修改、新增、删除等操作,是實作資料庫高可用的一個很實用的方法。分享就到此了,希望大家有所收獲。

作者介紹:溫偉靈

新炬網絡進階技術專家

擁有六年的it運維經驗,從工作開始接觸oracle資料庫,精通oracle資料庫的内 存結構、rac、dataguard等,在備份恢複、goldengate方面有深入的鑽研。

具有30tb級的oltp資料庫運維經驗,擅長故障診斷、處 理。

目前負責十多個客戶的資料庫運維工作,具有交通、金融、政府、移動、醫療等行業的運維經驗。

<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2015-12-27</b>