Mysql

如何配置 MySQL Innodb 以每小時處理 1000 次插入?

  • December 15, 2015

我有一個流量很高的網站,每小時可能會插入 1000 條新記錄。

這一錯誤使網站陷入癱瘓:

PDOException: SQLSTATE[40001]: Serialization failure: 1213 
Deadlock found when trying to get lock; 
try restarting transaction: INSERT INTO {location_instance} 
(nid, vid, uid, genid, lid) VALUES (:db_insert_placeholder_0, 
:db_insert_placeholder_1, :db_insert_placeholder_2, 
:db_insert_placeholder_3, :db_insert_placeholder_4); 
Array ( [:db_insert_placeholder_0] => 1059 [:db_insert_placeholder_1] => 
1059 [:db_insert_placeholder_2] => 0 [:db_insert_placeholder_3] => 
cck:field_item_location:1059 [:db_insert_placeholder_4] => 1000 )

如果 MySQL 不能處理這種類型的負載,我會感到非常驚訝。那麼,我的問題是,這是一個數據庫問題嗎?如何配置 MySQL 來處理這麼多的流量?

我在開發伺服器上設置了我的網站副本,其中包含模擬添加到網站的內容負載的腳本。我正在執行具有 16GB RAM 的 Ubuntu、LAMP 堆棧。

誠然,我對數據庫不是很了解。事實上,我是從“apt-get install”完成後附帶的預設 my.cnf 開始的。表都是 Innodb。你會推薦什麼起始配置設置和方法來開始解決這個問題?

讓我知道您可能需要更多資訊。

謝謝

您正在處理死鎖,而不是性能瓶頸問題。

如果您每小時有 1000 條新記錄,那麼您離達到 MySQL 的限制還很遠。MySQL 可以處理至少 50 倍的負載。

死鎖是由應用程式碼引起的,不是數據庫伺服器的錯。死鎖不能在 MySQL 伺服器端修復,除非在某些特定情況下。

InnoDB可以通過SHOW ENGINE INNODB STATUS在 MySQL 提示符下執行或使用mysql -uroot -p... -e "SHOW ENGINE INNODB STATUS".

但是,這只顯示最後發生的死鎖,沒有死鎖日誌。

值得慶幸的是,有一個工具pt-deadlock-logger可以解決該問題,它負責輪詢InnoDB狀態並在使用新死鎖刷新之前保存所有詳細的死鎖資訊。

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