2015-12-02 55 views
1

順序我們使用時間戳,以確保在日誌表中的條目順序記錄,但我們已經找到了潛在的缺陷。比如說,我們在RAC中有兩個節點,節點時間戳爲1000ms。我們的應用服務器在彼此的30ms內插入兩個日誌條目。第一個插入由Node1服務,第二個插入由Node2服務。在兩個節點之間有1000毫秒的差異時,時間戳可能會顯示錯誤順序的日誌條目! (我只想用一個序列,但我們的序列緩存性能的原因......)我怎麼能保證在多服務器Oracle RAC環境中

NTP同步不幫助這個情況,因爲NTP有128ms的容錯 - 它敞開了大門的記錄當它們發生的頻率比這更頻繁時,將被記錄爲亂序。

我有一種感覺,我在看這個問題的錯誤的方式。我的最終目標是能夠檢索記錄日誌條目的實際序列。它不一定是時間戳列。

回答

3

Oracle sequence with ORDER specified一種保證,以便跨RAC簇返回的數字。所以

create sequence my_seq 
    start with 1 
    increment by 1 
    order; 

現在,爲了做到這一點,這意味着你要去做,以確保獲得序列節點間通信的相當數量被適當地序列化。這會使這個比正常序列昂貴得多。但是,如果您需要保證訂單,那可能是您將要採用的最有效的方法。

+0

我們的DBA鎖定/緩存了序列......這是我唯一的選擇嗎? –

+1

@BrienMalone - 這當然是最好的選擇。如果這是DBA關心的問題,那麼可以爲指定了「order」的序列指定一個「cache」。我不確定什麼是「鎖定」序列。如果這是一個要求,我希望DBA能夠很好地創建這個特定的序列,而不是默認的'noorder'。 –

1

記住,在一行附加時間戳在插入或更新的時間產生的,但在數據庫中的實際變化發生的時間是當提交發生 - 這取決於的複雜性事務,第1行可能會在第2行之前插入,但在之後獲取。

我知道Oracle中唯一確保訂單的節點是Oracle附加到事務的SCN,並且通過它可以爲RAC環境中的事務定購Streams複製等。

0

1000ms?這是一秒鐘,不是嗎?恕我直言,這是很多。如果你真的需要精確的時間,那麼簡單地放棄全球時間的想法。在日誌服務器上生成時間戳,並假定每個日誌服務器都有它自己的本地時間。如果你需要一些理論,請閱讀Lamport的時間。但是,也許問題的根源在別的地方。 RAC同步節點之間的時間,並記錄一些更大的差異。

如果兩個連續的事件是由兩種不同的連接記錄,是使用兩個連接在同一個線程?還是那些evens傳遞到後臺線程,然後這些線程寫入數據庫?即它是按順序還是並行記錄?