優化使用 InnoDB 表執行期間導致致命錯誤的表查詢
我在使用我的 InnoDB 數據庫表之一進行 OPTIMIZE TABLE 查詢時遇到問題。我有一個包含幾個不同表的數據庫,並且數據在這些表中不斷累積。但是,我有自己的自動服務,用於從這些表中刪除舊行。
使用我的服務刪除舊行後,我還使用優化表命令來釋放磁碟空間。(innodb_file_per_table = 1)
一切都執行良好(我已經成功地將這些服務與其他表(大小 100-200MB)一起使用,但現在我遇到了一個更大的表(大小 900-1000MB)的問題。
使用該較大表刪除數據工作正常,但是當我嘗試使用 OPTIMIZE TABLE 查詢時出現錯誤:
mysql 優化 log_events 表時出錯:命令執行期間遇到致命錯誤。在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行為) 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 在 CleanTablesService.Service1.siivoaTaulut(Object& yhteys) 在 c:\users\greenautomation\documents\visual studio 2015 \Projects\CleanTablesService\CleanTablesService\Service1.vb:第 127 行
我認為這與某些 buffer_size 或類似的東西有關?我可以使用 MySQL Workbench 成功執行完全相同的查詢,但是在我的服務上執行查詢時會引發此錯誤。
那麼 my.ini 文件中是否有一些值需要調整以使其工作,或者是否有其他方法可以用於優化表大小(在刪除舊行後釋放磁碟空間)?
編輯: 我在我的服務中添加了更多日誌記錄,我注意到在執行 OPTIMIZE TABLE 後 30 秒出現了這個致命錯誤。在 MySQL Workbench 中執行相同的操作需要 67.110 秒,所以問題可能是由於某種原因 MySQL 在 30 秒後在程序中間終止執行?但是,我無法從我的 MySQL 設置文件 my.ini 中找到任何會影響這 30 秒超時的參數。
好的,我現在感覺真的很愚蠢…問題與 MySQL 伺服器設置等無關。問題是在我的服務中(與 MySQL 通信)我正在使用 MySqlCommand 對象(服務是使用 VB NET 編碼的)。這個 MySqlCommand 對像有一個參數 CommandTimeout,其預設值為 30。這就是為什麼執行超過 30 秒會導致超時並引發致命錯誤的原因。所以現在我在執行命令之前在我的 VB NET 程式碼中將此參數設置得足夠大一切都按計劃進行!