目录
- 一,前言
- 二,binlog-备份日志
- 1,作用
- 2,使用场景
- 3,日志形式
- 4,binlog刷盘时机
- 三,redo log-重做日志
- 1,概念
- 2,为什么需要redo log
- 3,日志形式
- 4,redo log与binlog区别
- 四,undo log-回滚日志
- 1,undo log的内容和作用
- 2,mysql的日志
一,前言
MySQL实现事务、集群的主从复制,底层都离不开日志,所以日志是MySQL的精华所在。只有了解MySQL日志,才算是彻底搞懂MySQL
本文主要讲述MySQL的三大日志系统,Redo Log(重做日志)、Undo Log(恢复日志)、Bin Log(备份日志)
二,binlog-备份日志
1,作用
Bin Log记录的是逻辑日志,即原始的SQL语句,是MySQL自带的。
作用: 数据备份和主从同步。
2,使用场景
在实际应用中,binlog的主要使用场景有两个,分别是主从复制和数据恢复。
- 主从复制:在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。
- 数据恢复:通过使用mysqlbinlog工具来恢复数据。
3,日志形式
Bin Log共有三种日志格式,可以binlog_format配置参数指定
4,binlog刷盘时机
对于InnoDB存储引擎而言,只有在事务提交时才会记录biglog,此时记录还在内存中,那么biglog是什么时候刷到磁盘中的呢?mysql通过sync_binlog参数控制biglog的刷盘时机,取值范围是0-N:
- 0:不去强制要求,由系统自行判断何时写入磁盘;
- 1:每次commit的时候都要将binlog写入磁盘;
- N:每N个事务,才会将binlog写入磁盘。
从上面可以看出,sync_binlog最安全的是设置是1,这也是MySQL 5.7.7之后版本的默认值。但是设置一个大一些的值可以提升数据库性能,因此实际情况下也可以将值适当调大,牺牲一定的一致性来获取更好的性能。
三,redo log-重做日志
1,概念
redo log包括两部分:一个是内存中的日志缓冲(redo log buffer),另一个是磁盘上的日志文件(redo log file)。mysql每执行一条DML语句,先将记录写入redo log buffer,后续某个时间点再一次性将多个操作记录写到redo log file。这种先写日志,再写磁盘的技术就是MySQL里经常说到的WAL(Write-Ahead Logging) 技术
2,为什么需要redo log
- 事务的四大特性里面有一个是持久性,具体就是只要事务提交成功,数据库做的修改就被永久保存下来了,不可能因为任何原因再回到原来的状态。那么mysql是如何保证持久性的呢?最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中
- 但是这么做会有严重的性能问题,主要体现在两个方面:
(1)因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了
(2)一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差 - 因此mysql设计了redo log,具体来说就是只记录事务对数据页做了哪些修改
3,日志形式
redo log实际上记录数据页的变更,而这种变更记录是没必要全部保存,因此redo log实现上采用了大小固定,循环写入的方式,当写到结尾时,会回到开头循环写日志
4,redo log与binlog区别
四,undo log-回滚日志
1,undo log的内容和作用
undo log记录的是逻辑日志,也就是sql语句
比如:当我们执行一条insert语句时,Undo Log就记录一条相反的delete语句。
作用:
-
回滚事务时,恢复到修改前的数据。
-
实现 MVCC(多版本并发控制,Multi-Version Concurrency Control) 。
-
MySQL事务中原子性就是使用Undo Log实现的。
2,mysql的日志
MySQL的日志(log)主要包括以下几种类型:
- 错误日志(Error Log):记录MySQL服务器出现错误的信息,如非法用户连接、语法错误等。
- 二进制日志(Binary Log):记录MySQL服务器执行的所有修改数据的操作语句,如INSERT、DELETE、UPDATE。
- 慢查询日志(Slow Query Log):记录查询运行时间超过指定阈值(slow_query_log_threshold)的SQL语句。
- 查询日志(Query Log):记录所有客户端与MySQL服务器交互的命令,包括查询和修改等操作。
- 事务日志(Transaction Log):记录所有接收到的SQL语句,可以用于回滚和恢复。
- 中继日志(Relay Log):主要用于MySQL的主从复制机制,用于将主服务器的二进制日志复制到从服务器上。
以上就是MySQL的常用日志类型。