调优1.3 G DB,8GB RAM,高IO等MySQL

我在8核心虚拟机上有1.3 GB的MySQL数据库,8 GB的内存,我有优化configuration的麻烦。 有很多小行和大量的连接。

我已经find了这个工具: https : //tools.percona.com/wizard ,但它提出的差异只会恶化结果。 主要他们build议将InnoDB缓冲池增加到6 GB。 目前,我有1 GB的缓冲池,但是当我尝试增加它时,性能实际上变差了。 为什么发生?

有没有办法强制MySQLcaching整个数据库的内存,所以它不会被卡在如此高水平的IO等待?

其余的设置似乎没有这样的区别。

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

看着你的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; 

这将在closures期间执行事务日志中剩余的任何事务的完整事务提交。 事务日志是

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

第4步:将所有数据转储到文本文件

 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:closuresMySQL

 service mysql stop 

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

如果你正在使用MySQL 5.5(或MySQL 5.1与InnoDB插件启用),添加这些

 [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 

请注意我select了innodb_log_file_size到innodb_buffer_pool_size的 25%

步骤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的改进

  • Oct 29, 2010 : Howto:清理MySQL InnoDB存储引擎?
  • Apr 13, 2011 : 如何扩展从16GB服务器到128GB的my.cnf设置和variables
  • Feb 03, 2012 : 计划在MySQL InnoDB中优化表
  • Mar 25, 2012 : 为什么InnoDB将所有数据库存储在一个文件中?
  • Apr 01, 2012 : innodb_file_per_table是可取的吗?
  • Jul 20, 2012 : 删除Magento MySQL数据库后回收磁盘空间

试一试 !!!