使用配置文件

MySQL有两种类型的参数。

  • 静态参数:重启MySQL服务器后才能生效
  • 动态参数:可以在不重启MySQL服务器情况下即时更改它

变量可以通过以下方式设置。

  • 配置文件:MySQL有一个配置文件,可以在其中指定数据的位置、MySQL可以使用的内存以及其它各种参数
  • 启动脚本:可以直接将参数传递给mysqld进程。启动脚本仅在调用服务器时才有效。
  • 使用SET命令(仅限动态变量):这将持续到服务器重新启动时,需要在配置文件中设置变量,才能使更改持久化;另一种使更改持久化的方法是在PERSIST关键字或@@persist之前加上变量名称。

默认配置文件是/etc/my.cnf(RedHat和CentOS)和/etc/mysql/my.cnf(在Debian系统上)。

如何操作

配置文件包含由section_name指定的部分。所有与section相关的参数都可以放在section_name下面,例如:

  1. [mysqld] <---section name
  2. <parameter_name> = <value> <---- parameter values
  3. [client]
  4. <parameter_name> = <value>
  5. [mysqldump]
  6. <parameter_name> = <value>
  7. [mysqld_safe]
  8. <parameter_name> = <value>
  9. [server]
  10. <parameter_name> = <value>
  • mysql:该部分由mysql命令行客户端读取
  • client:该部分由所有连接的客户端读取(包括mysql cli)
  • mysqld:该部分由mysql服务器读取
  • mysqldump:该部分由名为mysqldump的备份工具读取
  • mysqld_safe:该部分由mysqld_safe进程读取(MySQL服务器启动脚本)

除此之外,mysqld_safe进程会从选项文件中的[mysqld]和[server]部分读取所有选项。

例如:mysqld_safe进程从mysqld部分读取pid-file选项。

  1. [root@www ~]# vim /etc/my.cnf
  2. pid-file=/var/run/mysqld/mysqld.pid

在使用systemd的系统中,mysqld_safe将不会被安装。要配置启动脚本,需要修改mysqld.service单元unit文件。

使用全局变量和会话变量

可以通过连接到MySQL并执行SET命令来设置参数。

根据变量的作用域可以将变量分为两种:

  • 全局变量:适用于所有新连接
  • 会话变量:仅适用于当前连接(会话)

如何操作

如果想记录所有执行时间超过1秒的查询,则可以执行:

  1. mysql> SET GLOBAL long_query_time = 1;
  2. Query OK, 0 rows affected (0.00 sec)

要使更改在重新启动时保持持久化,使用:

  1. mysql> SET PERSIST long_query_time = 1;
  2. Query OK, 0 rows affected (0.00 sec)

或者使用:

  1. mysql> SET @@persist.long_query_time = 1;
  2. Query OK, 0 rows affected (0.00 sec)

持久化的全局系统变量设置存储在数据目录中的mysqld-auto.cnf中。

如果只想为此会话记录查询,而不是为所有连接记录查询,可以使用以下命令:

  1. mysql> SET SESSION long_query_time = 1;
  2. Query OK, 0 rows affected (0.00 sec)

配置参数

本节将介绍安装完成后需要配置的基本内容。除了这些需要配置的内容,剩下的全部可以保留默认值或稍后根据负载进行调整。

如何操作

数据目录

由MySQL服务器管理的数据存储在名为数据目录的目录下。数据目录的每个子目录都是一个数据库目录,并对应服务器管理的数据库。默认情况下,数据目录有三个子目录:

  • mysql:MySQL系统数据库
  • performance_schema:提供用于在运行时检查服务器的内部执行情况的信息
  • sys:提供一组对象,帮助更轻松地解释performance schema信息

除此之外,数据目录包含日志文件、InnoDB表空间和InnoDB日志文件、SSL和RSA秘钥文件、mysqld的pid,以及存储持久化全局系统变量设置的mysqld-auto.cnf文件。

要设置数据目录,需要更改datadir值,或将datadir的值添加到配置文件中。datadir的值默认是/var/lib/mysql:

  1. [root@www mysql]# vim /etc/my.cnf
  2. [mysqld]
  3. datadir=/data/mysql

可以将其设置为你要存储数据的任何位置,但应该将数据目录的所有权更改为mysql。还要确保带有数据目录的磁盘卷有足够的空间来容纳所有数据。

innodb_buffer_pool_size

这是InnoDB最重要的调优参数,它决定InnoDB存储引擎可以使用多少内存空间来缓存内存中的数据和索引。将其值设置太低可能会降低MySQL服务器的性能,而将其设置太高会增加MySQL进程的内存消耗。MySQL 8中的innodb_buffer_pool_size是动态的,这意味着可以改变innodb_buffer_pool_size,而不用重启服务器。

调试innodb_buffer_pool_size的简单指南。

  1. 找出数据集的大小。不要将innodb_buffer_pool_size的值设置的高于数据集的值。假设有一个12GB RAM的机器,数据集是3GB,那么你可以设置innodb_buffer_pool_size的值为3GB。如果数据集的大小增长了,可以在需要时增加它,而无须重新启动MySQL。
  2. 通常,数据集的大小比可用RAM大的多。对于整个RAM,你可以为操作系统分配一些,为其他进程分配一些,为MySQL内的per-thread缓冲区分配一些,为InnoDB之外的MySQL服务器分配一些,其余的可以分配给InnoDB缓冲池。这是一个通用性很强的表,假设它是一个专用的MySQL服务器,所有表都是InnoDB的,并且per-thread缓冲区都保留默认值,那么你就可以开始使用它了。如果系统内存不足,可以动态减少缓冲池的大小。下表列出了RAM与对应的缓冲池大小。 | RAM | 缓冲池大小(范围) | | —- | —- | | 4GB | 1GB~2GB | | 8GB | 4GB~6GB | | 12GB | 6GB~10GB | | 16GB | 10GB~12GB | | 32GB | 24GB~28GB | | 64GB | 45GB~56GB | | 128GB | 108GB~116GB | | 256GB | 220GB~245GB |

innodb_buffer_pool_instances

可以将InnoDB缓冲池划分为不同的区域,以便在不同线程读取和写入缓存页面时减少争用,从而提高并发性。例如,如果缓冲池大小为64G,innodb_buffer_pool_instances的值为32,则缓冲区将被分为32个区域,每个区域的大小为2GB。

如果缓冲池大小超过16GB,则可以设置实例,以便每个区域至少获得1GB的空间。

innodb_log_file_size

innodb_log_file_size是重做日志空间的大小,用于数据库崩溃时重放已提交的事务。innodb_log_file_size的默认值是48MB,这不足以满足生产工作负载的需求。开始的时候,可以将其设置为1GB或2GB。此更改需要重新启动服务器才能生效。停止MySQL服务器的运行并确保它没有被错误地关闭。在my.cnf中进行更改并启动服务器。在早期版本中,需要停止服务器的运行,删除日志文件,然后启动服务器。在MySQL 8中,这一系列操作是自动进行。

更改数据目录

数据量会随着时间的推移而增长,当它超出文件系统的容量时,需要添加磁盘或将数据目录移动到更大的卷中。

如何操作

  1. 检查当前的数据目录。
  1. mysql> show variables like '%datadir%';
  2. +---------------+-----------------+
  3. | Variable_name | Value |
  4. +---------------+-----------------+
  5. | datadir | /var/lib/mysql/ |
  6. +---------------+-----------------+
  7. 1 row in set (0.00 sec)
  1. 停止mysql,并确保它成功停止了:
  1. [root@www ~]# systemctl stop mysqld.service
  1. 检查状态
  1. [root@www ~]# systemctl status mysqld.service
  1. 在新位置创建目录并将所有权更改到mysql下:
  1. [root@www ~]# mkdir -pv /data
  2. mkdir: created directory ‘/data
  3. [root@www ~]# chown -R mysql:mysql /data
  1. 将文件移动到新的数据目录中:
  1. [root@www ~]# rsync -av /var/lib/mysql /data/
  1. 修改配置文件
  1. [root@www ~]# vim /etc/my.cnf
  2. [mysqld]
  3. datadir=/data/mysql
  1. 启动MySQL服务器并确认数据目录已更改:
  1. [root@www ~]# systemctl start mysqld.service
  2. mysql> show variables like '%datadir%';
  3. +---------------+--------------+
  4. | Variable_name | Value |
  5. +---------------+--------------+
  6. | datadir | /data/mysql/ |
  7. +---------------+--------------+
  8. 1 row in set (0.00 sec)
  1. 验证数据是否完整并删除旧的数据目录。