RDS MySQL General log常见问题

更新时间:2025-02-21 07:43:52

当开启general log后,该文件会记录用户的所有操作,包括每条SQL语句的执行细节。当访问量大或者长时间不清理general log文件时,会占用大量的存储空间,导致存储空间耗尽。本文为您列举general log相关的常见问题和解决方法。

背景信息

基于以下原因,RDS MySQL选择TABLE作为general log的默认存储格式:

  1. 保存为FILE格式用户无法进行查询,因为用户无法直接访问RDS MySQL的文件。

  2. general logslow log同时受log_output参数影响,RDS MySQL在采集slow log时使用了rotate的机制,需要保存为TABLE格式。

General log占据大量存储空间

问题描述

RDS MySQL实例存储空间已满,通过以下排查步骤可确认general log文件过大的问题。

  1. 查看实例存储空间使用量,sys_data_size文件过大。详情请参见查看监控信息

  2. 查看实例参数,实例已开启general_log(运行参数值为ON)。详情请参见查看实例参数

  3. 连接RDS MySQL实例并执行如下语句,查询发现general log文件过大。连接实例的详细信息请参见连接RDS MySQL实例

    SELECT table_schema AS '数据库', table_name,SUM(data_length + index_length + data_free)/1024/1024 AS "表大小MB",SUM(DATA_FREE)/1024/1024 AS "碎片大小MB"
    FROM information_schema.TABLES
    WHERE table_name='general_log'
    说明
    • SQL语句会从information_schema 数据库的TABLES表中检索mysql.general_log表的数据,然后将其转换成以MB为单位的大小。

    • SQL语句获得的数据为抽样数据,和实际数据存在一定误差。

问题原因

RDS MySQL开启了general log后,该文件记录了用户的所有操作,包括每条SQL语句的执行细节,无论是查询、插入、更新还是删除操作。当业务访问量较大或长期未清理general log文件时,该文件将持续增长。若不及时处理,最终将耗尽实例存储空间。

General log导致性能问题

问题描述

连接数上升,CPU使用率升高。通过SHOW PROCESSLIST或者查看innodb_trx表等方式,可见大量连接处于Waiting for table level lock状态。

问题原因

RDS MySQL选择TABLE作为general log的默认存储格式,各线程串行写入general log,而写入general log时需获取元数据锁(MDL)和表级锁,该表级锁导致了“Waiting for table level lock”状态的出现。

General log导致RTO变长

问题描述

实例崩溃恢复时间变长,在此期间实例处于无法连接状态。

问题原因

实例非正常Shutdown,general logCrash标记位会被置为true,导致实例重启后进入到自动恢复的逻辑,当表很大时,恢复时间很长,此过程中实例无法连接。

解决方法

清理general log文件

  1. 关闭general log(运行参数值设为OFF),以防止产生新的日志。详情请参见设置实例参数

  2. 使用高权限账号连接RDS MySQL实例,执行如下语句清理general log文件,等待一段时间后,可以在实例监控处查看general log占用情况。连接实例的详细信息请参见连接RDS MySQL实例

    说明

    RDS MySQL 5.6版本实例不支持通过TRUNCATE命令清理general log文件。如需进行清理,请联系我们

    TRUNCATE TABLE mysql.general_log;

建议您在日常使用数据库的过程中关闭general log,仅在调试或跟踪问题时临时开启general log,使用完成后及时清理与关闭,以防数据库访问量大或长时间不清理general log导致文件堆积,占满实例存储空间。如您需要查看与分析SQL语句执行详情,可以选择以下两种方式:

  • (推荐)开启SQL洞察和审计:系统自动记录与分析执行的SQL语句,相关洞察与审计数据存储在数据库自治服务DAS中,不占用RDS实例存储空间且不影响实例性能。

  • 临时开启general log:您可以临时开启general log调试或跟踪问题,通过以下命令查询SQL语句执行情况,在调试完成后关闭并清理general log文件。

    SELECT * FROM mysql.general_log;

后续维护

您可以手动扩容实例存储空间,也可以开启存储空间自动扩容功能,在实例存储空间达到设定的阈值时,系统会自动扩容存储空间。

  • 本页导读 (1)
  • 背景信息
  • General log占据大量存储空间
  • 问题描述
  • 问题原因
  • General log导致性能问题
  • 问题描述
  • 问题原因
  • General log导致RTO变长
  • 问题描述
  • 问题原因
  • 解决方法
  • 清理general log文件
  • 后续维护
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等