大型 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 中的以下帖子
- 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 设置得太大)
我还建议您升级到 MySQL 5.5,这样您就可以提高 innodb_read_io_threads 和 innodb_write_io_threads 以提高 InnoDB 存储引擎的 CPU 利用率。
答案2
是否有很多客户端访问该数据库,还是只有几个同时连接?是否有足够的 RAM 或服务器是否交换?
你所描述的事情绝对能发生,但这意味着工作量非常繁忙或 I/O 子系统非常缓慢/不可靠。
bonnie++
您是否尝试过或iozone
其他一些基准测试工具会为您的服务器带来什么样的性能?