MySQL中的日志
binlog, undolog, redolog, relaylog, errorlog, slowlog
- 只有innodb存储引擎有 redolog,undolog
所有存储引擎都有binlog,errorlog,relaylog,slowlog - 既然有binlog,为什么还需要redolog,undolog?
因为在mysql刚开始诞生的时候,并没有innodb引擎,用的是myisam引擎,它不支持事务。
innodb引擎后来被创造之后,一开始是以插件的形式运行的,但是在5.5版本之后,默认使用的是innodb存储引擎 - binlog 三种模式对比
- statement:基于SQL语句的模式,某些语句中含有一些函数,例如
UUID
NOW
等在复制过程可能导致数据不一致甚至出错。 - row:基于行的模式,记录的是行的变化,很安全。但是 binlog 的磁盘占用会比其他两种模式大很多,在一些大表中清除大量数据时在 binlog 中会生成很多条语句,可能导致从库延迟变大。
- mixed:混合模式,根据语句来选用是 statement 还是 row 模式。
- statement:基于SQL语句的模式,某些语句中含有一些函数,例如
MySQL事务的四大特性
原子性 (Atomicity): 一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简
一致性 (Consistency) : 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
隔离性 (Isolation): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性 (Durability): 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
原子性实现原理: undo log
-
undo Log是为了实现事务的原子性,在MySQL 数据库InnoDB存储引擎中,还用undo Log来实现多版本并发控制(简称: MVCC)
-
在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态
-
注意: undo log是逻辑日志,可以理解为:
当delete、insert、update一条记录时,undolog中会记录相对于相反的insert、delete、update操作
一致性实现原理: redo log
Redo日志一innodb存储引擎的日志文件
-
当发生数据修改的时候,innodb引擎 会先将记录写到redo log中并更新内存,此时更新就算是完成了,同时innodb引擎会在合适的时机将记录操作到磁盘中
-
Redolog是固定大小的,是循环写的过程有了redolog之后,innodb就可以保证即使数据库发生异常重启,之前的记录也不会丢失,叫做crash-safe
-
Redo Log记录的是新数据的备份。在事务提交 高前,只要将Redo Log持久化即可,不需要将数据持久化当系统崩溃时,虽然数据没有持久化,但是Redo LogE经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态
-
为什么要有redolog?直接写数据不行吗?
WAL——Write Ahead Log溢日志
以下三种方法都不能做到严格不丢数据,都有可能丢失1秒钟数据。
批量操作的时候,不是每一次都提交事务,而是分批提交。
如果插了900条,剩下100条突然断电了,重启之后,可以使用redolog继续写
redolog相当于一个增量存储,redolog满了之后,会进行持久化的同步归档。然后将redolog清空
执行流程:
1、执行器先从引擎中找到数据如果在内存中直接返回,如果不在内存中,查询后返回
2、执行器拿到数据之后会先修改数据,然后调用引擎接口重新写入数据
3、引擎将数据更新到内存,同时写数据到redo中,此时处于prepare阶段,并通知执行器执行完成,可以操作
4、执行器生成这个操作的binlog
5、执行器调用引擎的事务提交接口,引擎把刚刚写完的redo改成commit状态更新完成