2016年9月2日 星期五

ERROR 2006: MySQL server has gone away [QT]

隔天上班 就看到錯誤訊息
ERROR 2006: MySQL server has gone away
AP重新連線後異常無重現...

MYSQL 預設 timeout 時間 28800秒
先試著重現問題,縮短timeout時間,在code 中加入
    
  db.setConnectOptions("MYSQL_OPT_CONNECT_TIMEOUT=5"); //fail
  db.setConnectOptions("CLIENT_INTERACTIVE=5");        //fail
timeout 設定失敗,沒在預期的5秒後失效
用另外的方式,直接在 option file 即 my.ini (路徑 C:\ProgramData\MySQL\MySQL Server 5.6)中修改
但檔案裡沒看到 timeout 參數,所以直接在最下方手動新增
interactive_timeout=51
再開mysql自帶終端機檢查看看,設定是否變更

兩個系統變數
interactive_timeout
wait_timeout
都變51了.... OK!

再來改code

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setDatabaseName("MYDB");
    db.setUserName("MYname");
    db.setPassword("MYpass");
    db.setHostName(ui->DB_Port->text());//default 192.168.0.2
    db.setConnectOptions("MYSQL_OPT_RECONNECT=TRUE");    //solution

現在就算超時,也會重新連線了!
done!

補充
參考mysql 文件,my.ini 存在位置在下面幾個地方
%PROGRAMDATA%\MySQL\MySQLServer 5.6\my.ini,%PROGRAMDATA%\MySQL\MySQL Server5.6\my.cnf
%WINDIR%\my.ini, %WINDIR%\my.cnf
C:\my.ini, C:\my.cnf
BASEDIR\my.ini,BASEDIR\my.cnf
%PROGRAMDATA% defaults to C:\ProgramData on Microsoft Windows Vista and greater, and C:\Documents and Settings\All Users\Application Data on older versions of Microsoft Windows.
%WINDIR% is commonly C:\WINDOWS.
or
C:\> echo %WINDIR%