如何调整MySQL全局变量以启用并动态捕捉所有SQL请求的全量查询日志?
- 内容介绍
- 文章标签
- 相关推荐
本文共计822个文字,预计阅读时间需要4分钟。
SET GLOBAL命令是MySQL中设置全局参数的命令。按照您的要求,以下是简化后的内容:
为什么只执行 SET GLOBAL general_log = 'ON' 不生效
MySQL 的 general_log 依赖三个变量协同工作:log_output 决定写到哪,general_log_file 指定路径,general_log 才是开关。三者顺序错或漏掉任意一个,MySQL 就会 fallback 到内置默认值:
-
log_output默认是'FILE'(5.7+)或'TABLE'(旧版本),但若之前被设成'NONE'或拼写错误(如'File'),日志直接丢弃 -
general_log_file默认指向数据目录下的hostname.log,路径常不可写,或你根本没留意它在哪 -
general_log设为'ON'后,MySQL 不校验前两个变量是否就绪,只管“开”,结果日志静默失败
SET GLOBAL 动态开启的正确顺序和参数
连上 MySQL 后,逐条执行(注意引号、大小写、GLOBAL 关键字):
-
SET GLOBAL log_output = 'FILE';—— 强制走文件,避免写入mysql.general_log表拖慢高并发 -
SET GLOBAL general_log_file = '/var/log/mysql/general.log';—— 路径必须提前存在,且mysql用户有写权限;别用~或相对路径 -
SET GLOBAL general_log = 'ON';—— 最后开开关,此时才真正开始记录
验证是否生效:SHOW VARIABLES LIKE 'general_log%'; 返回的 general_log 是 ON,且 general_log_file 和你设的一致,再 tail -f /var/log/mysql/general.log 看是否有新行输出。
常见错误现象与排查点
日志“开了但没内容”是最典型卡点,原因往往不是命令没执行,而是:
- 路径目录不存在,或
mysql用户无写权限:sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql - 日志文件已存在但权限不对:
sudo touch /var/log/mysql/general.log && sudo chown mysql:mysql /var/log/mysql/general.log - 误用
SESSION级设置:SET SESSION general_log = 'ON'完全无效,general_log只支持GLOBAL - MySQL 版本低于 5.1.12:不支持动态修改
general_log_file,只能改配置文件重启
生产环境必须立刻做的三件事
动态开启只是第一步,不干预很快出事:
- 立刻配
logrotate,否则 QPS 1000 的服务一天就能生成 10GB+ 日志,磁盘写满会导致主库 hang 死 - 检查日志内容是否含明文密码(如
INSERT INTO users VALUES ('admin', '123456')),有则必须关或应用层脱敏 - 收紧日志文件权限:
sudo chmod 640 /var/log/mysql/general.log,防止非授权读取
最易被忽略的是:路径合法、命令全执行、SHOW VARIABLES 显示正常——但日志就是空的。这时候请直接检查 /var/log/mysql/ 目录的属主和权限,90% 的问题卡在这里。
本文共计822个文字,预计阅读时间需要4分钟。
SET GLOBAL命令是MySQL中设置全局参数的命令。按照您的要求,以下是简化后的内容:
为什么只执行 SET GLOBAL general_log = 'ON' 不生效
MySQL 的 general_log 依赖三个变量协同工作:log_output 决定写到哪,general_log_file 指定路径,general_log 才是开关。三者顺序错或漏掉任意一个,MySQL 就会 fallback 到内置默认值:
-
log_output默认是'FILE'(5.7+)或'TABLE'(旧版本),但若之前被设成'NONE'或拼写错误(如'File'),日志直接丢弃 -
general_log_file默认指向数据目录下的hostname.log,路径常不可写,或你根本没留意它在哪 -
general_log设为'ON'后,MySQL 不校验前两个变量是否就绪,只管“开”,结果日志静默失败
SET GLOBAL 动态开启的正确顺序和参数
连上 MySQL 后,逐条执行(注意引号、大小写、GLOBAL 关键字):
-
SET GLOBAL log_output = 'FILE';—— 强制走文件,避免写入mysql.general_log表拖慢高并发 -
SET GLOBAL general_log_file = '/var/log/mysql/general.log';—— 路径必须提前存在,且mysql用户有写权限;别用~或相对路径 -
SET GLOBAL general_log = 'ON';—— 最后开开关,此时才真正开始记录
验证是否生效:SHOW VARIABLES LIKE 'general_log%'; 返回的 general_log 是 ON,且 general_log_file 和你设的一致,再 tail -f /var/log/mysql/general.log 看是否有新行输出。
常见错误现象与排查点
日志“开了但没内容”是最典型卡点,原因往往不是命令没执行,而是:
- 路径目录不存在,或
mysql用户无写权限:sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql - 日志文件已存在但权限不对:
sudo touch /var/log/mysql/general.log && sudo chown mysql:mysql /var/log/mysql/general.log - 误用
SESSION级设置:SET SESSION general_log = 'ON'完全无效,general_log只支持GLOBAL - MySQL 版本低于 5.1.12:不支持动态修改
general_log_file,只能改配置文件重启
生产环境必须立刻做的三件事
动态开启只是第一步,不干预很快出事:
- 立刻配
logrotate,否则 QPS 1000 的服务一天就能生成 10GB+ 日志,磁盘写满会导致主库 hang 死 - 检查日志内容是否含明文密码(如
INSERT INTO users VALUES ('admin', '123456')),有则必须关或应用层脱敏 - 收紧日志文件权限:
sudo chmod 640 /var/log/mysql/general.log,防止非授权读取
最易被忽略的是:路径合法、命令全执行、SHOW VARIABLES 显示正常——但日志就是空的。这时候请直接检查 /var/log/mysql/ 目录的属主和权限,90% 的问题卡在这里。

