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
- Linux 系统:通常在
-
配置方式 :在配置文件
my.cnf(或my.ini)中设置: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 3306或lsof -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)
-
作用 :记录所有对数据库数据的修改操作(如
INSERT、UPDATE、DELETE、CREATE等),不记录查询操作(如SELECT)。主要用于数据恢复 和主从复制。 -
特点:
- 以二进制格式存储,需用
mysqlbinlog工具查看内容。 - 日志文件按大小或时间自动轮转(如
mysql-bin.000001、mysql-bin.000002)。
- 以二进制格式存储,需用
-
配置方式 :在
my.cnf中启用并配置:ini[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
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
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
bashmysqldumpslow -s t /var/log/mysql/slow.log # 按执行时间排序显示
四、通用查询日志(General Query Log)
-
作用 :记录 MySQL 服务器所有的连接信息和执行的 SQL 语句(包括
SELECT、INSERT等所有操作),适合跟踪用户行为或调试特定问题。 -
注意 :会产生大量日志,可能影响性能,不建议在生产环境长期开启。
-
配置方式 :在
my.cnf中设置:ini
ini[mysqld] general_log = 1 # 启用通用查询日志 general_log_file = /var/log/mysql/general.log # 日志路径
总结:
以上就是关于MySQL的日志相关的东西 反正也蛮简单的
好了 希望大家开心!