调整 MySQL 服务器

调整 MySQL 服务器

我继承了一个 mysql 服务器,因此我开始运行 MySQLTuner.pl 脚本。我不是 MySQL 专家,但我可以看出这里肯定有些乱。我并不想去解决每一个需要修复和调整的问题,但我确实想抓住主要的、容易实现的目标。

系统总内存为:512MB。是的,我知道这个数字很低,但这是我们目前所拥有的。

脚本内容如下:

General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Enable the slow query log to troubleshoot bad queries
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Increase table_cache gradually to avoid file descriptor limits
    Your applications are not closing MySQL connections properly
Variables to adjust:
    query_cache_limit (> 1M, or use smaller result sets)
    tmp_table_size (> 16M)
    max_heap_table_size (> 16M)
    table_cache (> 64)
    innodb_buffer_pool_size (>= 326M)

对于它建议我调整的变量,我甚至在 mysql.cnf 文件中都看不到它们中的大多数。

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
innodb_buffer_pool_size         = 220M
innodb_flush_log_at_trx_commit  = 2
innodb_file_per_table           = 1
innodb_thread_concurrency       = 32
skip-locking
big-tables
max_connections             = 50
innodb_lock_wait_timeout    = 600
slave_transaction_retries   = 10
innodb_table_locks      = 0
innodb_additional_mem_pool_size = 20M
user                = mysql
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir             = /usr
datadir         = /var/lib/mysql
tmpdir              = /tmp
skip-external-locking
bind-address        = localhost
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 4
myisam-recover          = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
log_error               = /var/log/mysql/error.log
expire_logs_days    = 10
max_binlog_size         = 100M
skip-locking
innodb_file_per_table   = 1
big-tables

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

[mysql]

[isamchk]
key_buffer              = 16M

!includedir /etc/mysql/conf.d/

答案1

直接引用自最近的 Percona 白皮书:

“InnoDB 的两个最重要的设置是缓冲池大小和日志文件大小。服务器中的几乎所有其他设置都可以保留其默认值而不会造成太大损害 - 或者至少,默认值在许多情况下是可以接受的 - 但这两个设置不能保留其默认值,并且对于生产服务器来说永远是不可接受的。”

干杯

答案2

首先,文件的工作方式my.cnf是,如果文件中没有配置指令,则假定它是默认值。(也就是说,如果文件my.cnf完全为空,则所有配置选项都将设置为默认值。)因此,例如,如果您想按照以下建议采取行动:

tmp_table_size (> 16M)

...你只需将这一行添加到你的my.cnf文件中:

tmp_table_size 32M

(我建议查看 MySQL 文档而不会偏离脚本的建议太远,但你听起来足够谨慎,你已经计划这样做了。)

听起来您需要实现的一些功能将在您的应用程序中(例如,确保连接正确关闭、优化查询等)。如何实现这些功能将取决于应用程序的构建方式以及您使用的语言绑定。

相关内容