Ubuntu

碎片化的 MySQL innodb 表會導致 I/O 問題嗎?“任務掛起 120 秒”崩潰?

  • August 22, 2012

具有負載峰值的大型 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 中的以下文章

我還想建議您升級 ro MySQL 5.5,您可以在其中提高 innodb_read_io_threads 和 innodb_write_io_threads 以提高 InnoDB 儲存引擎的 CPU 使用率

引用自:https://serverfault.com/questions/419519