bin log
- bin log存储的是insert/delete/update的sql语句;
- 主要功能是复制和恢复,主服务器和从服务器需要保持数据一致,可以通过bin log来同步数据;
- 如果数据库的所有数据都被删除,可以通过bin log来进行恢复,bin log存储的是对所有数据的修改记录。
- bin log是所有sql都有的,不管用的是什么存储引擎;
- bin log在事务提交后才记录。
redo log
- 存储的是数据的物理变化,比如:在xxx页修改xxx;
- redo log是为持久化而生,事务中的四大特性中持久性就是由redo log来实现的,当数据写完内存后,如果在刷新到磁盘的过程中,数据库挂了,可以通过redo log来恢复内存中还未刷新的数据;
- redo log是InnoDB存储引擎产生的;
- redo log在事务一开始执行就开始记录。
bin log和redo log的实现细节
数据库会保证这两者的一致性,如果bin log失败,redo log成功,那从服务器就不能从主服务器得到最新数据;如果bin log成功,redo log失败,那从服务器可以得到最新数据,但是如果在写磁盘时,数据库挂了,那主服务器就无法恢复,所以一定要保证bin log和redo log的一致性,有两个阶段:
- InnoDB redo log写盘,事务处于prepare状态;
- InnoDB bin log写盘,事务处于commit状态。
- 每个事务在bin log的末尾,都会生成一个XID event,来标志事务是否提交成功,也就是说,在每次恢复过程中,bin log的最后一个 XID event之后的内容都会purge。
undo log
- undo log的作用是回滚和MVCC(并发控制);
- 在对事务进行更新的时候,不仅会记录redo log,还会记录undo log,undo log 记录的也是一系列的逻辑操作,而且是相反的操作,比如操作时insert,那就在undo log中记成delete,如果事务失败,那就用undo log来进行回滚;
- undo log中记录的修改前的记录,也就是前版本,MVCC要求是写读不阻塞,所以在读的时候,就返回undo log中的记录。
什么是主从复制
将主数据库的DDL和DML操作,通过二进制日志bin log发送到从数据库中,然后从数据库再根据这些日志从新执行,以达到从数据库和主数据库的数据保持一致。
主从复制的原理
- 主数据库在事务提交更新时将数据变更保存到bin log中;
- 主数据库再将bin log中的日志推送到中继日志 relay log 中,然后从数据库再根据relay log中的记录再从做数据变更操作,通过逻辑复制来保持跟主数据库的数据一致;
- 当从数据库启动复制时,会启动IO线程跟主数据库建立连接,然后主数据库启动bin log Dump线程去获取数据库事件并返回给IO线程,IO线程将事件读取到relay log中,从数据库再启动sql线程去读取relay log 中的事件并应用。