MySQL 错误日志 Error Log

本文深入解析MySQL的日志系统,涵盖错误日志、通用日志、更新日志等各类日志的功能与用途,以及如何通过配置文件调整日志行为,特别强调了错误日志在故障排查中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等。这些日志可以帮助我们定位mysqld内部发生的事件,数据库性能故障,记录数据的变更历史,用户恢复数据库等等。本文主要描述错误日志文件。

 

1、MySQL日志文件系统的组成
   a、错误日志:记录启动、运行或停止mysqld时出现的问题。
   b、通用日志:记录建立的客户端连接和执行的语句。
   c、更新日志:记录更改数据的语句。该日志在MySQL 5.1中已不再使用。
   d、二进制日志:记录所有更改数据的语句。还用于复制。
   e、慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。
   f、Innodb日志:innodb redo log
  
   缺省情况下,所有日志创建于mysqld数据目录中。
   可以通过刷新日志,来强制mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。
   当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,则日志被老化。
   对于存在MySQL复制的情形下,从复制服务器将维护更多日志文件,被称为接替日志。

 

2、错误日志
   错误日志是一个文本文件。
   错误日志记录了MySQL Server每次启动和关闭的详细信息以及运行过程中所有较为严重的警告和错误信息。
   可以用--log-error[=file_name]选项来开启mysql错误日志,该选项指定mysqld保存错误日志文件的位置。
   对于指定--log-error[=file_name]选项而未给定file_name值,mysqld使用错误日志名host_name.err 并在数据目录中写入日志文件。
   在mysqld正在写入错误日志到文件时,执行FLUSH LOGS 或者mysqladmin flush-logs时,服务器将关闭并重新打开日志文件。
   建议在flush之前手动重命名错误日志文件,之后mysql服务将使用原始文件名打开一个新文件。
   以下为错误日志备份方法:
      shell> mv host_name.err host_name.err-old
      shell> mysqladmin flush-logs
      shell> mv host_name.err-old backup-directory

 

3、实战演示
#启用错误日志,缺省情况下文件名为: hostname.err
#下面2种方式均可进行错误日志的配置
--log-error=file_name #命令行选项(command option)
log-error=file_Name   #配置文件(configure file)

#查看当前的错误日志配置,缺省情况下位于数据目录
mysql> show variables like 'log_error';
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| log_error     | /var/lib/mysql/SZDB.err |
+---------------+-------------------------+
1 row in set (0.00 sec)

#查看当前mysql server错误日志文件
SZDB:/var/lib/mysql # tail SZDB.err
140906 22:06:45 InnoDB: Completed initialization of buffer pool
140906 22:06:45 InnoDB: highest supported file format is Barracuda.
140906 22:06:45  InnoDB: Waiting for the background threads to start
140906 22:06:46 InnoDB: 5.5.37 started; log sequence number 1605345
140906 22:06:47 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
140906 22:06:47 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
140906 22:06:47 [Note] Server socket created on IP: '0.0.0.0'.
140906 22:06:47 [Note] Event Scheduler: Loaded 0 events
140906 22:06:47 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.37-log'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL)

#停止mysql服务器
SZDB:~ # service mysql stop
Shutting down MySQL....                                               done

#使用配置文件来设置log-error参数
SZDB:~ # echo "log-error=/tmp/SZDB.err">>/etc/my.cnf
SZDB:~ # echo "skip_opt">>/etc/my.cnf     #添加一个异常参数skip_opt
SZDB:~ # grep -v ^# /etc/my.cnf
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
log-error=/tmp/SZDB.err
skip_opt

#Author : Leshami
#Blog   : http://blog.youkuaiyun.com/leshami
#启动mysql服务器
SZDB:~ # mysqld_safe --user=mysql &
[1] 7315
SZDB:~ # 140907 13:40:33 mysqld_safe Logging to '/tmp/SZDB.err'.
140907 13:40:33 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140907 13:40:33 mysqld_safe mysqld from pid file /var/lib/mysql/SZDB.pid ended
[1]+  Done                    mysqld_safe --user=mysql
SZDB:~ # more /tmp/SZDB.err
140907 13:40:33 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140907 13:40:33 [ERROR] /usr/sbin/mysqld: ambiguous option '--skip-opt' (--skip-optimizer_prune_level)
140907 13:40:33 [ERROR] Aborting          #出现错误提示为有歧义的参数,实例终止
140907 13:40:33 mysqld_safe mysqld from pid file /var/lib/mysql/SZDB.pid ended

#修改my.cnf,删除skip-opt选项
SZDB:~ # vi /etc/my.cnf
SZDB:~ # grep -v ^# /etc/my.cnf
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
log-error=/tmp/SZDB.err

#再次启动mysql服务器
SZDB:~ # mysqld_safe --user=mysql &    
[1] 7511
SZDB:~ # 140907 13:43:23 mysqld_safe Logging to '/tmp/SZDB.err'.
140907 13:43:23 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
SZDB:~ # more /tmp/SZDB.err
140907 13:40:33 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140907 13:40:33 [ERROR] /usr/sbin/mysqld: ambiguous option '--skip-opt' (--skip-optimizer_prune_level)
140907 13:40:33 [ERROR] Aborting
#以下内容为正常启动的相关信息
140907 13:40:33 mysqld_safe mysqld from pid file /var/lib/mysql/SZDB.pid ended
140907 13:43:23 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140907 13:43:23 [Note] Plugin 'FEDERATED' is disabled.
140907 13:43:23 InnoDB: The InnoDB memory heap is disabled
140907 13:43:23 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140907 13:43:23 InnoDB: Compressed tables use zlib 1.2.3
140907 13:43:23 InnoDB: Using Linux native AIO
140907 13:43:23 InnoDB: Initializing buffer pool, size = 128.0M
140907 13:43:23 InnoDB: Completed initialization of buffer pool
140907 13:43:23 InnoDB: highest supported file format is Barracuda.
140907 13:43:23  InnoDB: Waiting for the background threads to start
140907 13:43:24 InnoDB: 5.5.37 started; log sequence number 1620641
140907 13:43:25 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
140907 13:43:25 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
140907 13:43:25 [Note] Server socket created on IP: '0.0.0.0'.
140907 13:43:25 [Note] Event Scheduler: Loaded 0 events
140907 13:43:25 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.37-log'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL)

从上面的错误日可以看出,错误日志文件的格式,通常如下:
  时间  [错误级别]  错误信息
  有些日志信息不一定包含错误级别

 

鹏城DBA总群 

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
### MySQL 错误日志及解决方案 在处理 MySQL 相关问题时,错误日志是一个非常重要的诊断工具。MySQL错误日志通常存储在数据目录中,默认路径为 `/var/log/mysql/error.log` 或 `/var/log/mysqld.log`,具体取决于操作系统和配置[^1]。 #### 1. 检查错误日志 可以通过以下命令查看 MySQL错误日志文件: ```bash sudo tail -n 50 /var/log/mysql/error.log ``` 如果日志文件不存在或路径不同,请检查 MySQL 配置文件(通常是 `/etc/mysql/my.cnf` 或 `/etc/my.cnf`)中的 `log-error` 参数设置。例如: ```ini [mysqld] log-error=/var/log/mysql/error.log ``` #### 2. 常见错误及其解决方法 - **InnoDB 初始化失败** 如果日志中显示 InnoDB 初始化错误,可能是因为磁盘空间不足、文件损坏或配置参数不正确。可以尝试以下步骤: - 确保有足够的磁盘空间:`df -h` - 检查并修复 InnoDB 数据文件:`mysqlcheck --all-databases --repair --use-memory=512M` - 如果问题仍未解决,可以尝试删除 InnoDB 日志文件(确保已备份数据)并重启服务: ```bash sudo rm -f /var/lib/mysql/ib_logfile* sudo systemctl restart mysql ``` - **MySQL 无法启动** 当错误日志显示 `ERROR! The server quit without updating PID file` 时,可能是由于权限问题或配置错误导致的。以下是解决方法: - 确保 MySQL 数据目录的所有权正确: ```bash sudo chown -R mysql:mysql /var/lib/mysql ``` - 检查是否有重复的 MySQL 实例运行: ```bash ps aux | grep mysql ``` - 如果发现冲突实例,停止所有相关进程后重试。 - **插件未加载错误** 如果日志中出现类似 `ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded` 的信息,可能需要调整用户认证方式。可以通过以下 SQL 命令更改默认认证插件: ```sql ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; ``` 此外,确认 MySQL 配置文件中是否启用了相关插件[^3]。 #### 3. 调试与进一步排查 如果上述方法无效,可以尝试以下调试手段: - 启动 MySQL 时启用详细日志输出: ```bash sudo mysqld_safe --log-error-verbosity=3 & ``` - 使用 `strace` 工具跟踪 MySQL 进程的行为: ```bash sudo strace -f -e trace=file -p $(pgrep mysqld) ``` ### 示例代码 以下是一个简单的脚本,用于自动检查和清理 MySQL 错误日志: ```bash #!/bin/bash LOG_FILE="/var/log/mysql/error.log" if [ ! -f "$LOG_FILE" ]; then echo "Error log file not found!" exit 1 fi echo "Last 10 lines of MySQL error log:" tail -n 10 "$LOG_FILE" # Check disk space DISK_USAGE=$(df -h /var/lib/mysql | awk 'NR==2 {print $5}' | sed 's/%//g') if [ "$DISK_USAGE" -ge 90 ]; then echo "Warning: Disk usage is over 90%!" fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值