Mysql

mysql_query() 沒有使用 C API 將命令傳遞給 MySQL 伺服器

  • February 11, 2019

我有這個問題,但經過更深入的調查後,我意識到懸掛不是問題。讀完這個文章後,我決定問一個新問題。

例如,我將此字元串傳遞給mysql_query()函式:

SELECT 1

當我通過執行數千個此命令時,mysql_query()該命令不會送出到 MySQL 伺服器!

我檢查了 MySQL 日誌文件,我不敢相信,但該命令不存在,因此mysql_query()它永遠不會返回,因為它沒有收到來自伺服器的任何答复。

MySql 在執行之前將命令寫入日誌文件。我試過了SELECT SLEEP(10)


筆記:

我知道,這確實意味著很多,但它在 SLES 11.3/XenServer 6.5 上執行了 3 年,沒有任何問題。**注意:**這是一個不能正常工作的 MCVE!

自從我將它移到 SLES 12.3XenServer 7.4 後,問題就開始了。

C++ 程式碼非常簡單——在我寫這個問題之前,我已經檢查了 3 週。關鍵是這個問題在 ~10k 查詢之後開始。VM 仍有約 3 GB RAM 可用。


關於 MCVE 的注意事項:

我創建了一個MCVE,它適用於 MySQL 命令的超過 500k 次執行。

當我將此 MCVE 程式碼插入到我的項目中並註釋我現有main()的以便從 MCVE 執行主要功能時,然後在幾千

$$ or even only hundred $$突然執行的 MySQL 命令再次沒有送出到 MySQL 伺服器。 更具體地說:在嵌入式 MCVE 執行之前,僅初始化我的項目的靜態對象。

對於這些靜態初始化,這一定很奇怪,因為沒有其他程式碼行正在執行。


問題:

知道發生了什麼嗎?特別是命令顯然是

$$ why should I doubt the MySQL Server log file $$沒有從 C API 客戶端送出到 MySQL 伺服器真的很困擾我。


技術數據:

  • SLES 12.3 作為 VM 在 XenServer 7.4 上執行
  • gcc使用7.3編譯,-std=c++17幾乎所有警告選項。
  • 使用安裝了所有 SLES 更新的預設 SLES 12.3 glibc 2.22。
  • 連接 MySQL 社區伺服器 5.7.21
  • C API 客戶端 5.7.21

使用者Gerard H Pille給了我正確的提示 - 看聊天

我不得不刪除MYSQL_OPT_RECONNECT設置,現在它可以工作了。該程序現在執行了兩個多月,沒有任何問題1。

根據 MCVE,這是這兩行程式碼:

bool autoReconnectMySQL = true;
mysql_options( mysqlConnection, MYSQL_OPT_RECONNECT, &autoReconnectMySQL );

為什麼設置會導致此問題,我無法回答。

新測試結果: MySQL C API 8.0.11 不再有這個問題。


1現在,它執行了 1 年多沒有任何問題。

引用自:https://dba.stackexchange.com/questions/203304