通過STANDBY資料庫實現讀寫分離時索引過多的問題

selectshen發表於2016-09-03
    ORACLE 11G的物理STANDBY資料庫可以只讀開啟並實時應用,可以滿足很多應用更改為讀寫分離的架構。但業務上將主庫主要做DML操作,備庫上做SELECT操作,可能存在的一個問題就是,備庫上的SELECT可能需要大量的索引,而這些索引在主庫上實際是沒有意義的,並且還影響主庫DML操作的效能和日誌量。但物理STANDBY只能通過在主庫上建索引後同步到備庫上,備庫自己是無法新建索引的。這種情況就可以發揮邏輯STANDBY的優勢了。
    資料庫的GUARD STATUS分為三種:NONE,STANDBY和ALL.預設邏輯STANDBY資料庫的GUARD STATUS是ALL,可通過SELECT GUARD_STATUS FROM V$DATABASE檢視,可通過ALTER DATABASE GUARD ALL/STANDBY/NONE進行調整。GUARD STATUS為ALL,可以防止資料庫中的所有物件被修改,也就是隻能通過SQL APPLY進行應用;GUARD STATUS為STANDBY,使用者不能修改SQL APPLY進行應用的表,但可以自己建立新表並進行相關的DDL/DML操作;GUARD STATUS為NONE,使用者可以隨便修改任何表,只要具有許可權即可。
針對備庫的SELECT操作需要大量索引的問題,通過邏輯STANDBY實現就簡單了,只需將GUARD STATUS修改為NONE,然後在備庫上建索引即可。
個人建議:
1.不要在原始的使用者下建索引,可以新建一個使用者,在新建的使用者上建原始使用者表上的索引,這樣便於區分。
2.一般不要在備庫上建唯一索引或其它約束,防止SQL APPLY無法應用。
3.對於需要對原始資料進行二次處理的需求,也可以通過在邏輯STADNBY上新建使用者進行處理。

物理STANDBY轉邏輯STANDBY的文件可參考:http://blog.itpub.net/28539951/viewspace-1776691/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-2124430/,如需轉載,請註明出處,否則將追究法律責任。

相關文章