1.Innodb 支持事务(ACID)
原子性
整个事务中的所有操作要么全部完成,要么全部不完成,过程中如果发生异常,会被回滚到事务开始前的状态,就像这个事务一直没有开始一样
一致性
在事务开始之前和事务结束后,数据库的完整性约束没有被破坏
隔离性
如果有两个事务在相同的时间内,执行相同的操作,隔离性会保证每个事务在系统中认为只要该事务在使用系统,也就是串行,使得在一个时间只有一个请求用于同一数据
持久性
在事务完成,该事务对数据所作的变更持久保留在数据库之中,不会被回滚
2.保证数据库一致性和永久性的配置
innodb_flush_log_at_trx_commit=1
0:代表log buffer 每秒一次写入log file中,并且log file flush(刷到磁盘)中去,
1:在每次提交事务时mysql会把log buffer 的数据写入到log file中,并且flush(刷到磁盘)中去,该模式为系统默认
2: 每次事务提交时mysql都会把log buffer的数据写入到log file中,mysql 每秒一次执行一次flush(刷新到磁盘)操作
sync_binlog=1
innodb_flush_log_at_trx_commit 和 sync_binlog 都设置为1,写入性能最差,但是能很好的宝座数据库一致性和永久性
innodb_support_xa=1
多线程并发执行提交事务,按照事务的先后顺序写入binlog,如果关闭则binlog记录事务的顺序可能与实际不符,造成slave不一致
支持内部XA,确保binlog与innodb redo log之间数据一致性
现在mysql内部一个处理流程大概是这样:
1. prepare ,然后将redo log持久化到磁盘
2. 如果前面prepare成功,那么再继续将事务日志持久化到binlog
3. 如果前面成功,那么在redo log里面写上一个commit记录
如果再1,2步 crash,事务会回滚,如果3步crash(仅仅只是没有commit), 优先从redo log 将最近的检查点开始的事务读出来,参考binlog里面的事务进行恢复,因为binlog记录了这个事务,将这个事务进行commit,如果没有则将这个事务进行回滚。
3.二进制日志
binlog:当有数据写入到数据库的时候,还会同时把更新的sql写入到对应的binlog文件中,同时也被称为二进制日志,不管什么引擎对数据库进行操作都会产品操作日志
在/etc/my.cnf 中 log_bin=/xxx/xx 日志目录文件
4.innodb事务日志
1.redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
redo log 是在数据准备修改前写入的,写入后,才能执行操作。redo log 记录的是数据库中每页的修改
2.undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。
5.参考
https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html
网友评论