Skip to content

配置

引言

MySQL 有两种类型的参数。

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

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

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

使用配置文件

执行mysql --help,可以看到:

1
2
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

在 Mac 上找到了/usr/local/etc/my.cnf:

1
2
3
4
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1

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

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

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

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

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

/etc/my.cnf:

1
2
[mysqld]
pid-file = /var/lib/mysql/mysqld.pid

在使用 systemd 的系统中,mysqld_safe 将不会被安装。
要配置启动脚本,需要在/etc/systemd/system/mysqld.service.d/override.conf中设置值

例如:

1
2
3
4
5
6
[Service]
LimitNOFILE=max_open_files
PIDFile=/path/to/pid/file
LimitCore=core_file_limit
Environment="LD_PRELOAD=/path/to/malloc/library"
Environment="TZ=time_zone_setting"

使用全局变量和会话变量

可以通过连接到 MySQL 并执行 SET 命令来设置参数。
根据变量的作用域可以将变量分为两种:

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

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

1
mysql> SET GLOBAL long_query_time = 1;

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

1
mysql> SET PERSIST long_query_time = 1;

或者使用:

1
mysql> SET @@persist.long_query_time = 1;

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

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

1
mysql> SET SESSION long_query_time = 1;

编码

为什么不建议在 MySQL 中使用 UTF-8?

MySQL 的“utf8”实际上不是真正的 UTF-8。

在MySQL中,“utf8”编码只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。

在utf8编码中,中文是占3个字节,其他数字、英文、符号占一个字节。

但 emoji 符号占 4 个字节,一些较复杂的文字、繁体字也是 4 个字节。所以导致写入失败,应该改成utf8mb4

MySQL 的“utf8mb4”才是真正的“UTF-8”。
所有在使用“utf8”的 MySQL 和 MariaDB 用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。

再见乱码:5分钟读懂MySQL字符集设置

服务端配置

格式:

1
2
[mysqld]
...

客户端配置

格式:

1
2
[client]
...

通信方式

有 socket 和 tcp 两种方式

socket 要快一些

mysqld 为服务器配置

/etc/mysql/my.cnf:

1
2
3
4
5
6
7
8
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

# Custom config should go here
!includedir /etc/mysql/conf.d/

客户端设置:

1
2
[client]
socket=/Users/nocilantro/mysql/run/mysqld.sock

加密规则

1
2
3
4
5
6
7
8
[client]
database = root
user = root
password = 123456
default-character-set = utf8mb4
port = 3306
host = 127.0.0.1
default_authentication_plugin = mysql_native_password

数据存放地址

1
2
3
4
5
6
7
mysql> show global variables like "%datadir%";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.06 sec)