调优 MySQL 1.3 G DB、8GB Ram、高 IO 等待

调优 MySQL 1.3 G DB、8GB Ram、高 IO 等待

我在 8 核虚拟机上安装了 1.3 GB 大小的 MySQL 数据库,内存为 8 GB,我在优化配置时遇到了麻烦。有很多小行和很多连接正在进行。

我发现这个工具:https://tools.percona.com/wizard,但它所建议的差异只会使结果变得更糟。他们主要建议将 InnoDB 缓冲池增加到 6 GB。目前我有 1 GB 的缓冲池,但当我尝试增加它时,性能实际上更差。为什么会这样?

有没有办法强制 MySQL 将整个数据库缓存在内存中,这样它就不会卡在如此高的 IO 等待水平上?

其余设置似乎没有什么区别。

my.cnf 的当前状态:https://gist.github.com/knyttl/ac6efe5c0730dd34a5cc

答案1

查看 my.cnf,你会发现很多内容都是默认的。你迫切需要的是全面清理 InnoDB 基础架构。单击此处查看 InnoDB 基础设施的图示

步骤 01)运行此查询

SELECT CEILING(Total_InnoDB_Bytes/POWER(1024,2)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;

这将告诉您应该将 innodb_buffer_pool_size 设置得多大(以 MB 为单位)。

假设答案是 1024。

步骤 02)运行此查询

SELECT CEILING(Total_MYI_Bytes/POWER(1024,2)) RKBS FROM
(SELECT SUM(index_length) Total_MYI_Bytes FROM information_schema.tables
WHERE engine='MyISAM' AND table_schema NOT IN
('information_schema','performance_schema','mysql')) A;

这将告诉您应该设置 key_buffer_size 有多大(以 MB 为单位)。

假设答案是 64。

步骤 03:运行此查询

SET GLOBAL innodb_fast_shutdown = 0;

这将对关闭期间留在事务日志中的任何事务执行完整的事务提交。事务日志是

  • /var/lib/mysql/ib_logfile0
  • /var/lib/mysql/ib_logfile1

步骤 04:将所有数据转储到文本文件中

cd /root
mkdir datadump
cd datadump
MYSQLDUMP_CONNECT="-uroot -ppassword"
MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --flush-privileges --all-databases"
mysqldump ${MYSQLDUMP_CONNECT} ${MYSQLDUMP_OPTIONS} > MySQLData.sql

步骤 05:关闭 MySQL

service mysql stop

步骤 06:将以下内容添加到my.cnf

如果你使用的是 MySQL 5.5(或启用了 InnoDB 插件的 MySQL 5.1),请添加这些

[mysqld]
key_buffer_size=64M
innodb_file_per_table
innodb_open_files=1000
innodb_buffer_pool_size=1024M
innodb_log_file_size=256M
innodb_fast_shutdown=0
innodb_read_io_threads=16
innodb_write_io_threads=16
join_buffer_size=4M
read_buffer_size=4M
read_rndbuffer_size=4M

如果你使用的是 MySQL 5.0,请添加这些

[mysqld]
key_buffer_size=64M
innodb_file_per_table
innodb_open_files=1000
innodb_buffer_pool_size=1024M
innodb_log_file_size=256M
innodb_fast_shutdown=0
innodb_thread_concurrency=0
join_buffer_size=4M
read_buffer_size=4M
read_rndbuffer_size=4M

请注意我选择innodb_log_file_size至 25%innodb_buffer_pool_size

步骤 07:为新的 InnoDB 文件腾出空间

cd /var/lib/mysql
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile`.bak
mv ibdata1 ib_data1.bak

步骤 08:启动 MySQL

service mysql start

步骤 09:加载数据

mysql -uroot -p < /root/datadump/MySQLData.sql

步骤 10:如果一切运行良好,则运行以下命令:

rm -f ib_logfile0.bak
rm -f ib_logfile1.bak
rm -f ibdat1.bak

全部通过 InnoDB Cleanup 完成。

我之前已经多次建议过 InnoDB 进行类似的改进

试一试 !!!

相关内容