MySQL 配置选项和变量间的关系

发布时间 2023-12-04 18:35:15作者: 背对背依靠

MySQL 变量

MySQL中的变量主要分为两大类,用户变量和系统变量。

1、用户变量

用户变量是用户自定义的变量,用户变量以@符号开头,通过set或者select可以给用户变量赋值。

用户变量是属于会话级别的变量,变量的值只在当前会话中有效,当会话结束时,这些变量的值就会丢失。


例如:

SET @myVariable = 100; 或 SELECT @myVariable := 100;

2、系统变量

系统变量主要就是用来定义MySQL服务器的操作和配置,系统变量可以使用 SHOW VARIABLES 语句查看,可以用SET语句修改(某些变量是只读的,无法修改)。


其实系统变量还可以细分为全局变量和会话变量。

  • 全局变量影响服务器的整体操作,代表了服务器的当前状态。例如,innodb_buffer_pool_size变量决定了InnoDB存储引擎用于缓冲池的内存大小。

  • 会话变量仅影响当前连接的会话。例如,sort_buffer_size变量决定了为排序操作分配的内存量。

MySQL 服务选项

1、mysqld配置选项

前面我们也说过,MySQL服务端的服务进程是mysqld,mysqld有很多配置选项,如果在启动mysql的进程的时候手动指定,这样管理器来很不方便。


例如:

mysqld --port=3306 --pid-file=/var/run/mysqld/mysqld.pid  --datadir=/var/lib/mysql

所以可以将这些配置按照一定的格式(忽略选项的 -- 前缀,直接写选项名称),放在一个配置文件里面进行统一管理,方便对这些参数进行统一管理和简化启动命令。


例如:

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock

port            = 3306
bind-address    = 0.0.0.0

basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp

log_error = /var/log/mysql/error.log

# 默认字符集为utf8mb4,这是一个支持Unicode的字符集,能够存储任何Unicode字符。
character_set_server=utf8mb4
collation-server      = utf8mb4_unicode_ci

2、全局变量和mysqld配置选项

MySQL中的许多系统变量对应于mysqld的配置选项。它们共同影响MySQL服务器的行为和性能。

当MySQL服务器启动时,它会读取配置文件中的配置,这些配置选项的值会作为MySQL服务中某些系统变量的初始值。大多数情况下,配置文件中的选项名称和全局系统变量的名称相同。


也不是每个mysqld的配置选项都有与之对应的系统变量,这个可以查看MySQL的官方文档来确认;

官方文档:https://dev.mysql.com/doc/refman/5.7/en/server-option-variable-reference.html


文档说明:

  • Cmd-Line (Command-Line): 这些是可以在命令行上启动mysqld服务时使用的选项。

  • Option File: 这些选项可以在配置文件(如my.cnf或my.ini)中设置。

  • System Var (System Variable): 这些是MySQL服务器的系统变量,可以控制其行为和特性。

  • Status Var (Status Variable): 这些变量提供了有关MySQL服务器状态的信息。

  • Var Scope (Variable Scope): 这指的是变量的作用域。它可以是全局的(影响整个服务器)或会话的(仅影响当前连接的会话)。

  • Dynamic: 这指的是变量是否可以在运行时动态更改,而不需要重启服务器。


例如:

配置文件中通过 character_set_server 指定服务端的默认字符集,这个时候mysql中的character_set_server变量的初始值就是配置文件中指定的值。

修改Mysql配置文件的某个配置选项,需要重启mysqld进程才会生效,这个时候可以直接通过修改对应的全局变量来动态调整配置。

3、设置系统变量的方法

用户变量以@符号开头进行标识,系统变量用两个@符号进行标识。

SET @@VAR = VALUE

这种方式默认设置的是SESSION(会话)级别的系统变量,如果session级别的系统变量不存在就会报错。所以如果想设置GLOBAL(全局)级别的系统变量,可以添加GLOABL关键字设置。

SET GLOBAL @@VAR = VALUE