目錄
快速改造表方法
執行個體
随着資訊技術的發展,業務的可用性要求越來越高,在高可用的環境中,如果需要改變表的定義是比較棘手的,特别是對于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>