高可用環境之ddl操作
在這之前,應該有鎖與阻塞的基礎知識。
ddl鎖
note:執行ddl會先commit當前會話操作,再執行ddl,即ddl是非原子性操作。
x型別鎖:truncate、drop、alter table drop/add/modify等絕大部分ddl,會在表上持有x型別的tm鎖。
s型別鎖:online操作,會在表上持有rs型別的鎖。
高可用環境下ddl操作風險分析:
1、ddl阻塞dml,引發應用問題。
2、因為修改表和字段,導致現有sql語句錯誤,無法執行。
3、在有儲存過程、包或trigger的物件上執行ddl,導致這些pl/sql物件失效而無法編譯。
4、ddl操作使sql語句重新分析,引發sql語句執行計畫改變。
5、高並發表上執行ddl,導致library cache latch的嚴重等待。
面臨的挑戰:
1、ddl阻塞dml,引發應用停頓。
2、ddl導致語句重新解析,導致執行計畫改變,latch爭用。
如何應對這些問題呢?
這與我們對ddl操作本身的理解有很大關係。
對於1,事實上,ddl操作並非都是原子操作,也就是一些ddl操作是可分解的,雖然我們一般都是把它當作乙個操作去做了。這就為我們減少ddl阻塞時間提供了可行性。如果我們能精確把握相應ddl操作的原理,依據oracle本身操作規則,將阻塞dml操作的部分與不阻塞dml的部分分離出來,則可能大大減少ddl對應用的阻塞時間,因為ddl操作中不阻塞dml的部分往往占用很多的時間,從而使得整個ddl操作時間被拉長。更進一步,我們甚至可以利用oracle本身的操作規則替代原本ddl操作所實現的內容。
對於2,ddl操作引發語句重新解析,很難避免吧,或許oracle以後會更加智慧型——能自行區分是否應該invalid語句或者更加開放——提供給我們ddl操作invalid語句的開關。在這方面oracle 11g也有所動作。
案例分析
一般會這樣操作,
sql>alter table t_name add col_name col_type default col_value;
在11g之前,這個操作將會去修改表塊中的內容,並且會在表上持有x型別的tm鎖,對於表記錄數很多,且業務繁忙的情況,系統將遭遇大量鎖等待。
對於這個操作,實際上大量都是時間消耗在對錶塊內容的修改上,導致ddl操作時間被拉長。如果我們對於oracle的操作規則足夠熟悉的話,我們會發現,我們可以把這部分操作從ddl分離出去的,將整個操作分解為3步執行:
1、增加乙個字段
sql>alter table t_name add col_name col_type;
疑問:這個操作只是修改資料字典,而不修改塊內容嗎?
note:當然這樣操作是無法避免語句重新解析問題的。
2、修改該欄位預設值
sql>alter table t_name modify col_name default col_value;
這個操作只是標記以後的記錄預設值為col_value,並不修改以前的記錄。
3、修改以前的記錄
批量修改
參考主鍵約束與唯一約束
實現約束=約束+索引+資料校驗
因為資料的校驗是不阻塞讀操作的,只有表約束的狀態該表是阻塞讀的,那麼如果可以將索引建立與資料校驗分離出去,則可以大大減少ddl阻塞時間。
參考:面臨挑戰:
1、 1、常規方法建立索引,可能會阻塞應用。
2、 2、索引的增加可能導致有些語句執行計畫發生改變。
3、 3、索引名稱的改變導致索引相關hint失效。
參考:
高可用測試oracle
oracle環境配置 1.設定兩台節點機器oracle的 listener.ora配置檔案 2.使用第三台機器訪問主節點的oracle,配置第三台機器oracle配置檔案tnsnames.ora 使用虛ip訪問第三台機器 指令碼思路 dos中呼叫sqlplus執行sql檔案,sql檔案 包含對資料庫...
Oracle 高可用概述
1.你如何理解高可用的概念?所謂的高可用ha就是當你的系統中的某個節點異常損壞了,系統還是可用狀態,還可以對外提供服務,不會因為你的節點丟失而整體癱瘓。2.列出你知道的oracle高可用產品,並作一些功能和應用場景上的說明。rac 基於例項級的高可用產品 dg 基於儲存級別的高可用產品 gg 基於異...
Oracle 高可用概述
1.你如何理解高可用的概念?所謂的高可用ha就是當你的系統中的某個節點異常損壞了,系統還是可用狀態,還可以對外提供服務,不會因為你的節點丟失而整體癱瘓。2.列出你知道的oracle高可用產品,並作一些功能和應用場景上的說明。rac 基於例項級的高可用產品 dg 基於儲存級別的高可用產品 gg 基於異...