如何开启MySQL通用查询日志?

星杰吖_3739

星杰吖_3739

2026-08-28

975人浏览

原创

通用查询日志开关需在my.cnf中配置general_log=1和general_log_file=/path/to/log,或运行时执行set global general_log = on;但必须确保log_output非none、用户有super权限,且云数据库可能禁用该功能。

如何开启mysql通用查询日志?

通用查询日志开关在哪设?

MySQL 的通用查询日志(General Query Log)默认是关闭的,它会记录所有客户端连接、断开以及每条执行的 SQL 语句(包括 SELECT、INSERT 等),对调试和审计有用,但开启后 I/O 压力明显上升,生产环境慎用。

开启方式只有两种有效路径:启动时配置或运行时动态启用。

  • 启动时设置更稳定,适合长期开启;
  • 动态开启(SET GLOBAL general_log = ON)立即生效,但 MySQL 重启后失效;
  • 单纯改 my.cnf 里 general_log 为 1 不生效,必须同时指定 general_log_file(否则可能写到临时文件或失败)。

实操建议:
- 编辑 my.cnf(通常在 /etc/my.cnf 或 /etc/mysql/my.cnf),在 [mysqld] 段落下添加两行:
general_log = 1
general_log_file = /var/log/mysql/general.log
- 确保 MySQL 进程有权限写入该路径(比如 chown mysql:mysql /var/log/mysql); - 重启 MySQL:systemctl restart mysql(或 mysqld); - 验证是否生效:SHOW VARIABLES LIKE 'general_log%';,输出中 Value 应为 ON 和对应路径。

为什么 SET GLOBAL general_log = ON 有时不生效?

这个命令看似简单,但常被卡在权限或配置冲突上:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 执行用户必须拥有 SUPER 权限(MySQL 5.7+ 中 SYSTEM_VARIABLES_ADMIN + SESSION_VARIABLES_ADMIN 也可);
  • 如果 my.cnf 中设了 general_log = 0,动态开启仍会成功,但日志文件可能为空——因为 MySQL 实际还检查 log_output 的值;
  • log_output 默认是 FILE,但如果被设成 NONE 或 TABLE(写入 mysql.general_log 表),而表不存在或权限不足,日志就“静默丢失”;
  • 某些云托管 MySQL(如阿里云 RDS、AWS RDS)直接禁用通用日志,SET GLOBAL 会报错 ERROR 1238 (HY000): Variable 'general_log' is a read only variable。

排查步骤:
- 先查:SELECT @@log_output;,确认不是 NONE;
- 再查:SELECT @@general_log;,确认返回 1;
- 如果写入表模式,检查表是否存在:SHOW CREATE TABLE mysql.general_log;;
- 日志没内容?用 tail -f /var/log/mysql/general.log(或对应路径)实时观察,同时执行一条 SELECT 1; 看是否追加。

日志文件越来越大,怎么安全轮转?

通用日志不会自动切割,放任不管可能撑爆磁盘。MySQL 本身不提供 rotate 机制,得靠外部工具:

  • 不要用 echo "" > general.log 清空——MySQL 正在写入时会导致文件句柄错位,后续日志可能乱码或丢失;
  • 正确做法是先关闭日志,重命名文件,再重新打开:
    SET GLOBAL general_log = OFF;
    RENAME TABLE mysql.general_log TO mysql.general_log_old;(仅限 log_output=TABLE)
    或 mv /var/log/mysql/general.log /var/log/mysql/general.log.$(date +%Y%m%d)(log_output=FILE)
    SET GLOBAL general_log = ON;
  • 更稳妥的是用 logrotate 配合 create 和 postrotate 脚本调用上述 SET GLOBAL 开关;
  • 注意:如果用 TABLE 输出,清空表(TRUNCATE mysql.general_log)比删表安全,但频繁 TRUNCATE 可能引发锁等待。

要不要把日志写进表(log_output=TABLE)?

写表看起来方便查(SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 10;),但实际坑不少:

  • mysql.general_log 是 CSV 引擎表,不支持索引,大数据量下 SELECT 极慢;
  • 每次写入都是一次磁盘同步,性能比写文件更低;
  • CSV 表在 MySQL 8.0.23+ 已被标记为 deprecated,未来版本可能移除;
  • 如果启用了 sql_log_bin = OFF,写表操作仍会记入 binlog(除非显式 SET SQL_LOG_BIN = 0),可能干扰主从复制。

结论:
- 临时调试用 FILE + tail -f 最轻量;
- 审计归档场景,建议用外部日志收集器(如 filebeat)把文件日志推到 ELK;
- 绝对避免在高并发线上库长期开启,哪怕只是写表——它本质仍是全量 SQL 记录,开销无法忽略。

通用日志不是“开了就能用”的开关,它和 log_output、general_log_file、权限、存储引擎、甚至 MySQL 版本强耦合。最常被忽略的是:你以为日志在写,其实它正默默丢弃——先确认 log_output 和文件权限,再看内容。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4223

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1109

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6141

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2983

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6100

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8221

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1110

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

972

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 184人学习