MySQL日志

发布于:2025-08-05 ⋅ 阅读:(11) ⋅ 点赞:(0)

MySQL日志

前言:

很多时候 当一个服务报错 我们第一反应是去查看日志 虽然对于大多数的服务来说 他们的日志文件的大差不差 但我们还是要是说一下的

MySQL日志

MySQL 日志是记录数据库记录数据库操作和运行状态的重要文件,主要用于故障排查、数据恢复、性能分析等场景。MySQL 提供了多种类型的日志,每种日志有其特定的用途。

一、错误日志(Error Log)

  • 作用:记录 MySQL 服务器启动、运行、关闭过程中发生的错误信息,以及严重警告信息。

  • 内容:包括服务器启动失败、崩溃、权限问题、配置错误等关键信息,是排查服务器无法启动或运行异常的首要参考。

  • 默认位置

    • Linux 系统:通常在/var/log/mysqld.log(可在my.cnf中通过log_error配置路径)。
    • Windows 系统:通常在 MySQL 安装目录的data文件夹中,文件名为hostname.err
    • ubuntu系统:通常在 /var/log/mysql/error.log
  • 配置方式:在配置文件my.cnf(或my.ini)中设置:
    ini

    [mysqld]
    log_error = /var/log/mysql/error.log  # 指定日志路径
    log_warnings = 2  # 记录更多警告信息(可选)
    

1. 启动失败相关
  • Can't start server: Bind on TCP/IP port: Address already in use

    • 含义:MySQL 默认端口(3306)被其他进程占用。

    • 解决:

      • 查看占用进程:netstat -tulpn | grep 3306lsof -i:3306
      • 终止占用进程:kill -9 进程ID
      • 或修改 MySQL 端口:在my.cnf中设置port=3307后重启。
  • InnoDB: The innodb_system data file 'ibdata1' must be writable

    • 含义:MySQL 数据目录(如/var/lib/mysql/)权限不足,mysql用户无法写入。

    • 解决:

      • 调整目录权限:chown -R mysql:mysql /var/lib/mysql/
      • 检查 SELinux 或防火墙是否限制了写入权限。
  • Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

    • 含义:系统数据库mysql的表缺失(可能是初始化失败或文件损坏)。

    • 解决:

      • 重新初始化数据库:mysqld --initialize --user=mysql
      • 若使用 rpm 包安装,可尝试rpm --force --reinstall mysql-server修复。
2. 运行中错误
  • InnoDB: Unable to lock ./ibdata1, error: 11

    • 含义:InnoDB 数据文件被锁定(可能是 MySQL 进程未正常关闭,残留进程占用)。

    • 解决:

      • 查找并终止残留进程:ps aux | grep mysql,然后kill -9 进程ID
      • 删除锁文件:rm -f /var/lib/mysql/ibdata1.lock
  • Too many connections

    • 含义:数据库连接数超过max_connections配置上限。

    • 解决:

      • 临时调整:SET GLOBAL max_connections = 1000;(重启后失效)
      • 永久调整:在my.cnf中设置max_connections=1000,重启服务
      • 检查应用是否存在连接泄露(未及时释放连接)。
  • Tablespace is missing for table ...

    • 含义:表空间文件(如.ibd)丢失或损坏,通常是手动删除了数据文件导致。

    • 解决:

      • 从备份恢复表空间文件
      • 若表不重要,可尝试删除表:DROP TABLE 表名;(需先在information_schema中确认表状态)

二、二进制日志(Binary Log,binlog)

  • 作用:记录所有对数据库数据的修改操作(如INSERTUPDATEDELETECREATE等),不记录查询操作(如SELECT)。主要用于数据恢复主从复制

  • 特点

    • 以二进制格式存储,需用mysqlbinlog工具查看内容。
    • 日志文件按大小或时间自动轮转(如mysql-bin.000001mysql-bin.000002)。
  • 配置方式:在my.cnf中启用并配置:

    [mysqld]
    server-id = 1  # 主从复制必须设置,唯一标识服务器
    log_bin = /var/log/mysql/mysql-bin.log  # 日志路径及前缀
    max_binlog_size = 100M  # 单个日志文件最大大小(默认1G)
    binlog_format = row  # 日志格式(row/statement/mixed,推荐row)
    #statement 会显示输入的命令
    expire_logs_days = 7  # 日志自动过期时间(天)
    
    # 注意事项
    # 日志格式影响可读性
    # 若 binlog_format=statement:直接记录原始 SQL 语句,可读性高。
    # 若 binlog_format=row:记录数据行的变化(而非原始 SQL),需加 --base64-output=DECODE-ROWS -v 参数才能看到具体修改:
    
    mysqlbinlog --base64-output=DECODE-ROWS -v /var/log/mysql/mysql-bin.000002
    

  • 常用操作

    • 查看二进制日志列表:SHOW BINARY LOGS;
    • 查看当前使用的日志:SHOW MASTER STATUS;
    • 刷新日志(生成新文件):FLUSH LOGS;
    • 查看日志内容:mysqlbinlog /var/log/mysql/mysql-bin.000001
3. 示例:解析结果片段

plaintext

# at 302
#240804 10:30:15 server id 1  end_log_pos 456 	Query	thread_id=5	exec_time=0	error_code=0
use testdb;
SET TIMESTAMP=1722733815;
UPDATE user SET age=20 WHERE id=1;

上述内容表示:
2024 年 8 月 4 日 10:30:15,在 testdb 库中执行了 UPDATE user SET age=20 WHERE id=1; 命令。

三、慢查询日志(Slow Query Log)

  • 作用:记录执行时间超过指定阈值的 SQL 语句,用于性能优化,定位低效查询。

  • 配置方式:在my.cnf中设置:
    ini

    [mysqld]
    slow_query_log = 1  # 启用慢查询日志(1为开启,0为关闭)
    slow_query_log_file = /var/log/mysql/slow.log  # 日志路径
    long_query_time = 2  # 慢查询阈值(秒),超过此时间的查询会被记录
    log_queries_not_using_indexes = 1  # 记录未使用索引的查询(可选)
    

  • 查看方式:直接打开日志文件(文本格式),或使用mysqldumpslow工具分析:
    bash

    mysqldumpslow -s t /var/log/mysql/slow.log  # 按执行时间排序显示
    

四、通用查询日志(General Query Log)

  • 作用:记录 MySQL 服务器所有的连接信息和执行的 SQL 语句(包括SELECTINSERT等所有操作),适合跟踪用户行为或调试特定问题。

  • 注意:会产生大量日志,可能影响性能,不建议在生产环境长期开启

  • 配置方式:在my.cnf中设置:
    ini

    [mysqld]
    general_log = 1  # 启用通用查询日志
    general_log_file = /var/log/mysql/general.log  # 日志路径
    

总结:

以上就是关于MySQL的日志相关的东西 反正也蛮简单的

好了 希望大家开心!


网站公告

今日签到

点亮在社区的每一天
去签到