本节介绍了如何设置 MySQL 变量,以及常用的连接选项。
设置程序变量
MySQL 对选项是顺序处理的
- 环境变量 -> 配置文件 -> 命令行 -> mysqld-auto.cnf (数据目录下的持久化配置文件)
-
当出现重复选项时,后面的会覆盖前面的。
所以环境变量的优先级最低,命令行优先级最高 (数据目录下 mysqld-auto.cnf 例外)。
长选项和短选项
-
长选项和值之间必须有
=
--host=172.16.0.30
- 短选项和值之间可以是空格或直接相连
-h 172.16.0.30 -h172.16.0.30
组成
- 选项名称
- 破折号
-
和下划线_
可互换如 –skip-grant-tables 和 –skip_grant_tables 是等同的。
-
可以使用
--disable
和--skip
前缀,或者=0
后缀# disable --disable-column-names --skip-column-names --column-names=0 # enable --column-names --enable-column-names --column-names=1
- 识别配置的选项是否有效
--loose
前缀无法识别的选项会发出警告并忽略。如 mysql –loose-no-such-option。
-
--maximum
前缀限制最大变量的最大值,仅适用于 mysqld ,且仅能用于设置会话级的选项值,设置全局级选项值会报错,如 –maximum-max_heap_table_size=32M 。
- 破折号
-
选项值
- 对于采用数字值的选项,可以给该值加上后缀K,M、G、T、P 或 E (不区分大小写),表示1024、1024^2、1024^3 …
# ping 1024次 mysqladmin --count=1K --sleep=10 ping
- 布尔型选项的值可以为 {ON|OFF|TRUE|FALSE},不区分大小写
- 对于采用数字值的选项,可以给该值加上后缀K,M、G、T、P 或 E (不区分大小写),表示1024、1024^2、1024^3 …
设置方法
-
启动时指定
shell> mysql --max_allowed_packet=16777216 # 单位是bytes shell> mysql --max_allowed_packet=16M # 单位不区分大小写
- 程序调用时设置变量,可以指定倍数后缀 (K/M/G),但不可以使用表达式
shell> mysql --max_allowed_packet=16M shell> mysql --max_allowed_packet=16*1024*1024 # 不合法
- 对于有选项值的选项,如果在启动时指定,选项和选项值之间要用
=
连接shell> mysqld_safe --log-error=my-errors &
- 程序调用时设置变量,可以指定倍数后缀 (K/M/G),但不可以使用表达式
- 在配置文件中指定
[mysql] max_allowed_packet=16777216 or [mysql] max_allowed_packet=16M # 下划线或破折号等效 [mysqld] key_buffer_size=512M or [mysqld] key-buffer-size=512M
- 使用 SET 语句动态设置
- SET 设置变量时,不可以指定倍数后缀 (K/M/G),但可以使用表达式
mysql> SET GLOBAL max_allowed_packet=16M; -- 不合法 mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
- SET 设置变量时,不可以指定倍数后缀 (K/M/G),但可以使用表达式
用于连接的选项
这些选项对于 MySQL 程序基本是通用的。
建立连接的选项
- –default-auth
- 认证插件
- –host,-h
- 主机,默认 localhost
- –password,-p
- 密码。输入时建议采用交互式,或写到配置文件中
使用时,密码必须紧跟选项,否则会被识别为数据库名,如
mysql -p test
。某些系统会将密码限制为8位,这个限制是系统库的限制,不是 MySQL 的属性。MySQL 对密码长度没有任何限制。
- 密码。输入时建议采用交互式,或写到配置文件中
-
–skip-password
- 无密码且不提示输入密码
- 如果忘记管理员密码,可以使用这个选项跳过密码登录,然后重置密码
- –plugin-dir
- 插件目录
当指定了 –default-auth 但是找不到插件时,需要指定插件目录。
- 插件目录
-
–port,-P
- 端口,默认 3306
- –protocol={TCP|SOCKET}
mysql --host=127.0.0.1 mysql --host=::1 # IPv6连接本地服务端 mysql --protocol=TCP
- 连接协议,localhost 连接默认使用 socket 方式
-
在执行时,仅使用与传输协议相关的连接选项,无关的选项会被忽略
如 localhost 连接,即使指定了 TCP/IP 的端口号 (-P),也会被忽略,因为 localhost 使用 socket 方式。
-
–secure-auth已弃用。
-
–socket,-S
- socket 文件,默认是 /tmp/mysql.sock
- –user,-u
- 用户。默认为系统的登录用户
加密连接的选项
- –get-server-public-key
- 从服务器请求 RSA 公钥
此选项适用于使用 caching_sha2_password 身份验证插件进行身份验证的客户端。
- 从服务器请求 RSA 公钥
-
–server-public-key-path
- 服务器公钥路径
此选项适用于使用 sha256_password 或 caching_sha2_password 身份验证插件进行身份验证的客户端。
- 服务器公钥路径
-
–ssl, –skip-ssl已弃用。
- 控制是否使用加密连接
-
创建加密连接用户
# 创建加密连接用户 mysql> create user repl@'172.16.0.%' identified by 'root' require ssl; mysql> alter user repl@'172.16.0.%' identified by 'root' require ssl; # 验证 shell> mysql -urepl -proot -h 172.16.0.30 -P 3306 --ssl-mode=disabled # 连接被拒绝 shell> mysql -urepl -proot -h 172.16.0.30 -P 3306 --ssl-mode=require # 正常连接
- –ssl-ca
- 包含 ssl 证书颁发机构列表的文件
- –ssl-capath
- ca 文件目录
- –ssl-cert
- 包含 X.509 证书的公钥文件
- –ssl-cipher
- 加密密码列表,如果表中不支持密码,则加密连接不起作用
--ssl-cipher=AES128-SHA --ssl-cipher=DHE-RSA-AES128-GCM-SHA256:AES128-SHA
- 加密密码列表,如果表中不支持密码,则加密连接不起作用
- –ssl-crl
- 包含证书吊销列表的文件
- –ssl-crlpath
- crl 文件所在目录
- –ssl-fips-mode={OFF|ON|STRICT}
- 客户端是否允许 FIPS 模式
- –ssl-key
- 包含 X.509 密钥的私钥文件
如果密钥文件受密码保护,会提示输入密码。
- 包含 X.509 密钥的私钥文件
-
–ssl-mode
服务器端已删除,客户端仍然保留。
- 与服务器连接所需的安全状态
- 选项值
- REQUIRED
- 如果服务器支持加密连接,就建立加密连接,如果不支持,则报错
- DISABLED
- 禁用加密连接
- PREFERRED
- (默认) 如果服务器支持加密连接,就建立加密连接,如果不支持,就使用非加密连接
- 本地 socket 连接,是未加密连接,但是默认情况下,它是安全的,如果使用加密连接,反而会增加 CPU 负载
- VERIFY_CA
- 类似 REQUIRED,但是需要验证证书,找不到有效证书就报错
- VERIFY_IDENTITY
- 类似 VERIFY_CA,另外还要验证证书中的主机名,此选项有助于防止中间人攻击
- 这种主机名验证,不适用于自动创建或使用 mysql_ssl _rsa_setup 手动创建的自签名证书。这类证书不包含主机名作为通用名称
- REQUIRED
–ssl-verify-server-cert已弃用,被 –ssl-mode=VERIFY_IDENTITY 取代。
- 根据服务器证书的通用名身份验证主机名
- –tls-ciphersuites=ciphersuite_list
- 允许 TLSv1.3 密码用于加密连接
shell> mysql --tls-ciphersuites="suite1:suite2:suite3"
- 允许 TLSv1.3 密码用于加密连接
- –tls-version
- 客户端加密连接允许的 TLS 协议
shell> mysql --tls-version="TLSv1.1,TLSv1.2"
- 为避免漏洞,TLS 版本必须连续,否则会造成漏洞
--tls-version="TLSv1,TLSv1.1,TLSv1.2" --tls-version="TLSv1.1,TLSv1.2" --tls-version="TLSv1.2"
- 客户端加密连接允许的 TLS 协议
压缩连接的选项
–compress, -C已弃用。
- 尽可能压缩客户端和服务器之间发送的所有信息
- –compression-algorithms=value
- 允许的压缩算法,默认未压缩
- –zstd-compression-level=level
- zstd 算法的压缩级别,允许值为1-22,默认级别是3
控制连接压缩
客户端和服务器端之间的流量可以进行压缩,以减少通过连接发送的字节数。 默认情况下,连接是未压缩的,但是如果服务器端和客户端同意相互允许的压缩算法,则可以压缩连接。
压缩发生在加密之前。并且,压缩会影响客户端和服务器端的 CPU 负载,所以只适用于低带宽的环境,可以减少传输的字节数。
适用范围
- 普通客户端连接
- 主从复制的连接
- 组复制 (GR) 的连接
- 不适用于 FEDERATED 表的连接
- X 协议连接也支持压缩,但是独立于经典 MySQL 协议连接的压缩
配置连接压缩
- 控制压缩
- 系统变量
- protocol_compression_algorithms
- 命令行选项
- –compression-algorithms
- –zstd-compression-level
- C API 函数 mysql_options() 的参数
- MYSQL_OPT_COMPRESSION_ALGORITHMS
- MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
CHANGE MASTER TO从 8.0.23 版本开始,CHANGE MASTER TO 已经替换成 CHANGE REPLICATION SOURCE TO。
MASTER_COMPRESSION_ALGORITHMSMASTER_ZSTD_COMPRESSION_LEVEL
- CHANGE REPLICATION SOURCE TO
- SOURCE_COMPRESSION_ALGORITHMS
- SOURCE_ZSTD_COMPRESSION_LEVEL
- 组复制的系统变量
- group_replication_recovery_compression_algorithm
- group_replication_recovery_zstd_compression_level
- 系统变量
- 压缩算法
- zlib
- zstd
- 允许的压缩级别是 1-22,默认级别是3
- uncompressed
- 允许不压缩 (可能压缩,也可能不压缩)
- 算法协商过程
为了成功建立连接,连接双方必须在相互允许的压缩算法上达成共识。算法协商过程先尝试使用 zlib,然后使用 zstd,然后未压缩。如果双方找不到通用算法,则连接尝试将失败。
-
配置方法
根据算法的协商过程,在服务器端配置连接压缩后,在客户端也要配置相同的算法,否则是不会使用压缩连接的。
配置的选项值是一个压缩算法列表,多个压缩算法之间用逗号分隔,不区分大小写,无特定顺序。
- 服务器端
- 修改配置文件
[mysqld] protocol_compression_algorithms=zlib,zstd,uncompressed
- 动态设置
mysql> SET PERSIST protocol_compression_algorithms='zlib,zstd,uncompressed';
Note: SET PERSIST 动态设置变量,并保存该值,下次重启仍然生效。如果不保存该值,可以使用 GLOBAL 关键字。
-
主从复制时指定
CHANGE REPLICATION SOURCE TO SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd', SOURCE_ZSTD_COMPRESSION_LEVEL = 7;
Note: 前提是,假设系统变量 slave_compressed_protocol 未开启。slave_compressed_protocol 的优先级更高。
- 修改配置文件
-
客户端
- 修改配置文件
[mysql] # 建立连接 user=root #host=172.16.0.40 password=root #protocol=TCP #port=3306 socket=/tmp/mysql.sock # 加密连接 ssl_mode=PREFERRED # 连接压缩 compression_algorithms=zstd,uncompressed zstd_compression_level=3
Note: 这是客户端的配置文件,用于连接到服务器端,与服务器端的配置文件可以不是同一个文件。
-
在命令行中指定选项
shell> mysql -uroot -p -S /tmp/mysql.sock --compression-algorithms=zstd,uncompressed --zstd-compression-level=4
- 修改配置文件
- 服务器端
配置旧版连接压缩
这些配置选项适用于 8.0.18 版本之前的连接压缩。
- 控制压缩
- 命令行选项
- –compress
- C API 函数 mysql_options() 的参数
- MYSQL_OPT_COMPRESS
- 主从复制的系统变量
- slave_compressed_protocol
- 命令行选项
- 压缩算法
- zlib (旧版只支持 zlib 算法)
- 配置方法
略。方法是一样的,只是使用的选项名称不同、压缩算法不同。
监控连接压缩
-
状态变量
- Compression={ON|OFF}
- Compression_algorithm
- Compression_level
- 系统变量
- protocol_compression_algorithms
- 客户端命令
- \status, \s
- 对于主从复制的连接
- 系统表
- performance_schema.replication_connection_configuration
COMPRESSION_ALGORITHMS 和 ZSTD_COMPRESSION_LEVEL 这两列分别显示压缩算法和 zstd 压缩级别。
-
mysql.slave_master_info
Master_compression_algorithms 和 Master_zstd_compression_level 这两列,分别显示压缩算法和压缩级别。
- performance_schema.replication_connection_configuration
-
master.info文件8.0 版本已经删除这个文件,改为使用上面介绍的 mysql.slave_master_info 系统表记录相关信息。
- 系统表