問題
最近遇到一個問題贤牛,再監(jiān)控事務啟動和堵塞時長的時候,發(fā)現(xiàn)和正常時間差距很大,一般我們會用now() - innodb_trx.trx_started 來計算事務啟動了多久,是否是長事務。問題如下聂薪,
這里我們發(fā)現(xiàn)now的時間是正常的,但是innodb_trx的trx_started字段和trx_wait_started字段時間都差一個整小時蝗羊,這明顯是受到了時區(qū)影響藏澳。
查看信息和分析
我們查看一下時區(qū)信息
我們發(fā)現(xiàn)系統(tǒng)時區(qū)是UTC(進程啟動時候系統(tǒng)的時區(qū)),而數(shù)據(jù)庫的時區(qū)自定義為+8時區(qū)了耀找,再來看看innodb_trx字段的trx_started大概代碼翔悠,如下,
這里我們發(fā)現(xiàn)這兩個字段實際上都是使用localtime的可重入函數(shù)localtime_r來通過進程的時區(qū)獲取這個時間野芒,而并沒有受到time_zone參數(shù)的影響蓄愁。而當我們查看OS時區(qū)是正常的,大概如下狞悲,
那我們可以知道撮抓,在數(shù)據(jù)庫啟動的時候系統(tǒng)時區(qū)可能是UTC,啟動后才修改了OS的時區(qū)摇锋,那么數(shù)據(jù)庫進程的時區(qū)就固定為UTC了丹拯,那么只有重啟一下數(shù)據(jù)庫進程才能讓正確的時區(qū)生效。重啟后時區(qū)正常荸恕,同時innodb_trx的trx_started字段和trx_wait_started字段的時間顯示正常乖酬,如下,