我有一个专用于 MySQL 的 EC2 大型实例。
它将提供 Joomla/Magento 组合,因此它混合了 InnoDB 和 MyISAM 表。我过去只使用过 MyISAM,因此不熟悉 InnoDB 使用的设置。到目前为止,实验成果不多,因为我一直导致 InnoDB 引擎被禁用。
我的实例运行的是 Ubuntu 10.04 64 位服务器版本,内存约为 7.5G。MySQL 目前使用了其中的约 0.6%,性能略差。我想将其配置为合理地使用尽可能多的系统内存。
测试一些设置后我了解到 InnoDB 日志不能集体大于 4G。
有人可以提供一些基本的 InnoDB 和 MyISAM 设置来帮助我入门吗?
谢谢你蒂姆
答案1
我在 EC2 上运行着相同类型的 Mysql 服务器。不要触碰 /etc/mysql/my.cnf,而是将配置文件放入 /etc/mysql/conf.d/。这样,您就可以管理特定引擎的更改,并在您之后为管理员提供有关配置方式的更多线索。此外,它还可以轻松备份您所做的任何更改并跟踪它们。
/etc/mysql/conf.d/innodb_mysql.cnf
[mysqld]
# innodb settings
innodb_additional_mem_pool_size = 12M
innodb_buffer_pool_size = 2G
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 180
innodb_log_buffer_size = 16M
innodb_open_files = 512
innodb_thread_concurrency = 0
这些设置大部分都是非常标准的,你一定要看看Percona 的建议。您的系统可以达到 6G,但我会从小处着手。对于 myisam 表,我可能停止在 4G。我不会改变 innodb 日志文件大小,因为这样做几乎没有什么好处。增加 log_buffer_size 和 addition_mem_pool 在初始增加后也几乎没有什么好处。
此外,上述设置是为了提高性能,而不是为了交易一致性。假设您只运行 Web 应用程序,上述设置没问题,但不适用于银行系统。
/etc/mysql/conf.d/general_mysql.cnf
[mysqld]
# general settings
key_buffer = 384M
key_buffer 对 myisam 和 Mysql 来说最有用,默认值只有 16M,在 8GB 的机器上非常小。再次,我会从好的开始,看看你是否能有所进步。请记住,myisam 缓冲区和 innodb 缓冲区不是共享,因此它们的总和必须小于您拥有的 RAM 量。稍后您可能还会查看排序和读取缓冲区。
答案2
我觉得你需要尝试一些不同的(有据可查的)选项并收集一些统计数据,这样你就可以进行前后比较,否则你可能会觉得你正在提供帮助,但可能会造成伤害。
最简单的统计数据直接从 phpmyadmin 中获取,进入 phpmyadmin 并从右侧框架顶部的按钮中选择状态。
另一个不错的工具是https://github.com/rackerhacker/MySQLTuner-perl/blob/master/mysqltuner.pl #(v1.2.0)
最后启用您的慢查询日志。
我认为在做出改变之前,获得良好的指标至关重要,否则你将无法确定它是否有帮助。
我认为对经常读取但很少更新/插入/添加的所有内容添加索引是很好的。
我每天晚上进行 mysqldump 后都会对所有的内容做一个优化表。
您的 innodb 特定选项是:
spended #
[ 14:31. diane@ltk-prod-1 ~]% mysqladmin -u USER -pPASSWD variables | grep -i inno |sed -e 's/ //g'|less
Mine are:
| innodb_autoinc_lock_mode | 1:: |
| innodb_buffer_pool_size | 8388608:: |
| innodb_checksums | ON:: |
| innodb_commit_concurrency| 0:: |
| innodb_concurrency_tickets | 500:: |
| innodb_data_file_path | ibdata1:10M:autoextend::|
| innodb_data_home_dir |:: |
| innodb_doublewrite | ON:: |
| innodb_fast_shutdown | 1:: |
| innodb_file_io_threads | 4:: |
| innodb_file_per_table | ON:: |
| innodb_flush_log_at_trx_commit | 1:: |
| innodb_flush_method |:: |
| innodb_force_recovery | 0:: |
| innodb_lock_wait_timeout | 50:: |
| innodb_locks_unsafe_for_binlog | OFF:: |
| innodb_log_buffer_size | 1048576:: |
| innodb_log_file_size | 5242880:: |
| innodb_log_files_in_group| 2:: |
| innodb_log_group_home_dir| ./:: |
| innodb_max_dirty_pages_pct | 90:: |
| innodb_max_purge_lag | 0:: |
| innodb_mirrored_log_groups | 1:: |
| innodb_open_files | 300:: |
| innodb_rollback_on_timeout | OFF:: |
| innodb_stats_on_metadata | ON:: |
| innodb_support_xa | ON:: |
| innodb_sync_spin_loops | 20:: |
| innodb_table_locks | ON:: |
| innodb_thread_concurrency| 8:: |
| innodb_thread_sleep_delay| 10000:: |
| innodb_use_legacy_cardinality_algorithm | ON:: |
enter code here
我建议每次增加 2 倍缓冲区,然后尝试测试查询,
但是,对于某些机器,我用完了 /dev/shm(ramdisk)(16gb ram 有帮助)
然后每天只需执行 mysqldump 3 或 4 次。
对我来说,mysqltuner 说我的物理 RAM 严重超载,但我好像总是有半 GB 的可用空间。