5.1redo undo
Redo用于前滚 undo用于回滚和一致性读
redo:在页修改的时候,先写到redo log buffer 里面,然后写到redo log 的文件系统缓存里面(fwrite),然后再同步到磁盘文件(fsync)。 每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改
Undo:在MySQL5.5之前,undo只能存放在ibdata*文件里面,5.6之后,可以通过设置innodb_undo_tablespaces参数把undo log存放在ibdata*之外。当一些更改在执行一半时,发生意外,而无法完成,则可以根据撤消日志恢复到更改之前的壮态。
5.2事务时如何通过日志来实现的
因为事务在修改页时,要先记undo,在记undo之前要记undo的redo,然后修改数据页,再记数据页修改的redo。Redo(里面包括undo的修改)一定要比数据页先持久化到磁盘。当事务需要回滚时,因为有undo,可以把数据页回滚到前镜像的状态,崩溃恢复时,如果redo log中事务没有对应的commit记录,那么需要用undo把该事务的修改回滚到事务开始之前。如果有commit记录,就用redo前滚到该事务完成时并提交掉。
5.3 mysql binlog的几种日志录入格式以及区别
(1) 各种日志格式的涵义
Statement/row模式,mixed模式是二者的结合
(2) 适用场景
在一条SQL操作了多行数据时,statement更节省空间,row更占用空间。但是row模式更可靠。
(3)结合第一个问题,每一种日志格式在复制中的优劣。
Statement可能占用空间会相对小一些,传送到slave的时间可能也短,但是没有row模式的可靠。Row模式在操作多行数据时更占用空间,但是可靠。
5.4 inndob四种事务的隔离级别都是什么
四种隔离级别:
readuncommitted 未提交读
readcommitted 读取已提交
repeatableread 可重读
serializable 串行化读
不同级别的现象:
脏读:一个事务可以读取到另一个事务尚未提交的数据
不可重复读:两个事务读取同一条记录,两次读取的结果不一样
幻读:在一个事务中,由于其他插入操作事务的提交,导致返回了以前不存在的记录
不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差。