碎片化的 MySQL innodb 表是否会导致 I/O 问题?“任务挂起 120 秒”崩溃?

碎片化的 MySQL innodb 表是否会导致 I/O 问题?“任务挂起 120 秒”崩溃?

大型 innodb 数据库负载激增似乎会导致随机崩溃,控制台中显示“任务挂起 120 秒”。崩溃期间没有日志写入系统。innodb 表相当大,存储空间超过 20 GB。

在带有内核 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。

蒂亚

答案1

看起来你的桌子很大

如果您想要对 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 中的以下帖子

我还建议您升级到 MySQL 5.5,这样您就可以提高 innodb_read_io_threads 和 innodb_write_io_threads 以提高 InnoDB 存储引擎的 CPU 利用率

答案2

是否有很多客户端访问该数据库,还是只有几个同时连接?是否有足够的 RAM 或服务器是否交换?

你所描述的事情绝对发生,但这意味着工作量非常繁忙或 I/O 子系统非常缓慢/不可靠。

bonnie++您是否尝试过或iozone其他一些基准测试工具会为您的服务器带来什么样的性能?

相关内容