開啟mysql審計後引發的問題

wzq609發表於2015-09-02

【前言】剛在mysql的測試環境中開啟了審計的功能,結果第二天業務人員就反饋測試庫登入不。幸好是測試環境,不然就慘了。。。。。

 

詳細報錯如下:

mysql> insert into test.test values (4);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    76571
Current database: *** NONE ***

 

資料庫的日誌資訊:

7:30:22 [Warning] Aborted connection 76570 to db: 'unconnected' user: 'ipos' host: '192.168.1.20' (init_connect command failed)
7:30:22 [Warning] Duplicate entry '6' for key 'PRIMARY'
7:30:22 [Warning] Aborted connection 76571 to db: 'unconnected' user: 'ipos' host: '192.168.1.15' (init_connect command failed)
7:30:22 [Warning] Duplicate entry '76571' for key 'PRIMARY'
7:30:22 [Warning] Aborted connection 76572 to db: 'unconnected' user: 'ipos' host: '192.168.1.14' (init_connect command failed)
7:30:22 [Warning] Duplicate entry '76572' for key 'PRIMARY'
7:30:24 [Warning] Aborted connection 76573 to db: 'unconnected' user: 'ipos' host: '192.168.1.20' (init_connect command failed)
7:30:22 [Warning] Duplicate entry '76572' for key 'PRIMARY'

 

原因分析:

init-connect存放資料的表指令碼如下:

CREATE TABLE logDB.log (`id` int(11) primary key auto_increment, `time` timestamp, `localname` varchar(30), `matchname` varchar(30))

 

因為此處的id值取自processlist的id值;

image 

當資料庫不重啟的情況下,這個ID值是一直增加的;但是當資料庫重新啟動之後,processlist顯示每個使用者的ID值又會從1開始,而如果是這樣的話,那麼插入到表logDB.log裡面的id值便違反了建立的規則;所以就報錯了。

 

顯示這個資料庫每天晚上22點30分都會定時自動重啟,符合了問題的場景;

image

 

【解決方法】

1、很明顯可以把建立表中id值的primary key 取消掉,但是這樣在查詢問題的時候可能就會在logDB.log中找到多條記錄,透過對時間進行篩選的話,也是可以判斷出問題的原因;

2、這是一個比較笨的方法,就是儘量不重啟,如果重啟的話就把表logDB.log的記錄清空一遍;

希望看到前面那篇文件的朋友能夠看到這篇,避免這種問題發生在生產系統上面;

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

相關文章