閱讀861 返回首頁    go 技術社區[雲棲]


幾個關於oceanbase因係統原因 sql執行失敗的案例

主要遇到的有5種情況:

1、由於合並操作導致sql執行失敗的問題


這個問題在一個寫入頻繁係統中比較常見,之前也講過怎麼導致合並的。

在oceanbase合並期間,需要把內存中的數據落入到磁盤中,為了保證數據的一致性,會將正在執行的sql kill掉,但是sql並不是立刻kill,會保留100ms的時間給這個sql去執行,如果說執行不完成,就會被kill,哪怕是101ms。這時候就會導致sql執行失敗。


2、由於sql執行時間超時,導致sql執行失敗。


這個問題在所有的數據庫中都會有,因為不可能放由一個sql無限時間去執行,ob數據庫默認執行超時時間為10s,超過時間就會被係統kill。


3、事務執行超時,導致sql執行失敗。


在應用中,一個事務可能由一個或者多個sql組成,有時候會發現,單條sql執行時間並沒有超過10s,但是被係統kill了,為什麼?

因為ob不單在單條sql上做了限製,而且會在整個事務的時間上做限製,默認事務超時時間為100s,如果這個事務有n個sql組成,這n-1個sql執行的時間加起來如果超過了100s,或者接近100s,那麼最後一個sql可能剛開始執行就被kill,也可能執行的機會都沒有,就將整個事務kill了。


4、由於memstore打滿,導致sql執行失敗。


這個原因也是由於合並操作導致的,在合並過程中,後續的寫入操作會被記錄到memstore裏麵,如果memstore在合並過程中寫滿,但是合並操作還沒有完成,那麼這個時候sql就會寫入不進來,報錯memstore已用滿。


5、合並期間,location cache沒有及時更新導致sql執行失敗。


如果一個sql涉及多server執行,ob數據庫的合並方式是輪訓合並,每台server一次合並。那麼再合並期間,或者合並完成後的一會,會導致sql執行失敗,原因就是因為location cache沒有更新到最新的,為了保證數據的一致性,ob會將這個sql殺死。


這是最近遇到的關於ob係統會將sql kill的幾個常見的情況~,如果以後還遇到會及時補充。

最後更新:2017-11-12 23:33:53

  上一篇:go  nrpe安裝
  下一篇:go  揭秘2017雙11背後的網絡-雙11的網絡產品和技術概覽