文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
前言
大家有没有想过为什么MySQL数据库可以实现主从复制,实现持久化,实现回滚的呢?其实关键在于MySQL里的三种log,分别是:
- binlog
- redo log
- undo log
这三种log也是面试经常会问的问题,下面我们一起来探讨一下吧。
一、binlog
binlog应该是日常中听的最多的关于mysql中的log。
那么什么是binlog呢?
binlog是用于记录数据库表结构和表数据变更的二进制日志,比如insert、update、delete、create、truncate等等操作,不会记录select、show操作,因为没有对数据本身发生变更。
binlog文件长什么样子呢?
使用mysqlbinlog命令可以查看。

会记录下每条变更的sql语句,还有执行开始时间,结束时间,事务id等等信息。
如何查看binlog是否打开,如果没打开怎么设置?
使用命令show variables like '%log_bin%';查看binlog是否打开。

如果像上图一样,没有开启binlog,那怎么开启呢?
找到my.cnf配置文件,增加下面配置(mysql版本5.7.31):
1 | # 打开binlog |
修改后,重启mysql,配置生效。
执行SHOW MASTER STATUS;可以查看当前写入的binlog文件名。

binlog用来干嘛的呢?
第一,用于主从复制。一般在公司中做一主二从的结构时,就需要master节点打开binlog日志,从机订阅binlog日志的信息,因为binlog日志记录了数据库数据的变更,所以当master发生数据变更时,从机也能随着master节点的数据变更而变更,做到主从复制的效果。

第二,用于数据恢复。因为binlog记录了数据库的变更,所以可以用于数据恢复。我们看到上面图中有个字段叫Position,这个参数是用于记录binlog日志的指针。当我们需要恢复数据时,只要指定**–start-position和–stop-position,或者指定–start-datetime和–stop-datetime**,那么就可以恢复指定区间的数据。
二、redo log
假设有一条update语句:
1 | UPDATE `user` SET `name`='刘德华' WHERE `id`='1'; |
我们想象一下mysql修改数据的步骤,肯定是先把id=’1’的数据查出来,然后修改名称为’刘德华’。再深层一点,mysql是使用页作为存储结构,所以MySQL会先把这条记录所在的页加载到内存中,然后对记录进行修改。但是我们都知道mysql支持持久化,最终数据都是存在于磁盘中。
假设需要修改的数据加载到内存中,并且修改成功了,但是还没来得及刷到磁盘中,这时数据库宕机了,那么这次修改成功后的数据就丢失了。
为了避免出现这种问题,MySQL引入了redo log。
