文章目录
- [1. MySQL 服务器简介](#1. MySQL 服务器简介)
-
- [1.1 服务器配置和默认值](#1.1 服务器配置和默认值)
- [1.2 系统变量和选项](#1.2 系统变量和选项)
-
- [1.2.1 简介](#1.2.1 简介)
- [1.2.2 常用选项](#1.2.2 常用选项)
- [1.3 使用系统变量](#1.3 使用系统变量)
- [1.4 示例:服务器常用配置](#1.4 示例:服务器常用配置)
- [1.5 查看状态变量](#1.5 查看状态变量)
1. MySQL 服务器简介
通常所说的
MySQL服务器指的是mysqld程序,当运行mysqld后对外提供MySQL服务,这个专题的内容涵盖了以下关于MySQL服务器以及相关配置的内容,包括:
- 服务器支持的启动选项。可以在命令行和配置文件中指定这些选项。
- 服务器系统变量。反映了启动选项的当前状态和值,其中一些变量可以在服务器运行时修改。【系统变量可以修改】
- 服务器状态变量。这些变量包含了有关运行时操作的计数器和统计信息。【状态变量不能被修改,只是代表当前状态而已,是一个指示器】
- 服务器如何管理客户端连接。
- 配置和使用时区支持。
- 服务器端帮助功能。
1.1 服务器配置和默认值
mysqld有很多选项和系统变量可以在启动时进行配置,要查看服务器的默认选项和系统变量值,可以执行以下命令:
mysql
# 查看所有mysqld 选项和可配置的系统变量列表及默认值
root@guangchen-vm:/var/lib/mysql# mysqld --verbose --help
# 内容看起来像这样
abort-slave-event-count 0
allow-suspicious-udfs FALSE
archive ON
auto-increment-increment 1
auto-increment-offset 1
autocommit TRUE
automatic-sp-privileges TRUE
avoid-temporal-upgrade FALSE
back-log 80
basedir /usr/
... 省略
tmpdir /tmp
transaction-alloc-block-size 8192
transaction-isolation REPEATABLE-READ
transaction-prealloc-size 4096
transaction-read-only FALSE
transaction-write-set-extraction XXHASH64
updatable-views-with-limit YES
validate-user-plugins TRUE
verbose TRUE
wait-timeout 28800
查看服务器在运行时系统变量的值,连接到MySQL并执行以下语句:
mysql
mysql> SHOW VARIABLES;
因为太多了,就不截图了,而且因为太多,可读性就差了,所以我们也可以:
mysql
mysql> SHOW VARIABLES like 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir | /tmp |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
如果实在记不住,也可以使用通配符:这个也是我们更加通用的场景
mysql
mysql> SHOW VARIABLES like '%tmp%';
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| default_tmp_storage_engine | InnoDB |
| innodb_tmpdir | |
| internal_tmp_mem_storage_engine | TempTable |
| replica_load_tmpdir | /tmp |
| slave_load_tmpdir | /tmp |
| tmp_table_size | 16777216 |
| tmpdir | /tmp |
+---------------------------------+-----------+
7 rows in set (0.00 sec)
mysql>
查看服务器在运行时的一些统计和状态指示器,连接到MySQL并执行以下语句:
mysql
mysql> SHOW STATUS;
系统变量和状态信息也可以使用 mysqladmin命令来查看:
mysql
root@guangchen-vm:~# mysqladmin variables -uroot -p
root@guangchen-vm:~# mysqladmin extended-status -uroot -p
关于服务器的选项、系统变量、状态变量参考以下官网列表
这里简单解释一下对应网页的表头:
mysql
Name Cmd-Line Option File System Var Status Var Var Scope Dynamic
变量名 是否支持CMD 是否支持选项文件 是不是一个系统变量 是不是一个状态变量 作用域 是否支持动态修改

注意:系统变量、状态变量的作用域分为:
Global(全局),Session(当前会话或连接),或 两者都支持

1.2 系统变量和选项
1.2.1 简介
当通过
mysqld启动数据库服务器时,可以通过选项文件或命令行中提供选项,但是,在大多数情况下,为确保服务器每次运行时都使用相同的选项,最好的方法是在选项文件中指定相应的选项。
mysqld从选项文件中的[mysqld]和[server]组(节点)中读取选项内容
不过除了mysqld,还有其他的服务端启动脚本:这两个脚本都会先读取server这个里面的内容,再去读取各自的内容。

mysqld接受的选项可以通过mysqld --verbose --help查看,列表中的有些项目是可以在服务器启动时设置的系统变量,系统变量可以在连接MySQL后使用SHOW VARIABLES;语句查看,但有些内容只在--help中存在,使用SHOW VARIABLES时并没有显示,这是因为它们只是选项而不是系统变量。(也可以去官方文档查看)
mysqld --verbose --help:显示选项与系统变量SHOW VARIABLES;:只显示系统变量注意:选项值可以通过命令行和选项文件设置,部分系统变量可以通过
SET语句动态设置值。
1.2.2 常用选项
| 选项 | 系统变量 | 说明 |
|---|---|---|
--character-set-server |
character_set_server |
服务器的默认字符集,默认 utf8mb4 ,如果设置了这个变 量,还应该设置 collation_server 来指定字符集的排 序规则。MySQL8.0之前版本默认字符集是 latin1(这个字符集不能保存中文) ,建议明确指定此选项为 utf8mb4 |
--collation-server |
collation_server |
服务器的默认排序,默认utf8mb4_0900_ai_ci utf8mb4:编码集 0900:表示unicode的版本是9 ai = accent insensitive重音不敏感,as是重音不敏感 ci = case insensitive大小写不敏感,cs是大小写敏感 |
--port |
port |
MySQL服务启动后监听的端口号 |
--datadir |
datadir |
MySQL服务器的数据目录 |
--default-storage-engine |
default_storage_engine |
表的默认存储引擎 |
--log-output |
log_output |
一般查询日志和慢速查询日志输出的目的地,值可以是 TABLE , FILE 和 NONE ,可以同时指定多个值, NONE 的优先级最高 |
--general-log |
general_log |
是否启用一般查询日志。值为 0 (或 OFF )禁用日志,为 1 (或 ON )来启用日志。日志输出目录由 log_output 系 统变量控制 |
--general-log-file |
general_log_file |
一般查询日志文件的名称(一般指定的是绝对路径)。默认值是host_name.log |
--slow-query-log |
slow_query_log |
是否启用慢查询日志。值为 0 (或 OFF )禁用日志,为 1 (或 ON )来启用日志。日志输出目录由 log_output 系 统变量控制 |
--slow-query-log-file |
slow_query_log_file |
慢查询日志文件的名称(一般指定的是绝对路径)。默认值是host_name-slow.log |
--long-query-time |
long_query_time |
如果查询花费的时间超过这个数秒,服务器将增加 Slow_queries状态变量,如果慢速查询日志开启,查询将 被记录到慢速查询日志文件中,默认值为10,单位为秒 |
--log-error |
log_error |
默认的错误日志目标。如果目标是控制台值为 stderr , 目标是一个文件,值为具体的文件名(一般指定的是绝对路径) |
--log-bin |
N/A |
指定用于二进制日志文件的基本名称 |
--server-id |
server_id |
该变量指定服务器ID,默认为 1 。集群环境中server-id不能重复 |
--max-connections |
max_connections |
允许客户端同时连接的最大数,可以理解为MySQL服务器支持的最大并发数 |
--table-open-cache |
table_open_cache |
所有线程可以打开的表的数量 |
--innodb-log-buffer-size |
innodb_log_buffer_size |
InnoDB向磁盘写入日志文件的缓冲区大小,默认16MB |
--innodb-buffer-pool-size |
innodb_buffer_pool_size |
InnoDB缓存表和索引数据的缓冲区大小,默认128MB |
--innodb-redo-log-capacity |
innodb_redo_log_capacity |
重做日志文件占用的磁盘空间 |
--innodb-thread-concurrency |
innodb_thread_concurrency |
定义InnoDB内部允许的最大线程数,默认值 0 ,多用于高性能机器上的调优 |
--innodb-autoextend-increment |
innodb_autoextend_increment |
自动扩展InnoDB系统表空间文件的增量大小(以兆为单 位)。默认值为64。 |
--flush-time |
flush_time |
如果将该值设置为非零值,则每flush_time秒关闭一次所 有表,以释放资源并将未刷新的数据同步到磁盘。 |
--join-buffer-size |
join_buffer_size |
用于普通索引扫描、范围索引扫描和不使用索引从而执行 全表扫描的连接的缓冲区的最小大小,默认256KB |
--max-allowed-packet |
max_allowed_packet |
一个数据包的最大 小,默认值是64MB。 |
--max-connect-errors |
max_connect_errors |
来自客户端主机连续连接请求失败数达到指定值后,服务 器将阻止该客户端的连接。 |
--open-files-limit |
open_files_limit |
mysqld在操作系统中可用的文件描述符的数量 |
--sort-buffer-size |
sort_buffer_size |
每个必须执行排序的会话分配的缓冲区大小 |
--binlog-row-event-max-size |
binlog_row_event_max_size |
当记录基于行的二进制日志时,设置事件的最大值,必须 是256的倍数,默认值8192字节,如果事件不能分割,则 可能超过最值。 |
1.3 使用系统变量
以上我们介绍了通过选项文件和命令行设置相应系统变量的值,设置系统变量的语法与命令选项的语法相同,指定变量名称时,中间的破折号和下划线可以互换使用。
例如,
--general_log=ON和--general-log=ON是等价的。当使用选项设置一个数值的变量时,可以带有后缀
K、M或G(大小写不限)表示1024、1024^2或1024^3。从
MySQL 8.0.14开始,后缀也可以用T、P和E来表示1024^4、1024^5或1024^6。示例:为服务器指定
256 KB的排序缓冲区大小和1 GB的最大数据包大小
mysql
# 在命令行的指定
mysqld --sort-buffer-size=256K --max-allowed-packet=1G
# 在选项文件中指定
[mysqld]
sort_buffer_size=256k
max_allowed_packet=1g
# 主要目的就是在硬件环境充裕的情况下压榨性能
系统变量有两个作用域,分别是
Global(全局)和Session(会话)。
Global全局变量影响服务器的整体操作,Session会话变量影响各个客户端连接的操作。给定的系统变量可以同时具有全局值和会话值,它们的关系如下:
服务器启动时,会将每个全局变量初始化并设置默认值,具体的值可以通过命令行或选项文件更改。
服务器为每个客户端维护一组
Session变量,在客户端连接时使用相应全局变量的当前值进行初始化,也可以自己在单独的文件里面设置调整。大部分系统变量是动态的,在服务器运行时可以通过
SET语句动态更改,并且无需停止和重新启动服务器。在服务器运行时,使用
SET语句设置系统变量,需要指定作用域【因为有些变量只有特定的作用域才生效,自己指定可以更加精准的执行,避免出现意外bug,也可以防止想改session的时候把global也改了】(也可以在前面加上@@修饰符),然后指定系统变量的名称,名称必须使用下划线而不是破折号。
如下所示:设置全局系统变量最大连接数为1000
mysql
mysql> SET GLOBAL max_connections = 1000;
mysql> SET @@GLOBAL.max_connections = 1000;
记得先查一下默认值,防止改不回来了:
mysql
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>

将全局系统变量持久化到
mysqld-auto.cnf文件(同时设置运行时值):不过默认情况下,这个文件在数据目录下是不存在的,只有通过执行
SET PERSIST语句之后才自动生成。没有这个文件是执行不了的。
一开始:没有这个文件

执行:

然后出现这个文件:

mysql
# PERSIST 表示持久化的同时设置全局变量的值
mysql> SET PERSIST max_connections = 1000;
mysql> SET @@PERSIST.max_connections = 1000;
然后查看文件值:
shell
root@yudukai:/var/lib/mysql# cat mysqld-auto.cnf
{"Version": 2, "mysql_dynamic_parse_early_variables": {"max_connections": {"Value": "1000", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1778479176629805}}}}root@yudukai:/var/lib/mysql#
将全局系统变量持久化到
mysqld-auto.cnf文件(不设置运行时值):就是设置下次启动的时候生效,但是本次不生效。
mysql
# PERSIST 表示持久化的同时设置全局变量的值
mysql> SET PERSIST_ONLY max_connections = 1000;
mysql> SET @@PERSIST_ONLY.max_connections = 1000;
删除持久化的系统变量可以使用语句:
mysql
RESET PERSIST IF EXISTS system_var_name;
例如:
mysql
mysql> RESET PERSIST IF EXISTS max_connections;
Query OK, 0 rows affected (0.00 sec)
mysql>
然后查看:
mysql
root@yudukai:/var/lib/mysql# cat mysqld-auto.cnf
{"Version": 2}root@yudukai:/var/lib/mysql#
设置
Session系统变量,时区为"+8:00":
mysql
mysql> SET SESSION time_zone='+8:00'; # SESSION只针对当前的l
mysql> SET @@SESSION.time_zone='+8:00';
mysql> SET @@time_zone='+8:00';
先查看目前的时区:
mysql
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | SYSTEM |
+---------------+--------+
1 row in set (0.01 sec)
mysql> SET SESSION time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +08:00 |
+---------------+--------+
1 row in set (0.00 sec)
mysql> show session variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +08:00 |
+---------------+--------+
1 row in set (0.00 sec)
mysql> show global variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | SYSTEM |
+---------------+--------+
1 row in set (0.00 sec)
mysql>
不过需要注意:time_zone只是是个系统变量,无法在选项文件和命令行配置,如果需要在后两者配置的话,需要使用default-time_zone。
- 对于数值型的系统变量,用带有后缀的值指定时,只适用于选项方式,而不能用在
SET方式中;SET方式可以使用表达式为系统变量指定值,而在选项方式中不允许,如下所示:
mysql
# 选项形式,其实很好理解,这个是文本,里面可以解析单位
root@guangchen-vm:~# mysqld --max_allowed_packet=16M # 允许
root@guangchen-vm:~# mysqld --max_allowed_packet=16*1024*1024 # 不允许计算
# 运行时SET形式,这个是运行时环境,本身支持计算
mysql> SET GLOBAL max_allowed_packet=16M; # 不允许写单位
mysql> SET GLOBAL max_allowed_packet=16*1024*1024; # 允许计算
说明:在设置全局变量时需要指定
GLOBAL关键字的原因是为了防止出现以下问题:
- 如果要删除的
SESSION变量与GLOBAL变量名相同,那么具有修改全局变量权限的客户端可能会意外地更改GLOBAL变量,而不仅仅是只修改SESSION变量。- 如果已经有一个
SESSION变量而且与GLOBAL变量同名,那么本意是要修改GLOBAL变量,可能只是修改了SESSION变量的值所以没有明确指定
GLOBAL和SESSION时,对于当前客户端来说SESSION的优先级更高
6. 要显示系统变量名称和值,请使用以下SHOW VARIABLES语句:
mysql
mysql> SHOW VARIABLES;
- 可以使用
LIKE子句显示与指定内容匹配的变量,也可以使用通配符
mysql
# 查看指定的系统变量
SHOW VARIABLES LIKE 'max_join_size';
# 查看指定系统变量SESSION作用域的值
SHOW SESSION VARIABLES LIKE 'max_join_size';
# 查看包含指定内容的系统变量
SHOW VARIABLES LIKE '%size%';
# 查看包含指定内容系统变量的GLOBAL作用域的值
SHOW GLOBAL VARIABLES LIKE '%size%';
一部分系统变量是内置的,也有一些需要通过安装服务器插件或组件才可以使用
- 比如用于审计插件
audit_log实现了名为audit_log_policy的系统变量- 错误日志过滤组件
log_filter_dragnet实现了名为log_error_filter_rules的系统变量。
1.4 示例:服务器常用配置
Linux系统下编辑:/etc/mysql/my.cnf
Windows系统下打开:C:/ProgramData/MySQL/MySQL Server 8.0/my.ini注意:
- 编辑前先备份原始文件
- 如果要修改数据目录选项建议先停止
MySQL服务,并把原data目录整体复制到新路径,配置完成后重启服务在 `mysqld` 节点下添加以下内容:
mysql
# MySQL 服务节点
[mysqld]
# MySQL 服务启动后监听的端口号,如果数据库服务在公网部署,建议修改默认端口号
port=3306
# 数据目录的路径,这里演示的是windows下的配置,注意分隔符用/,如果是\则需要转义为\\.
# 为什么要修改呢?因为这个东西的数据会越来越大,直到占满C盘,导致系统卡顿无法启动。
# 把原data目录整体复制到新路径
# 为什么要拷贝,不新建一个文件夹呢?因为MySQL数据库安装的过程中设置的一些东西会保存到对应的文件里面去,不整体复制的话,下次一些默认启动参数和密码没有就会导致服务器启动失败
datadir=D:/database/MySQL/data8.0
# MySQL 服务器的字符集与排序规则
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
# 新建表时使用的存储引擎,windows下已默认配置,最后一行需要换行,不然有的系统可能不会生效
default_storage_engine=INNODB
Linux查看datadir对应目录:
mysql
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
mysql>
在修改
datadir的时候可能出现权限问题,这个时候可以把对应权限改成MySQL。也就是改用户和用户组。

1.5 查看状态变量
MySQL服务器维护着当前系统信息的状态变量可以使用
SHOW [GLOBAL | SESSION] STATUS [like status_name];语句查看这些变量和对应的值。
GLOBAL显示所有连接的值,SESSION显示当前连接的值。
mysql
mysql> SHOW GLOBAL STATUS;
+-----------------------------------+------------+
| Variable_name | Value |
+-----------------------------------+------------+
| Aborted_clients | 0 | #未正确关闭连接而中止的连接数
| Aborted_connects | 0 | #连接MySQL服务器失败的次数
| Bytes_received | 155372598 | #从所有客户端接收的字节数
| Bytes_sent | 1176560426 | #发送给所有客户端的字节数
...
| Connections | 30023 | #尝试连接到MySQL服务器的次数,不论成功或失败
| Created_tmp_disk_tables | 0 | #创建内部磁盘临时表的数量
| Created_tmp_files | 3 | #创建了临时文件的数量
| Created_tmp_tables | 2 | #创建内部临时表的数量
...
| Threads_created | 217 | #为处理连接而创建的线程数
| Threads_running | 88 | #未休眠的线程数
| Uptime | 1389872 | #服务器已启动的秒数
+-----------------------------------+------------+