当前位置: 首页 > news >正文

【MySQL进阶】服务器配置与管理——系统变量,选项,状态变量

目录

一.mysql服务器简介

二. 服务器配置和默认值

三.系统变量和选项 

3.1 简介 

3.2.常用选项

四.使用系统变量

五.服务器常用配置

六.查看状态变量


 

  在这个专题里面,我们将讲解下面这些内容

  1. 了解数据目录和服务器基本配置
  2. 了解mysql System Schema
  3. 了解服务器日志文件
  4. 了解单机管理多台服务器(例如同一台机器运行mysql5.7和mysql8.0)

一.mysql服务器简介

我们通常所说的MySQL服务器指的是mysqld程序,这后面这个d就是daemon的意思,也就是守护进程的意思,当运⾏mysqld后对外提供MySQL服务。

这个专 题的内容涵盖了以下关于MySQL服务器以及相关配置的内容,包括:

  1. 服务器⽀持的启动选项。可以在命令⾏和配置⽂件中指定这些选项。我们可以在配置文件里面加上[mysqld]来对服务器启动选项进行配置。
  2. 服务器系统变量。系统变量反映了启动选项的当前状态和值,其中⼀些变量可以在服务器运⾏时修改。系统变量可以被修改的。
  3. 服务器状态变量。这些变量包含了有关运⾏时操作的计数器和统计信息。状态变量不能被修改,只是表示的当前状态,只是一个指示器。
  4. 服务器如何管理客⼾端连接。
  5. 配置和使⽤时区⽀持。
  6. 服务器端帮助功能。

二. 服务器配置和默认值

事实上,我们的mysql服务器启动时是需要一些配置的,但是我们发现我们自己好像从来没有配置过mysql服务器,事实上,mysqld的有些配置是有默认值的。

mysqld有很多选项和系统变量可以在启动时进⾏配置,要查看服务器的默认选项和系统变量值, 可以执⾏以下命令:

mysqld --verbose --help

 此处省略大部分内容


查看服务器在运⾏时系统变量的值,连接到MySQL并执⾏以下语句

SHOW VARIABLES;

 

我们发现有相当多内容。

 这么多状态,我们找我们想要的那个变量会很麻烦,所以我们可以像下面这样子找

SHOW VARIABLES like 'tmpdir';

如果说我们只记得tmp这三个字母,那我们应该怎么办?

没事,我们可以借助通配符。

  • MYSQL 通配符

通配符用于替换字符串中的一个或多个字符。

通配符与 LIKE 运算符一起使用。 LIKE 运算符在 WHERE 子句中用于搜索列中的指定模式。

  • MySQL 中的通配符
符号描述示例
%代表零个或多个字符bl% 找到 bl、black、blue 和 blob
_代表单个字符h_t 查找 hot、hat 和 hit

通配符也可以组合使用!

以下是一些示例,展示了带有 '%' 和 '_' 通配符的不同 LIKE 运算符:

LIKE 运算符描述
WHERE CustomerName LIKE 'a%'查找以"a"开头的任何值
WHERE CustomerName LIKE '%a'查找以"a"结尾的任何值
WHERE CustomerName LIKE '%or%'查找在任何位置有"或"的任何值
WHERE CustomerName LIKE '_r%'查找第二个位置有"r"的任何值
WHERE CustomerName LIKE 'a_%_%'查找以"a"开头且长度至少为 3 个字符的任何值
WHERE ContactName LIKE 'a%o'查找以"a"开头并以"o"结尾的任何值

回到上面那个问题 

SHOW VARIABLES like '%tmp%';

 

这样子我们是不是也找到这个tmpdir了?


查看服务器在运⾏时的⼀些统计和状态指⽰器,连接到MySQL并执⾏以下语句: 

SHOW STATUS;

事实上这的内容也非常多 


系统变量和状态信息也可以使⽤mysqladmin命令来查看: 

mysqladmin variablesmysqladmin extended-status

关于服务器的选项,系统变量,状态信息等,官网上都有详细介绍:MySQL :: MySQL 8.0 Reference Manual :: 7.1.4 Server Option, System Variable, and Status Variable Reference

 动态设置的意思就是不用关闭mysql就可以修改的。

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

怎么理解Global和Session呢?

咱们用一个生活中的比喻来解释,保证通俗易懂:

想象一下你管理一栋很大的办公楼(这栋楼就是 MySQL 服务器)。

  1. 全局变量 (GLOBAL) 就像大楼的公共规则:

    • 作用范围: 整栋大楼里所有新来的员工(新的数据库连接,也就是所有的Session)。

    • 怎么设置: 你是大楼管理员。你在公告栏贴了一张新规定(修改 my.cnf 配置文件并重启大楼服务),或者你用大楼广播临时宣布一个新规则 (SET GLOBAL ...)。

    • 影响谁:

      • 你贴公告或广播后新入职的员工,一进大楼就必须遵守这个新规则。

      • 已经在楼里办公的老员工? 这个新规则对他们暂时没影响!他们还在按老规矩办事。只有等他们下班回家(断开连接),第二天再来(重新连接)时,才会遵守新规则。

    • 例子:

      • max_connections = 500: 大楼最多只允许同时有 500 个员工在里面工作(最大连接数)。这是大楼的总容量,管理员设置的。

      • innodb_buffer_pool_size = 4G: 大楼的中央资料库(内存缓存区)总共分配了 4GB 的空间给所有部门共享。这也是管理员设置的。

  2. 会话变量 (SESSION) 就像每个员工自己的小习惯:

    • 作用范围: 只影响这个员工自己(当前的这一个数据库连接)。

    • 怎么设置: 员工在自己的工位(当前连接里)给自己定了个小规矩 (SET SESSION ... 或 SET ...)。

    • 影响谁:

      • 只影响这个员工自己! 他旁边的同事完全不受影响。其他员工可能遵守大楼规则,也可能有他们自己的小习惯。

      • 员工刚入职(刚建立连接)时,默认会遵守大楼的公共规则(继承全局变量的值)。但他可以随时根据自己的喜好或工作需要,在自己工位范围内改一下 (SET SESSION ...)。

    • 例子:

      • sql_mode = 'STRICT_TRANS_TABLES': 这个财务部的员工小王,做事特别严谨(严格SQL模式),要求自己录入的数据必须完全准确。这只影响他自己提交的数据检查,不影响市场部大大咧咧的小李。

      • time_zone = '+08:00': 销售部的小张主要对接北京时间客户,他把自己的电脑时区(会话时区)设成了北京时间,方便看订单时间。这只影响他自己看到的时间显示,服务器和其他同事看到的还是标准时间(全局时区)。

      • autocommit = 0: 开发部的小赵在做一系列复杂的数据库操作,他暂时关闭了自己工位的“自动提交”功能,等所有步骤做完没问题再一次性提交。这只影响他自己的操作,其他同事的自动提交功能依然开着。

  3. “两者都支持”是什么意思?

    • 有些规则,既可以由大楼管理员统一制定(全局)也可以由员工个人微调(会话)

    • 大楼规则是基础: 新员工来了默认遵守这个(全局值)。

    • 员工可以个性化: 员工可以在自己工位上改(会话值),覆盖掉大楼给他的默认值,但只影响他自己

    • 例子:

      • wait_timeout = 28800: 大楼规定,如果一个员工在工位上发呆(连接空闲)超过 8 小时,保安会清场(断开连接)。这是全局规则。

      • 程序员小刘正在跑一个超长计算,中间可能要休息很久。他怕被踢出去,就给自己设了 SET SESSION wait_timeout = 86400 (24小时)。这样只有他能发呆一整天不被踢,其他员工还是 8 小时限制。这就是在全局规则基础上,做的个性化会话设置

如果说你只想了解系统变量,那可以去:MySQL :: MySQL 8.0 Reference Manual :: 7.1.4 Server Option, System Variable, and Status Variable Reference

如果你只想了解状态变量,那可以去:

MySQL :: MySQL 8.0 Reference Manual :: 7.1.4 Server Option, System Variable, and Status Variable Reference

三.系统变量和选项 

3.1 简介 

  1. 当通过mysqld启动数据库服务器时,可以通过选项⽂件或命令⾏中提供选项,但是,在⼤多数情 况下,为确保服务器每次运⾏时都使⽤相同的选项,最好的⽅法是在选项⽂件中指定相应的选项。
  2. mysqld从配置(选项)⽂件中的 [mysqld] 和 [server] 组(节点)中读取选项内容
  3. mysqld接受的选项可以通过 mysqld --verbose --help 查看,列表中的有些项⽬是可以在 服务器启动时设置的系统变量,系统变量可以在连接MySQL后使⽤ 看,但有些内容只在--help 中存在,使⽤ SHOW VARIABLES 语句时并没有显⽰,这是因为它们只是选项⽽不是系统变量。

注意:选项值可以通过命令⾏和选项⽂件设置,部分系统变量可以通过SET语句动态设置值

说到 配置文件里面的[server],大家可能好奇?明明我们的mysql服务端只有mysqld一个啊,我有了[mysqld] 不就行了吗,干嘛还要[server]?

事实上,mysqld启动时还会借助一些启动脚本,我们可以看看

这两个程序启动之后,都会先去配置文件里面读取[server]组里面的内容,再去读取专属于自己的选项,比如[mysqld_multi],[mysql_safe]的

我这里不想过多介绍这两个东西,想要了解这两个程序的可以去官网:MySQL :: MySQL 8.0 Reference Manual :: 6.1 Overview of MySQL Programs

3.2.常用选项

只有是选项的才能被写入配置文件。

下面这些选项都来自官网:MySQL :: MySQL 8.0 Reference Manual :: 7.1.4 Server Option, System Variable, and Status Variable Reference

选项系统变量说明
--character-set-servercharacter_set_server服务器的默认字符集,默认 utf8mb4,如果设置了这个变量,还应该设置 collation_server 来指定字符串的排序规则。MySQL8.0之前版本默认字符集是 latin1(不支持中文),建议明确指定此选项为 utf8mb4
--collation-servercollation_server

服务器的默认排序,默认utf8mb4_0900_ai_ci

utf8mb4:这个是编码集。

解释utf8mb4_0900_ai_ci

0900:基于 Unicode 9.0 标准

a:Accent Insensitive(口音不敏感)

i:Case Insensitive(大小写不敏感)

ciCase Insensitive(大小写不敏感)
与 ai 中的 i 作用相同,此处是冗余强调(MySQL 命名规则遗留)。

--portportMySQL服务启动后监听的端口号,默认是3306
--datadirdatadir

MySQL服务器的数据目录,这个目录是非常重要的,我们所有的库的信息都会存放到这里面去。

我们linux系统下的默认的数据目录是/var/lib/mysql

--default-storage-enginedefault_storage_engine表的默认存储引擎。mysql8.0存储引擎默认是innodb。
--log-outputlog_output一般查询日志和慢速查询日志输出的目的地(目的地就是以什么形式进行保存),值可以是 TABLE,FILE 和 NONE,可以同时指定多个值,NONE 的优先级最高
--general-loggeneral_log是否启用一般查询日志。值为 0 (或 OFF)禁用日志,为 1 (或 ON)来启用日志。日志输出目录由 log_output 系统变量控制
--general-log-filegeneral_log_file一般查询日志文件的名称。默认值是host_name.log。这里一般指定绝对路径。
--slow-query-logslow_query_log是否启用慢查询日志。值为 0 (或 OFF)禁用日志,为 1 (或 ON)来启用日志。日志输出目录由 log_output 系统变量控制
--slow-query-log-fileslow_query_log_file慢查询日志文件的名称。默认值是host_name-slow.log。这里一般指定绝对路径。
--long-query-timelong_query_time

这个就是我们慢查询的阈值。

如果某个查询花费的时间超过这个数秒,这个查询就会被判定是慢查询,服务器将增加 Slow_queries状态变量,如果慢速查询日志开启,查询将被记录到慢速查询日志文件中,默认值为10,单位为秒

--log-errorlog_error默认的错误日志目标。如果目标是控制台值为 stderr,目标是一个文件,值为具体的文件名。这里一般指定绝对路径。
--log-binN/A

指定用于二进制日志文件的基本名称(就是下面这个的binlog)

(默认是binlog.00000*,我们可以将这个binlog修改成别的东西)

--server-idserver_id该变量指定服务器ID,默认为 1。在集群环境中,server_id不能重复。
--max-connectionsmax_connections允许客户端同时连接的最大数。可以理解为mysql服务器支持的最大并发,默认值是150.
--table-open-cachetable_open_cache所有线程可以打开的表的数量
--innodb-log-buffer-sizeinnodb_log_buffer_sizeInnODB向磁盘写入日志文件的缓冲区大小,默认16MB
--innodb-buffer-pool-sizeinnodb_buffer_pool_sizeInnODB缓存表和索引数据的缓冲区大小,默认128MB
--innodb-redo-log-capacityinnodb_redo_log_capacity重做日志文件占用的磁盘空间
--innodb-thread-concurrencyinnodb_thread_concurrency定义InnoDB内部允许的最大线程数,默认值 0,多用于高性能机器上的调优
--innodb-autosxtend-incrementinnodb_autosxtend_increment自动扩展InnoDB系统表空间文件的增量大小(以兆为单位),默认值为64。
--flush-timeflush_time如果将该值设置为非零值,则每flush_time秒关闭一次所有表,以释放资源并将其新的数据同步到磁盘。
--join-buffer-sizejoin_buffer_size用于普通索引扫描、范围索引扫描和不使用索引从而执行全索引指的连接的缓冲区的最小大小,默认256KB
--max-allowed-packetmax_allowed_packet一个数据包的最大大小,默认值是64MB。
--max-connect-errorsmax_connect_errors来自客户端主机连续连接请求失败数达到指定值后,服务器将阻止该客户端的连接。
--open-files-limitopen_files_limitmysqld在操作系统中可用的文件描述符的数量
--sort-buffer-sizesort_buffer_size每个必须执行排序的会话分配的缓冲区大小
--binlog-row-event-max-sizebinlog_row_event_max_size当记录基于行的二进制日志时,设置事件的最大值,必须是256的倍数,默认值8192字节,如果事件不能分割,则可能超过最值

我们只讲最常用的选项。

 这里补充一下:关于utf8mb4_0900_ai_ci的_ai_ci我们应该怎么理解?

官网其实有:MySQL :: MySQL 8.0 Reference Manual :: 12.3.1 Collation Naming Conventions

  • _ai:口音不敏感
  • _as:口音敏感
  • _ci:大小写不敏感
  • _cs:大小写敏感
  • _ks:针对日文的,我们不管
  • _bin:二进制

四.使用系统变量

首先我们需要明白,我们为什么要去使用系统变量?使用什么系统变量,将其设置成什么值?

事实上,我们安装完mysql之后,系统就会配置一些默认的系统变量,这些变量在应对一些小项目的时候还是够用的,但是当项目变的大了起来了,这些配置都显得不够看了,我们需要修改这些选项。


1.以上我们介绍了通过选项文件和命令行设置相应系统变量的值,设置系统变量的语法与命令选项的语法相同,指定变量名称时,在选项文件里面,破折号和下划线可以互换使用(仅仅限制于中间的破折号,下划线)。例如,--general_log=ON和 --general-log=ON 是等价的。

  • 仅允许在变量名中间部分用破折号-替代下划线_(如--general-log ↔ --general_log),但开头和结尾必须严格使用下划线
  • 错误示例--max-connections(合法,中间破折号) vs -max_connections(非法,开头破折号)
  • 注意:通过SET语句动态修改变量时,必须使用下划线格式
SET GLOBAL max_allowed_packet = 1G;  -- 合法
SET GLOBAL max-allowed-packet = 1G;  -- 非法!

所以,我们这里统一使用下划线的情况,不使用破折号。 


2.当使用选项设置一个数值的变量时,可以带有后缀K、M或G(大小写不限)表示1024、1024^2或1024^3;从MySQL8.0.14开始,后缀也可以用T、P和E来表示1024^4、1024^5或1024^6。

示例:为服务器指定256KB的排序缓冲区大小和1GB的最大数据包大小

#在命令行的指定mysqld --sort-buffer-size=256K --max-allowed-packet=1G#在选项文件中指定
[mysqld]
sort_buffer_size=256k
max_allowed_packet=1g

3.系统变量有两个作用域,分别是Global(全局)和Session(会话),Global全局变量影响服务器的整体操作,Session会话变量影响各个客户端连接的操作。

Global变量的初始值的设定可以通过两种方式来设定:

  1. 通过mysql的默认值
  2. 通过选项指定,这个分为选项文件指定和命令行指定(通过选项文件配置的优先级更高,会覆盖掉默认值)

Session作用域的初始值

  1. 全局变量的值
  2. 可以自己设置调整

给定的系统变量可以同时具有全局值和会话值,它们的关系如下:

  • 服务器启动时,会将每个全局变量初始化并设置默认值,具体的值可以通过命令行或选项文件更改。
  • 服务器为每个客户端维护一组Session 变量,在客户端连接时使用相应全局变量的当前值进行初始化。

4.大部分系统变量是动态的,在服务器运行时可以通过SET语句动态更改,并且无需停止和重新启动服务器。

在服务器运行时,使用SET语句设置系统变量,需要指定作用域(就是Global或者Session,也可以在前面加上@@修饰符),然后指定系统变量的名称,名称必须使用下划线而不是破折号。

我们可以去官网看看作用域:MySQL :: MySQL 8.0 Reference Manual :: 7.1.4 Server Option, System Variable, and Status Variable Reference

特别是上面这种作用域是Global和Session都影响的。我们使用SET语句设置这些系统变量时必须指定作用域

我们举了几个例子,如下所示:

  • a.设置全局系统变量最大连接数为1000

下面这个情况相同

SET GLOBAL max_connections = 1000;SET @@GLOBAL.max_connections=1000;

我们可以在修改这个变量之前,我们看看他原来的值是多少

我们使用破折号寻找这个变量,发现找不到。

我们将破折号修改成下划线,发现找到了。

SET GLOBAL max_connections = 1000;

我们发现修改成功了,我们在看另外一种方式修改回原来那个情况

SET @@GLOBAL.max_connections=151;

很好。

 所有可以动态设置的系统变量:MySQL :: MySQL 8.0 Reference Manual :: 7.1.9.2 Dynamic System Variables

  • b.将全局系统变量持久化到mysqld-auto.cnf文件(同时设置运行时值):

大家还记得这个mysqld-auto.cnf文件吗?我们可以看看

  • /var/lib/mysql/mysqld-auto.cnf
  • 在所有配置文件中,mysqld-auto.cnf的优先级最高

默认情况下面/var/lib/mysql/mysqld-auto.cnf是不存在的,只有通过执行SET PERSIST语句之后才自动生成,大家可以看到我这个/var/lib/mysql/目录下面还是没有生成这个mysqld-auto.cnf的

接下来我们来使用一下

#PERSIST表示持久化的同时设置全局变量的值
SET PERSIST max_connections = 1000;
或者
SET @@PERSIST.max_connections = 1000;

同时,这个命令会持久化到mysqld-auto.cnf文件

这个时候我们再回/var/lib/mysql/去看看什么情况,

我们打开这个文件看看

"Version": 2, "mysql_dynamic_parse_early_variables": {"max_connections": {"Value": "1000", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1750040939210670}}}

在 2025年6月16日 10:28:59.210670 (UTC),由 root 用户在 localhost 上,将 MySQL 服务器的一个 关键动态参数 max_connections 的值设置为 1000。这个设置发生在服务器启动早期阶段,意味着当前 MySQL 实例最多允许同时 1000 个客户端连接。这个配置信息记录使用的是格式版本 2。

  • c. 将全局系统变量持久化到 mysqld-auto.cnf 文件(不设置运行时值):
  • 不设置运行值的意思就是只有当mysql服务器重新启动的时候才会去这里读取。

注意上面那点是既设置运行时值,又持久化到mysqld-auto.cnf 文件,现在是只是持久化到 mysqld-auto.cnf 文件

# PERSIST 表示持久化的同时设置全局变量的值
mysql> SET PERSIST_ONLY max_connections = 151;
或者
mysql> SET @@PERSIST_ONLY.max_connections = 151;

我们来看看怎么使用

我们再去/var/lib/mysql/mysqld-auto.cnf看看什么情况?

vim /var/lib/mysql/mysqld-auto.cnf

我们发现它变成下面这样子了

{"Version": 2, "mysql_dynamic_parse_early_variables": {"max_connections": {"Value": "151", "Metadata": {"Host": "localhost", "User": "root", "Timestamp": 1750041590021904}}}

也就是说我们修改了配置文件。

这个时候我们可以退出mysql客户端,然后重新进入看看。

我们发现还是没有修改到。

这是因为这个/var/lib/mysql/mysqld-auto.cnf是给服务器配置使用的,但是我们启动的是mysql客户端,而只有服务器重新启动的时候才会去读取,但是mysqld一直在运行当中,所以不变。

  • 删除持久化的系统变量可以使用语句
RESET PERSIST IF EXISTS 系统变量名;

我们来看看怎么使用

RESET PERSIST IF EXISTS max_connections;

我们去配置文件那里看看,发现只有一个东西了

  • d. 设置 Session 作用域的系统变量

例如,我们将时区设置为"+8:00":

有下面三种办法

mysql> SET SESSION time_zone='+8:00';mysql> SET @@SESSION.time_zone='+8:00';mysql> SET @@time_zone='+8:00';

我们看看当前的时区是什么情况

跟随系统走的。接下来我们修改一下

我们说这个是session作用域的,也就是我们设置的这个东西,仅仅只对我们当前的这个连接生效的,当有新的连接到来的时候,还是会恢复到原来的设置。我们可以重新打开一个mysql客户端看看

我们发现另外一个连接的系统变量不受影响。

  • 我多说一嘴,这个time_zone只是一个系统变量,它不支持命令行和配置文件来配置。这个是需要注意的。

大家可以去官网看看:MySQL :: MySQL 8.0 Reference Manual :: 7.1.4 Server Option, System Variable, and Status Variable Reference

 

我们要是想在配置文件里面对这个time_zone进配置的话,我们可以借助default_time_zone这个选项来配置

 这个其实就是为了兼容以前的版本。


5. 对于数值型的系统变量,用带有后缀的值指定时,只适用于选项方式,而不能用在 SET 方式中; SET 方式可以使用表达式为系统变量指定值,而在选项方式中不允许

如下所示:

# 选项形式
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;             # 允许

这个其实也很好理解,配置文件是被当作文件去解析的,不支持什么计算。

而运行时环境,我们可以看看下面这个


 


6. 在设置全局变量时需要指定GLOBAL关键字的原因是为了防止出现以下问题:

  • 如果要删除的SESSION变量与GLOBAL变量名相同,那么具有修改全局变量权限的客户端可能会 意外地更改GLOBAL变量,而不仅仅是只修改SESSION变量。
  • 如果已经有一个SESSION变量而且与GLOBAL变量同名,那么本意是要修改GLOBAL变量,可能只是修改了SESSION变量的值

所以没有明确指定GLOBAL和SESSION时,对于当前客户端来说SESSION的优先级更高.

我们看看deepseek是怎么解释的。

🏢 想象一家公司(MySQL服务器)

  1. GLOBAL 变量: 就像贴在公司前台大厅的公告板。

    • 上面写着适用于全公司所有人的规定(比如:上班时间 = 9:00)。

    • 只有老板 (root) 或有权限的管理员才能修改这个公告板。

  2. SESSION 变量: 就像每个员工自己工位上的小记事贴

    • 员工可以自己写一些只对自己有效的临时规则(比如:今天喝咖啡提醒 = 下午2:00)。

    • 员工也可以临时覆盖公司公告板上的某些规定(比如:在自己的记事贴上写 上班时间 = 10:00,今天睡懒觉)。

🔍 为什么查询变量时 SESSION 优先级更高?

  • 场景: 你想知道现在“上班时间”是几点?

  • MySQL 的做法:

    1. 先看你工位上的记事贴 (SESSION 变量):有没有写着“上班时间”?

    2. 如果记事贴上有写:比如 上班时间 = 10:00,那么 MySQL 就告诉你:10:00

    3. 如果记事贴上没写:MySQL 才去看前台大厅的公告板 (GLOBAL 变量),比如上面写着 上班时间 = 9:00,然后告诉你:9:00

  • 这就是 SESSION 优先级更高 当你要查看一个变量的值时,MySQL 会优先采用你当前会话(你的记事贴)的设置。只有你工位上没贴这个规定,它才会去看公司全局的规定。

✍️ 为什么修改变量时必须指定 GLOBAL 或 SESSION

  • 场景: 你想修改“上班时间”这个变量。

  • 危险情况 (不指定关键字):

    • 假设你是一个有权限的管理员(可以修改公司规定)。

    • 你在自己的工位上执行 SET 上班时间 = 11:00; 没写 GLOBAL 也没写 SESSION

    • MySQL 默认行为: 它认为你想改的是自己工位上的记事贴 (SESSION 变量)!于是它就在你的记事贴上写了 上班时间 = 11:00

    • 问题来了:

      • 你本意是想改公司规定 (GLOBAL),让大家都11点上班?结果只改了自己的记事贴,只对你有效。公告板还是 9:00,其他人不受影响 😅。(本意改全局,结果只改了会话)

      • 更糟的是: 假设公司公告板上写着 上班时间 = 9:00,而你自己的记事贴上已经写着 上班时间 = 10:00。你执行 SET 上班时间 = 11:00; 不指定关键字,结果只是把你记事贴上的 10:00 改成了 11:00,公司公告板上的 9:00 纹丝不动!你根本没改到全局规定 🤦‍♂️。

  • 安全做法 (明确指定):

    • 只想改自己的记事贴 (不影响别人): SET SESSION 上班时间 = 11:00; 或 SET @@SESSION.上班时间 = 11:00; (或直接 SET 上班时间 = 11:00; 因为默认就是 SESSION)

    • 想改公司公告板 (影响所有人): 必须 明确写 SET GLOBAL 上班时间 = 11:00; 或 SET @@GLOBAL.上班时间 = 11:00;


  • 7.要显示系统变量名称和值,请使用以下SHOW VARIABLES语句:
SHOW VARIABLES;

这个很多了,所以我们一般都是使用下面这个

SHOW VARIABLES like '变量名';

  • 8.可以使用LIKE子句显示与指定内容匹配的变量,也可以使用通配符。

查看指定的系统变量:

SHOW VARIABLES LIKE 'max_join_size';

查看指定系统变量SESSION作用域的值:

SHOW SESSION VARIABLES LIKE 'max_join_size';

查看包含指定内容的系统变量:

SHOW VARIABLES LIKE '%size%';

查看包含指定内容系统变量的GLOBAL作用域的值:

SHOW GLOBAL VARIABLES LIKE '%size%';


9.一部分系统变量是内置的,也有一些需要通过安装服务器插件或组件才可以使用。

例如:

  • 用于审计插件audit_log实现了名为audit_log_policy的系统变量。
  • 错误日志过滤组件log_filter_dragnet实现了名为log_error_filter_rules的系统变量。

我们没有安装这些插件,就找不到这个系统变量

五.服务器常用配置

接下来我们通过一个小练习来把我们之前学习的选项和系统变量配置到我们的选项文件里面去。

首先先看一下我们的配置文件在哪里吧?

  • Linux系统下编辑/etc/mysql/my.cnf

 我们可以看看这个里面什么东西

  • Windows系统下打开C:\ProgramData\MySQL\MySQLServer8.0\my.ini

我们可以借助everything来寻找这个东西

 

我们打开这个my.ini文件看看

 这个就是我们的配置文件。

注意:

  • 编辑配置文件前先备份原始配置⽂件

我们现在先分别备份一下

 

现在就可以去修改这些东西了。

  • 如果要修改数据⽬录选项建议先停⽌MySQL服务,并把原data⽬录整体复制到新路径,配置完 成后重启服务 

 在[mysqld] 节点下添加以下内容

  • port=3306:这个是MySQL 服务启动后监听的端口号,如果说我们要对公网进行提供服务的话,为了防止黑客扫描我们默认的3306端口号从而窃取信息,所以我们一般都是要修改的
  • # 下面两个是MySQL 服务器的字符集与排序规则
  • character-set-server=utf8mb4
  • collation-server=utf8mb4_general_ci
  • default-storage-engine=INNODB:这个是新建表时使用的存储引擎,windows下已默认配置
  • 时区的配置,配置为东八区
  • datadir=D:/database/MySQL/data8.0:数据目录的路径,这里演示的是windows下的配置,注意分隔符用/,如果是\则需要转义为\\,把原data目录整体复制到新路径

如果说我们不知道数据目录在哪里的话,我们可以登陆我们的mysql客户端,查询数据目录这个系统变量就行

Linux的默认数据目录

Windows的默认数据目录

也是就是,我们那个配置文件所在目录下面的Data文件夹

我们进去看看

我们可以看到这个Windows的数据目录是在C盘的,但是我们数据目录是要存数据的,而我们的数据一般都是可能是几百TB级别的,为了防止C盘满了,所以在Windows下默认数据目录就很有修改的必要的。

  • 不论是Linux还是Windows,修改数据目录的时候,都必须直接把原来的数据目录复制到目标路径,然后再去修改数据目录系统变量即可。
  • 因为我们安装mysql的所以用户信息(比如密码),都会保存到这个原来的数据目录里面,我们启动mysql时都会用到这些信息,所以我们不能新建一个文件夹指定为数据目录,而必须去拷贝原有数据目录。

对于Linux,没有盘符的概念了,那有没有必要去修改默认的数据目录了?

其实是根据需要去修改,大多数情况是不需要的。


好了,我们现在来修改我们的配置文件,我们想往配置文件里面写入下面这些东西

# MySQL 服务节点
[mysqld]# MySQL 服务启动后监听的端口号
port=3306# 数据目录的路径,这里演示的是windows下的配置,注意分隔符用/,如果是\则需要转义为\\.
# 把原data目录整体复制到新路径
#datadir=具体的数据目录# MySQL 服务器的字符集与排序规则
character_set_server=utf8mb4# 新建表时使用的存储引擎,windows下已默认配置
default_storage_engine=INNODB#时区设置为东八区
#注意在Windows系统中,最后一个选项之后,必须要换行
default-time-zone='+8:00'

首先先来Windows,我们在这个桌面创建一个mysql.ini文件,然后打开方式是vscode,写入下面这些内容

这个文件只是告诉你怎么写,但是实际上还没有配置完成。对于Windows的配置,我们以后再讲。


对于Linux,我们得先把这个mysql服务先停止下来

接下来我们去/etc/mysql/my.cnf

vim /etc/mysql/my.cnf

 

接下来我们就是要启动mysql服务了

 我们登陆mysql客户端看看系统变量

很好了。

注意:我们修改datadir的时候,可能会遇到权限问题,那么需要把目标数据目录的权限修改成mysql,也就是把目标数据目录的用户和用户组全修改成mysql

六.查看状态变量

我们说状态变量是系统用来描述当前运行状态的一些变量,这个是不能人为修改的,而是由系统修改的。

MySQL服务器维护着当前系统信息的状态变量

可以使⽤下面这个语句查看这些状态变量和对应的值。

SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']
参数含义
GLOBAL显示全局状态(自服务器启动以来的累计值)
例:总查询次数、总连接数
SESSION显示当前会话状态(仅当前连接的数据)
例:本会话执行的查询次数
无参数默认等同于 SESSION
LIKE 'pattern'用通配符过滤结果
• %:匹配任意字符(如 'Innodb%'
• _:匹配单个字符

我们来个示例

 

http://www.lqws.cn/news/545815.html

相关文章:

  • CVE-2015-5531源码分析与漏洞复现(Elasticsearch目录遍历漏洞)
  • C语言高级编程
  • 【日志】Unity游戏实习该怎么准备
  • Unity知识点-Renderer常用材质变量
  • 数据结构之顺序表(C语言版本)
  • 【高并发服务器项目测试报告】
  • 大事件项目记录4-用户接口开发-更新用户基本信息
  • 【论文阅读 | CVPR 2025 |MambaVision:一种混合 Mamba-Transformer 视觉骨干网络】
  • Node.js到底是什么
  • Dockerfile——AI教你学Docker
  • 【Python】实现对LGBT+ rights worldwide (2025)数据集的可视化展示
  • 还在手动部署?用Jenkins+Docker+Git实现自动化CI/CD
  • 使用ant-design-vue 写个适用于web端的条件搜索栏组件,可折叠展开
  • 2025Mybatis最新教程(七)
  • 机器学习中为什么要用混合精度训练
  • 2025.6.27总结
  • HTTP协议中Connection: Keep-Alive和Keep-Alive: timeout=60, max=100的作用
  • SpringMVC系列(四)(请求处理的十个实验(下))
  • 多模态融合相机L3CAM
  • 高斯过程动态规划(GPDP)
  • 免费无广告PDFCreator:虚拟打印软件一键转 PDF/PNG/JPG
  • printf和scanf
  • 问卷调查[bell ring]
  • 全志A733、瑞芯微RK3576与联发科MTK8371场景化应用解析在物联网与智能设备快速迭代的今天,芯片作为硬件核心直接决定了设备的性能边界与应用场景。
  • moduo之tcp客户端TcpClient
  • Webpack 自定义插件开发指南:构建流程详解与实战开发全攻略
  • Html5播放器禁止拖动播放器进度条(教学场景)
  • 神经网络的概念和案例
  • FrozenBatchNorm2d 详解
  • 聚铭网络入选嘶吼《中国网络安全细分领域产品名录》“云平台安全管理”与“态势感知”双领域TOP10