碎片化的 MySQL innodb 表會導致 I/O 問題嗎?“任務掛起 120 秒”崩潰?
具有負載峰值的大型 innodb 數據庫似乎會導致控制台中出現“任務掛起 120 秒”的隨機崩潰。在這些崩潰期間,沒有將日誌寫入系統。innodb 表相當大,儲存 20 多個演出。
帶有核心 2.6.36 和 2.6.38-15 64 位的 Ubuntu 10.04 上具有大量 I/O 負載的表碎片會導致隨機系統崩潰嗎?
我們正在研究在“專用裸機”vps 託管伺服器上託管的大型 innodb 表執行隨機系統崩潰的問題。
MySQL 版本是 5.1。
以下是結果:“SELECT data_length,index_length,(data_length+index_length)/power(1024,3) GB FROM information_schema.tables WHERE ENGINE=‘InnoDB’ ORDER BY data_length+index_length DESC LIMIT 10;”:
+-------------+--------------+-------------------+ | data_length | index_length | GB | +-------------+--------------+-------------------+ | 14758707200 | 17220501504 | 29.782958984375 | | 9456762880 | 16465543168 | 24.1420288085938 | | 16983785472 | 6954041344 | 22.2938385009766 | | 5625610240 | 2997813248 | 8.03118896484375 | | 3694133248 | 1730150400 | 5.0517578125 | | 2031091712 | 35209216 | 1.92439270019531 | | 1357905920 | 706740224 | 1.9228515625 | | 1107312640 | 320356352 | 1.32962036132812 | | 637534208 | 760889344 | 1.30238342285156 | | 488636416 | 260620288 | 0.697799682617188 | +-------------+--------------+-------------------+
打開文件 = 300。
蒂亞
看起來你有很大的桌子
如果您想對 InnoDB 表 mydb.mytable 進行碎片整理,只需執行以下命令:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
在hodd下,它將執行以下操作:
CREATE TABLE mydb.mytablenew LIKE mydb.mytable; INSERT INTO mydb.mytablenew SELECT * mydb.mytable; ALTER TABLE mydb.mytable RENAME mydb.mytableold; ALTER TABLE mydb.mytablenew RENAME mydb.mytable; DROP TABLE mydb.mytableold;
如果您想對所有 InnoDB 表進行大規模碎片整理,只需執行以下命令:
echo "SET SQL_LOG_BIN = 0;" > /root/DefragInnoDB.sql MYSQL_USER=root MYSQL_PASS=rootpassword MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')" SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'" mysql ${MYSQL_CONN} -ANe"${SQL}" >> /root/DefragInnoDB.sql mysql ${MYSQL_CONN} -A < /root/DefragInnoDB.sql
您可能不需要經常對 InnoDB 進行碎片整理。查看我在 DBA StackExchange 上的文章,以確定是否需要對任何一個 InnoDB 表進行碎片整理。
在旁注中,一些表看起來索引消耗的空間比數據消耗的空間多。在這些表上執行碎片整理後,返回並查看每個表中的索引。嘗試確定是否有任何未使用的索引並將其刪除。
你有 300 作為innodb_open_files。您可以將其提高得更高,但不要將其設置得太高而發瘋
請參閱 innodb_open_files 中的以下文章
- http://www.mysqlperformanceblog.com/2009/11/18/how-innodb_open_files-affects-performance/
- http://www.mysqlperformanceblog.com/2009/11/20/rare-evil-mysql-bug/(因為 innodb_open_files 設置太大)
我還想建議您升級 ro MySQL 5.5,您可以在其中提高 innodb_read_io_threads 和 innodb_write_io_threads 以提高 InnoDB 儲存引擎的 CPU 使用率。