课程名称:MySQL面试指南
课程章节:对比配置文件同MySQL运行配置参数
主讲老师:sqlercn
课程内容:
今天学习的内容包括:
关于MySQL的变量
比较系统运行配置和配置文件中的配置
课程收获:
关于MySQL的变量
MySQL的变量分为两种:系统变量(System Variable)、用户变量(User Variable)。
其中系统变量又根据作用域区分为:全局变量(Global Variable)、会话变量(Session Variable)。
为了时运行时设置的环境变量能保存到配置文件中,以便下一次自动载入,因此诞生了
持续的全局变量(Persist Global Variable),通过persist设置的全局变量会写入一个配置文件中,
MySQL重启后会自动载入。
+----------+----------+---------------------------------------------------------------+
| 类型 | 子类 | 说明 |
+----------+----------+---------------------------------------------------------------+
| | | MySQL服务器启动时会使用其软件内置的变量(俗称写死在代码中的) |
| | | 和配置文件中的变量(如果允许,是可以覆盖源代码中的默认值的) |
| | | 来初始化整个MySQL服务器的运行环境,这些变量通常就是我们所说的 |
| | | 全局变量。 |
| | |---------------------------------------------------------------+
| | 全局变量 | show global variables; | 查看所有全局变量 |
| | Global | show global variables like 'sql_%';| 查看部分全局变量 |
| | Variable | select @@global.sql_mode; | 查看某个全局变量 |
| | |------------------------------------+--------------------------+
| | | set global sql_mode='xxx'; | 设置某个全局变量 |
| | | set @@global.sql_mode='xxx'; | 设置某个全局变量 |
| | |------------------------------------+--------------------------+
| | | set persist sql_mode='xxx'; | 设置某个全局变量并写入配置 |
| 系统变量 | | set @@persist.sql_mode='xxx'; | 设置某个全局变量并写入配置 |
| System |----------+---------------------------------------------------------------+
| Variable | | 当有客户端连接到MySQL服务器的时候,MySQL服务器会将这些全局变量 |
| ( @@ ) | | 的大部分复制一份作为这个连接客户端的会话变量,这些会话变量与客户端 |
| | | 连接绑定,连接的客户端可以修改其中允许修改的变量,但是当连接断开时 |
| | | 这些会话变量全部消失,重新连接时会从全局变量中重新复制一份。 |
| | |---------------------------------------------------------------+
| | 会话变量 | show session variables; | 查看所有会话变量 |
| | Session | show session variables like 'sql_%';| 查看部分会话变量 |
| | Variable | select @@session.sql_mode; | 查看某个会话变量 |
| | |-------------------------------------+-------------------------+
| | | set session sql_mode='xxx'; | 设置某个会话变量 |
| | | set @@session.sql_mode='xxx'; | 设置某个会话变量 |
+----------+----------+----------------------------------------------------------------+
| | | 当客户端连接上MySQL服务器之后就可以自己定义一些变量,这些变量在 |
| | | 整个连接过程中有效,当连接断开时,这些用户变量消失。 |
| | 用户变量 |---------------------------------------------------------------+
| | User | select @v1; | 查看某个用户变量 |
| | Variable |-------------------------------------+-------------------------+
| | ( @ ) | set @v1 = 'xxx'; | 设置某个用户变量 |
| 用户变量 | | select @v1 := 'xxx'; | 设置某个用户变量在查询时 |
| User |----------+-------------------------------------+--------------------------+
| Variable | | 通常由 declare 关键字来定义,经常出现在存储过程中,非常类似于C和 |
| | | C++函数中的局部变量,而存储过程的参数也和这种变量非常相似,基本上 |
| | | 可以作为同一种变量来对待。 |
| | 局部变量 |----------------------------------------------------------------+
| | Local | create [procedure|function] xxx() begin [局部域] end; |
| | Variable |----------------------------------------------------------------+
| | | declare num int default 0; | 定义某个局部变量 |
| | | set num = num + 1; | 修改某个局部变量 |
+----------+----------+-------------------------------------+--------------------------+
比较系统运行配置和配置文件中的配置
- MySQL8.0以前如果动态修改了global的变量,要手动在my.cnf中做相同的修改。
- MySQL8.0以后可以通过persist动态修改global变量,修改的值会自动存入到mysqld-auto.cnf中。
- 使用pt-config-diff工具比较配置文件:
pt-config-diff h=localhost,P=3306,u=root,p=1234 /etc/mysql/my.cnf
比较两个运行中的MySQL的系统变量差异:
pt-config-diff h=localhost,P=3306,u=root,p=1234 h=192.168.1.107,P=3306,u=root,p=4321