1.三个主要文件:binlog、redolog和undolog
- binlog主要用来对数据库进行数据备份、崩溃恢复和数据复制等操作
-
binlog则适用于所有存储引擎
-
binlog是MySQL用于记录数据库中的所有DDL语句和DML语句的一种二进制日志,记录了所有对数据库结构和数据的修改操作,如INSERT、UPDATE和DELETE等。
-
MySQL的bin log主要支持三种格式,分别是statement、row以及mixed
-
当binlog的格式为statement时,binlog 里面记录的就是 SQL 语句的原文 ,会导致主从不一致的问题
-
当binlog的格式为ROW格式时,bin log会记录每个数据更改的具体行的细节,不会导致主从不一致的问题
-
当binlog的格式为mixed格式时,自动在row和statement中互相切换选择一个,在RR下,row和statement都可以生效,但是在RC下,只有row格式才能生效
-
-
-
redo log和undo log主要用于事务管理,redolog用来做恢复,undolog用来做回滚。
-
MySQL会利用Redo Log记录事务的所有数据更改,将事务所做的修改持久化到磁盘中
-
MySQL会将事务修改前的数据记录到Undo Log中,如果事务需要回滚,则会从Undo Log中找到相应的记录来撤销事务所做的修改。Undo Log还支持MVCC(多版本并发控制)机制,用于在并发事务执行时提供一定的隔离性。
-
redo log和undo log只适用于InnoDB存储引擎,因为要支持事务。而不适用于MyISAM等其他存储引擎
-
2.什么是数据库事务
-
数据库事务定义:
-
数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位
-
-
事务应该具有4个属性(ACID)
-
原子性(Atomicity)
-
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
-
-
一致性(Consistency)
-
事务应确保数据库的状态从一个一致状态转变为另一个一致状态
-
一致状态的含义是数据库中的数据应满足完整性约束。
-
-
隔离性(Isolation)
-
多个事务并发执行时,一个事务的执行不应影响其他事务的执行
-
-
持久性(Durability)
-
一个事务一旦提交,他对数据库的修改应该永久保存在数据库中
-
-
-
注意:InnoDB存储引擎会对SELECT * 这种普通的读取操作自动开启一个隐式事务。
InnoDB的所有操作都可以说是在事务的上下文中执行的,包括读取操作和修改操作。
3.一次事务是怎么实现的
-
以InnnoDB的update操作为例子
-
在Buffer Pool中读取数据,如果没有,从磁盘中读取数据页到Buffer Pool中
-
在修改操作前,通过UndoLog记录修改前的数据,然后由1个后台线程定时刷新到磁盘中的
-
在Buffer Pool中更新数据,并将相关数据页设置为脏页,并将修改记录到RedoLog中
-
修改完毕之后会提交事务,在提交事务时会记录binlog和redo Log到磁盘,这个过程会发生二阶段提交
-
提交后,InnoDB会将Buffer Pool中的脏页通过异步线程写入磁盘
-
4.什么是事务的二阶段提交
-
MySQL事务的2阶段提交
-
其实就是保证binlog和redolog一致性的一种手段。
-
-
2阶段提交过程
-
Prepare 阶段
-
将 XID( 事务 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后将 redo log 持久化到磁盘
-
-
Commit 阶段
-
把 XID 写入到 binlog,然后将 binlog 持久化到磁盘
-
将 redo log 状态设置为 commit
-
-
-
为什么这个过程需要用2阶段提交的方式呢?
-
我们执行一条SQL语句时,会发生如下情况:
-
redo log 成功,bin log失败。在MySQL重启后,可以根据redolog更新记录,binlog由于没写成功,主备同步的时候会导致主备库之间数据不一致
-
写入binlog成功,写入redolog失败。在MySQL重启之后,由于redo log还没写,数据库记录还是旧值。在做主备同步的时候,binlog已经写入成功了就会把新值同步到备库
-
-
-
二阶段如何保持一致性的
-
redo log (prepare阶段)写入成功,bin log写入失败,重启后直接回滚事务即可
-
redo log (prepare阶段)写入成功,bin log写入后崩溃,重启后检查 binlog 中的事务是否存在并且完整,如果存在且完整,则直接提交事务,如果不存在或者不完整,则回滚事务
-
redo log (commit阶段)写入失败,重启后检查 binlog 中的事务是否存在并且完整,如果存在且完整,则直接提交事务,如果不存在或者不完整,则回滚事务
-
5.MySQL主从复制的过程
-
主从复制的过程
-
主服务器通过binlog dump线程将更新操作记录到binlog
-
从服务器的I/O线程会与binlog dump线程交互,从服务器的I/O线程从主服务器拉取binlog并存入relay log,SQL线程则读取relay log并执行其中的SQL操作以更新数据表。
-
- 主从复制方式
- 异步复制:主库执行完一个事务之后,立刻反馈给客户端
- 全同步复制:主库执行完一个事务之后,所有从库完成数据复制之后,在反馈给客户端
- 半同步复制:主库执行完一个事务之后,一个从库完成数据复制之后,在反馈给客户端