百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

MySQL的日志 - general log

nanshan 2025-03-06 17:50 10 浏览 0 评论

关注我「程序猿集锦」,获取更多分享资料。

  • 前言
  • general log
  • 如何开启 general log
  • general log的参数
  • general log开启示例
  • 通过命令暂时开启
  • 通过配置文件永久开启
  • 关闭general log
  • 清理general log文件
  • 总结
  • 前言

    在前面的文章中我们介绍了slow query log慢查询日志、binlog二进制日志、relaylog中继日志、redolog重做日志、undolog回滚日志。今天我们来了解一下general log一般日志,有时候也叫做普通日志。

    general log

    在默认情况下,MySQL是不会打开general log的,这个log里面会记录MySQL所有的SQL语句,不管是查询语句,还是DML语句,还是DDL语句,还是DCL语句,这些语句统统都会被记录在general log文件中。就连我们连接和断开MySQL数据库的这些语句。

    MySQL会把它收到的所有SQL语句按照接收的顺序依次记录在general log中。我们需要注意的是,这里接受的SQL语句的顺序,并不等于SQL语句就是按照这个接受的顺序来执行,因为有的时候,一些SQL可能需要等待其他锁被释放后才会被真正的执行,SQL语句的执行顺序是和binlog中的顺序是相匹配的。

    假如我们执行一个select查询语句,在binlog中不会记录这样的SQL语句,但是在general log中就会记录这个select查询语句。

    General log默认不开启的原因有两个:

  • 日志将会非常大,对磁盘是一个很大的压力。因为所有的操作都会被记录下来。
  • 对MySQL数据的性能有一定的影响。
  • 所以,我们一般不会开启这个general log记录的功能,只有在排查某些错误的时候,才会临时打开一下,等到debug完成之后,再把它关闭。

    如何开启 general log

    如果在配置文件中永久开启:

    [mysqld]
    general_log=1
    general_log_file=mysql_general_log.log
    log_output=/var/lib/mysql

    在SQL命令行中临时开启:

    mysql> show variables like 'general_log'; -- 查看日志是否开启
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | general_log   | OFF   |
    +---------------+-------+
    1 row in set (0.02 sec)
    
    mysql>
    mysql> show variables like 'general_log_file'; -- 看看日志文件保存位置
    +------------------+-------------------------+
    | Variable_name    | Value                   |
    +------------------+-------------------------+
    | general_log_file | /var/lib/mysql/test.log |
    +------------------+-------------------------+
    1 row in set (0.02 sec)
    
    mysql>
    mysql> show variables like 'log_output'; -- 看看日志输出类型 table或file
    +---------------+------------+
    | Variable_name | Value      |
    +---------------+------------+
    | log_output    | FILE,TABLE |
    +---------------+------------+
    1 row in set (0.01 sec)

    general log的参数

    general log的参数主要有以下几个:

  • genral_log:用于控制是否开启general log。等于0表示关闭,等于1表示开启。默认是0
  • general_log_file:general log日志的文件名是什么,如果不配置这个参数的话,默认会以MySQL服务器的hostname作为general log日志的文件名称,具体文件为:.log,general log日志的存放路径。如果不指定,则默认放在datadir参数所指定的目录下。也可以在这个参数中指定具体的路径+名称。
  • log_output:general log输出的方式,是输出表中,还是保存到文件中。这个参数的取值范围为:table,或者file。默认是保存到file文件中。这个参数是和慢查询日志是共用的,慢查询的日志是记录在表中还是只记录在文件中,也是用这个参数来控制。如果配置为table,就会把慢查询日志和general log日志都写在mysql.geneal_log表中。如果这个参数配置为table,file则表示即写入表中,也写入日志文件中,两个地方都写入日志。
  • 在开启了general log的前提下,如果在某个session连接中,不想让此次操作的所有SQL被记录在general log中,则可以在session中执行set session sql_log_off=on就可以关闭当前session的操作被记录在general log中。

    general log开启示例

    接下里我们会针对开启general log做两个实验:

    1. 在命令行中,通过命令暂时开启。这种开启方式,在MySQL实例被重启的以后,会失效。
    2. 在配置文件中,配置参数开启。这种开启方式,永久生效,即便MySQL实例重启后,仍然有效。

    通过命令暂时开启

    我们来开启general log感受一下,下面我们登录到MySQL的命令行窗口,使用set global general_log=on;命令来开启。开启过程如下所示:

    mysql> set session general_log=on; -- 这是一个全局参数,不能只针对当前session启用。
    ERROR 1229 (HY000): Variable 'general_log' is a GLOBAL variable and should be set with SET GLOBAL
    mysql> set global general_log=on; -- 对全局开启general log
    Query OK, 0 rows affected (0.03 sec)

    因为我的log_output参数配置的是FILE,TABLE,所以我的general log会记录在两个地方,一个是general log日志文件,一个是表中。日志保持方式的参数配置如下所示:

    mysql> show variables like 'log_output';
    +---------------+------------+
    | Variable_name | Value      |
    +---------------+------------+
    | log_output    | FILE,TABLE |
    +---------------+------------+
    1 row in set (0.02 sec)

    查看general log文件中的日志,当log_output参数有FILE的时候,general log日志文件的目录默认在datadir目录下面。前面我们开启general log的时候,因为没有显示的去指定general log日志的文件目录和文件名称,所以它默认是存放在datadir目录下,文件名称为<主机名称>.log。我可以看到在datadir目录下面如下日志:

    root@test:/var/lib/mysql# pwd
    /var/lib/mysql
    root@test:/var/lib/mysql# ls -lstr *.log
    8 -rw-r----- 1 mysql mysql 6293 Jan 13 15:40 test-slow.log
    4 -rw-r----- 1 mysql mysql 2589 Jan 13 15:50 test.log
    root@test:/var/lib/mysql# hostname
    test.mysql
    root@test:/var/lib/mysql#

    我们来看下这个日志文件中的内容是什么,具体如下所示,可以看出所有的查询语句都会被记录在general log日志中。即便是查询语句也会被记录在里面。

    上面我们看了general log日志文件中的内容,我们的配置还要去记录日志到表中,具体是记录在mysql.general_log表中。我们看下这个表中记录的内容。使用下面的SQL语句来查看表中的内容。

    select 
    	event_time,user_host,thread_id,server_id,command_type,
    	convert(argument using utf8mb4) as sql_text 
    from general_log limit 100;

    通过配置文件永久开启

    上面我们是通过set命令参数来开启的general log,下面我们采用在配置文件中配置general log日志文件参数的方式来开启。在使用配置文件来开启之前,我们先把前面我们使用set命令开启的操作给修改回去,然后再去修改配置文件来开启general log日志文件。先用下面的命令改回去。

    mysql> set global general_log=off;
    Query OK, 0 rows affected (0.02 sec)

    改回去之后,我们再去看下日志文件中的内容。

    我们在my.cnf配置文件中配置的具体参数如下,为了测试,我把general log日志文件路径和名称都修改一下。看下效果如何。修改完成如下参数后,重启MySQL服务。

    [mysqld]
    # 一般日志的开启
    general_log=1
    general_log_file=/tmp/mysql_general_log.log

    这里顺便说一下,我的MySQL实例是用docker启动的一个容器镜像。用docker启动MySQL示例,兼职不要太方便,把参数配置文件挂载到本地,随便怎么修改参数文件,然后直接一个docker restart <容器名称或容器id>,直接搞定。在以后介绍一下关于docker的一些基本使用。

    重启MySQL示例之后,啥都不做,直接去MySQL的/tmp下面看是否有mysql_general_log.log文件生成。检查结果如下,可以看到已经有general log文件生成。

    root@test:/tmp# pwd
    /tmp
    root@test:/tmp# ls
    mysql_general_log.log
    root@test:/tmp# more mysql_general_log.log
    mysqld, Version: 5.7.24-log (MySQL Community Server (GPL)). started with:
    Tcp port: 0  Unix socket: /var/run/mysqld/mysqld.sock
    Time                 Id Command    Argument
    root@test:/tmp#

    接下来,我们来执行一些SQL,看下日志是否可以正常记录在/tmp/mysql_general_log.log文件中,验证过程如下所示:

    去看下mysql.genenal_log表中是否也会正常记录,检查结果如下:

    关闭general log

    在关闭general log的是,我们只要把对应的配置在配置文件中删除或使用#注释掉,重启MySQL示例就可以了。如果不想重启MySQL数据实例,在修改完配置文件之后,在登录到MySQL命令行中,执行set global general_log=off;命令就可以马上关闭general log记录的功能,因为我们已经修改过配置文件,所以即便是MySQL重启之后,general log也不会开启了。

    如果我们只是通过set命令的方式去开启的,没有去修改配置文件。那么我们只需使用set命令的方式关闭即可了,不用去动配置文件了。在真正的debug错误的时候,推荐使用这种set命令的方式去临时开启和关闭general log日志,而不用去修改my.cnf配置文件。

    清理general log文件

    开启general log之后,日志文件会增长得很快,如果我们需要清理历史的general log文件,我们该怎么做?

  • 如果是记录在文件中,使用cp命令,把general log日志文件备份一下(如果你确定这些历史的general log不在需要,那么可以不执行备份的这一步操作),然后使用管道命令把文件内容清空。操作大致如下:
  • cp mysql_general_log.log mysql_general_log.log.bak
    echo "" > mysql_general_log.log

    注意:切记不要直接删除这个日志文件,否则这个文件不会自动生成,除非你重启MySQL数据实例。如果删除后,即便是你手动创建一个一样名称的日志文件,MySQL也不会把general日志记录进去。所以,我们只能在MySQL自己生成的文件中进行编辑,删除里面的内容。

    对于我们备份生产的文件mysql_general_log.log.bak,如果有必要留存,就拷贝到其他服务器或者其他归档存储中。如果没有必要留存,那么直接rm删除这个bak的log文件就可以了。

  • 如果是记录在表中。先试用create table xx as select命令备份个表(如果你确认不需要历史的general log,那么你可以不执行备份操作)。然后,执行truncate命令删除表中数据。操作大致如下:
  • create table mysql.general_log_bak as select * from mysql.general_log;
    truncate table mysql.general_log;

    对于我们创建的备份表mysql.general_log_bak,如果日志内容有必要留存,那么把这个表使用mysqldump备份出来然后归档存放,如果没有必要留存,那么直接drop删除这个bak的表就可以了。

    总结

    一般情况我们不会开启general log日志,因为它的增长速度太快了。磁盘很快就会被占用完了。所以一般只有在需要debug一些特别难找的bug的时候,才会使用set global general_log=on开启,在生产我们需要的debug日志以后,就直接使用set global general_log=off关闭了。这里面的日志记录很详细,在排查一下比较隐蔽的问题的时候,还是可以提供很多有用的信息的。

    MySQL的general log就分享到这里了。后面我会分享关于MySQL的最后一个日志:error错误日志。

    相关推荐

    SSH远程连接服务详解(ssh远程登录功能配置)

    SSH远程服务SSH概述what?SSH(SecureShell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录和文件传输方式,例如Telnet、FT...

    Linux: SSH隧道 (端口转发)(ssh端口转发 内网穿透)

    如果我想在本机通过localhost的2521端口直接访问远程数据库,可以通过SSH隧道进行端口转发来实现。本机运行如下命令:ssh-Llocalhost:2521:192.168.3.50:15...

    什么是SSH?主要可以做些什么呢?学习到了一些常用的命令

    一、背景刚发了一篇ssh连接飞牛系统,收到了头条评论精灵对我的文章的评论@头条精灵评论,我觉得头条评论精灵这个问题很好,我打算再想想,作为一名小白,利用SSH主要做些什么呢?以及一些常用的命令有哪些?...

    SSH端口转发(ssh端口转发 内网穿透)

    ssh是个多用途的工具,不仅可以远程登录,还可以搭建socks代理、进行内网穿透,这是利用它的端口转发功能来实现的。所谓ssh端口转发,就是在ssh连接的基础上,指定sshclient或ssh...

    小白初学linux之无法修改系统分辨率

    /*此文是做为自己的一个总结还有就是最好也可以给大家提供一些帮助。*/时间:2020年7月14日11:28:41我安装的是Ubuntu20.04LTS,昨天处理的是,grub的引导问题,因为是...

    Ubuntu 如何启动、停止或重启服务

    在本文中,我们向您介绍在Ubuntu中启动、停止和重启服务的方法。列出Ubuntu中的所有服务在开始之前,先获取计算机上所有服务的列表,因为我们需要知道服务名称来管理服务。service--...

    Win11学院:如何在Windows 11上使用WSL安装Ubuntu

    IT之家2月18日消息,科技媒体pureinfotech昨日(2月17日)发布博文,介绍了3中简便的方法,让你轻松在Windows11系统中,使用WindowsSubs...

    Linux安装中文输入法-Google拼音输入法,搜狗输入法

    主要步骤,选择适合自己的尝试:1)卸载之前没装好的搜狗输入法。@:~/Downloads$sudoapt-getremovefcitx*删除依赖库@:~/Downloads$sudoap...

    Ubuntu 22.04 请谨慎使用搜狗输入法,可能是你当机原因

    在Ubunutu下没有什么有名的输入法,也就听说搜狗输入法有Linux版本,所以特意到官网去找了下载。在Ubuntu新版本里,他仍然用的是fcitx框架的输入引擎,而不是默认的ibus,所以要先把i...

    前钢后胶!徐工XMR403VT小型压路机有点意思

    【第一工程机械网原创】在越来越注重施工品质,对项目管理越来越精细化的今天,施工方在施工设备选择上,也越来越讲究设备的配套分工,因此小型压路机的应用场景也越来越多。徐工XMR403VT小型压路机高度集...

    图大明白 | 404错误为什么是Not Found?为什么是404?

    “404错误”大家都不陌生吧?常规来讲它长这样或者长这样艺术一点的长这样404NotFound意思就是所请求的页面不存在或者已被删除被称为“互联网最后一个界面”有很多同学发出疑问:为什么是404?...

    Nginx负载均衡安全配置说明2(nginx负载均衡部署)

    上一节,我们对Nginx安全配置的几个知识点做了一个说明,例如限制IP访问、文件目录禁止访问限制、需要防止DOS攻击、请求方法的限制和限制文件上传的大小这个进行了一个分析说明,详细的文章请关注我的头条...

    惊艳写真系列第403期,本期主人公—叶青

    惊艳写真系列第403期,本期主人公—叶青制作不易,欢迎各位看官提供宝贵意见。如果您喜欢记得关注,么么哒。您的每一份点赞和关注都是对作者的最大认可(图片素材均来源于网络,如有侵权联系删除。)本篇是写惊艳...

    先秦布币之尖足布、圆足布、方足布,今年圆足最高拍卖价16万一枚

    在战国魏、韩地区诞生桥足平首布、锐角平首布之后,赵也诞生了尖足平首布,并且在尖足布的基础上,后来相继派生出了圆足布、三孔布,以及类圆足布和类方足布。一尖足布尖足布是从耸肩尖足空首布演变而来的,是黄河...

    403 禁止访问错误的全面排查与解决方案

    当遇到403Forbidden错误时,意味着服务器已接收并理解请求,但拒绝执行访问操作。以下从用户端、服务器端等多个维度,提供分步排查与解决方法。一、用户端基础排查1.检查URL准确性确认...

    取消回复欢迎 发表评论: