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[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
中启用并配置:[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
工具分析:
bashmysqldumpslow -s t /var/log/mysql/slow.log # 按执行时间排序显示
四、通用查询日志(General Query Log)
作用:记录 MySQL 服务器所有的连接信息和执行的 SQL 语句(包括
SELECT
、INSERT
等所有操作),适合跟踪用户行为或调试特定问题。注意:会产生大量日志,可能影响性能,不建议在生产环境长期开启。
配置方式:在
my.cnf
中设置:
ini[mysqld] general_log = 1 # 启用通用查询日志 general_log_file = /var/log/mysql/general.log # 日志路径
总结:
以上就是关于MySQL的日志相关的东西 反正也蛮简单的
好了 希望大家开心!