一篇文章搞定MySQL所有日志!!!

1、binlog

概念

binlog是以二进制格式追加存储的归档日志,它属于server层,并且是逻辑日志,主要记录数据的变更操作,包括DDL和DML语言,但不包括数据查询(SELECT、SHOW)语句。

主要作用

数据备份、恢复、主从复制

三种格式

在内容存储的时候,有如下表的三种格式,可通过binlog_format参数进行设置

类型 说明
statement 主要记录的是SQL语句,主从同步时存在数据一致性问题
row(默认) 基于行的日志,主要记录的是数据的变化(变化前和变化后),能保证一致性
mixed statement和row的混合,默认是statement,某些情况下会转换为row

数据库常用SQL语句

sql 复制代码
#查看binlog开启状态
show variables like '%log_bin%';

#数据库查看binlog日志的格式
show variables like '%binlog_format%';

写入时机

graph LR A[binlog cache] B[page cache,即磁盘binlog 文件] C[硬盘, 持久化] A -->|write| B B -->|fysnc| C

事务执行过程中,先把日志写到binlog cache中,事务提交时再把cache中的数据写到binlog文件中,提供sync_binlog参数控制写入,sync_binlog有三种取值,如下表所示:

类型 说明
0 每次提交事务都只写到page cache中,宕机会丢失page cache中的binlog
1 每次提交事务都会执行fsync,即把文件保存到磁盘
N(N>1) 每次事务提交都写到page cache中,累计N个事务才进行fsync,如果宕机,会丢失N个事务的日志
tip:binlog cache每个线程分配一个,可通过binlog_cache_size控制大小,如果存储内容超过设置的大小,就要暂存到磁盘(Swap)

2、redo log

概念

重做日志,即在数据库崩溃的时候,可通过redo log恢复数据(InnoDB引擎独有),环形数组的形式进行循环写

主要作用

保证数据持久性、完整性

刷盘时机

graph LR A[mysql] B[redo log buffer, 在mysql内存] C[page cache, 磁盘中未持久化] D[硬盘, 已持久化] A --> B B --> C C --> D
  • 提供三种刷盘策略,可通过innodb_flush_log_at_trx_commit参数设置,具体可见下表格;
  • 另外InnoDB每隔1秒会把redo log buffer中的内容写到文件系统缓存(page cache),然后调用fsync进行刷盘;
  • 还有一种情况,当redo log buffer占用的空间即将达到innodb_log_buffer_size一半的时候,后台线程也会主动刷盘。
类型 说明
0 每次提交事务只写到redo log buffer中,mysql崩溃会丢失1s的数据
1(默认) 每次提交事务都会进行刷盘操作,将redo log持久化到磁盘
2 每次事务提交都只把redo log buffer中的内容写到page cache中,OS宕机会丢失1s的数据

二阶段提交

  • 假如redolog先写,binlog后写,如果binlog在写的过程中发生故障,那么数据库备份恢复的时候就会缺失这一部分数据
  • 假设binlog先写,redo log后写,如果redo log写的过程中发生故障,那么数据库重启后redo log中的数据就丢失

所以采用二阶段提交方案,即使在commit发生故障,也能通过事务id找到对应的binlog,从而提交事务恢复数据。

graph LR A[redo log prepared状态] B[binlog写] C[redo log commit] A --> B B --> C

3、undo log

概念

回滚日志

主要作用

保证事务原子性,形成版本链实现MVCC多版本并发控制

4、relay log

中继日志,主从同步过程中,从库将主库的binlog日志记录到relaylog中,然后通过sql线程去执行操作,从而保持主从同步。

5、错误日志

记录运行过程中的错误信息

sql 复制代码
#通过此系统变量查看错误日志文件的位置
show variables like '%log_error%';

6、查询日志

记录了所有操作的日志,包括增删改查,可通过general_log参数进行设置,默认是不开启的,且开启之后日志量增长迅速,所以不建议开启

ini 复制代码
#该选项用来开启查询日志,0代表关闭,1代表开启
general_log=1 

#设置日志的文件名,如果没有指定,默认的文件名为 host_name.log
general_log_file=mysql_query.log

7、慢查询日志

记录执行时间慢的DML语句,但不包括DDL和不走索引的查询,默认不开启,以下是常用参数设置:

ini 复制代码
#开启慢查询日志
slow_query_log=1;

#执行时间超过此参数的则记录在慢查询日志中(默认10s)
long_query_time=2

#扫描记录数超过此参数的语句记录在慢查询日志中
min_examined_row_limit=10000;

#默认情况下不开启对DDL语句和不走索引查询的记录,可通过以下参数开启
log_slow_admin_statements=1;
log_queries_not_using_indexes=1;
相关推荐
九皇叔叔26 分钟前
【7】SQL 语句基础应用
数据库·sql·mysql
喔烨鸭3 小时前
前后端分离情况下,将本地vue项目和Laravel项目以及mysql放到自己的云服务器
vue.js·mysql·laravel
她说人狗殊途8 小时前
[特殊字符] MySQL性能参数查询总结
数据库·mysql
灵犀物润9 小时前
MySQL 8 与 PostgreSQL 17 对比分析及迁移指南
数据库·mysql·postgresql
二闹9 小时前
别再傻傻分不清!MyBatis两种分页方式到底用哪个?
后端·mysql
异世界贤狼转生码农9 小时前
Ubuntu操作系统下使用mysql、mongodb、redis
mysql·mongodb·ubuntu
跑跑快跑10 小时前
Macbook安装MySQL报错
数据库·mysql
小鸡脚来咯13 小时前
mysql mvcc机制详解
数据库·mysql
计算机学姐14 小时前
基于SpringBoot的老年人健康数据远程监控管理系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·mybatis
夏天的味道٥14 小时前
MySQL explain命令的作用
android·mysql·adb