引言:
這是我碰到的一個比較好玩的問題,這個稍微有點標題黨了,雖然根本原因并不是時區問題,但是時區也間接導致了影響了業務。
問題現象:
晚上我下班剛到家,就接到電話說有套慢了,現場值班的工程師幫忙看了下,發現有會話堵塞,當時是把堵塞源頭會話干掉了,就恢復了服務。我當時還挺納悶,這個庫其實日常交易量不大,維護的同事反饋最近也沒做活動,系統也沒做變更,就是前天晚上部署了個清理分區表的腳本。當時有點懵,第二天上班再分析吧。
問題分析:
頭天晚上,值班工程師已經把堵塞會話的sid發我了,我直接帶入萬能sql。查出了這個會話其實是系統自動執行的一個PLSQL,從18:00開始執行的,最長的一個sql執行了一個1個半小時。

看一下最長的這個SQL:cwd06tnwfx32c

查看SQL文本內容,該SQL正在對一個表的索引進行cleanup,這種系統自動吊起的合并索引的情況,一般是在凌晨發起,現在看最早是在18:00發起的。這個時候業務也沒有進入低峰呢,執行這種DDL語句,很顯然會對聯機交易有較大影響。
那為啥數據庫會自動維護索引呢?
首先這個自動維護索引可以解釋,這是oracle 12c中的一個新特性,oracle12c以后,對于drop或者truncate分區表的分區后,同時語句中使用了update indexes,并不會立即進行索引的維護動作,此時索引不會失效,oracle會異步的進行索引維護,通過一個調度任務PMO_DEFERRED_GIDX_MAINT_JOB進行維護索引。
那為啥時間點是18:00點呢?通過查看這個調度任務,發現吊起時間是02:00AM(凌晨2點),這沒毛病,那后面那個PST8PDT是個什么鬼?

百度一下:
PST-Pacific Standard Time太平洋標準時間[加拿大及美國太平洋標準時間。PST是美國西部城市通用的標準時間,以舊金山的時間為準。PST8PDT就是西8區,就是比國際時間慢8小時。中國統一是東8區,比國際時間快8小時。
有木有,這貨竟然是美國西8區的凌晨2點,跟中國差著16個小時呢,可不就是我們的下午18點嗎?你凌晨2點是業務低峰,我下午18點可還是高峰啊。
在MOS庫里找了一圈,找到了一篇文檔說明如何調整這個時區的問題(Doc ID 2703783.1)。按照這個操作就ok了。
總結:
一通分析下來,并不是一個什么原理性的問題,不過oracle這個延遲重建索引的操作還是挺坑的,人家做清理分區的操作肯定是在業務低峰,本來就想立馬重建索引,你還非得延遲做,這不掉坑里了么。。。




