①:innodb_flush_log_at_trx_commit=0
事务提交时,MySQL不会去处理日志缓存区的内容,也不会去处理日志文件的刷盘操作,由MySQL的后台master线程每隔1s将缓存区的文件刷新到日志文件中;(主机正常,数据库宕机后:一般只会丢失最近1s的事务)
②:innodb_flush_log_at_trx_commit=1
事务提交时,会将日志缓冲区的日志写入到文件中,同时会刷新到磁盘中,保证数据库事务完全不会丢失。这种设置影响数据库性能;(主机正常,数据库宕机后:数据不会丢失)
③:innodb_flush_log_at_trx_commit=2
事务提交时,会将日志缓存区日志写入到文件中,但是不会刷新到磁盘中。由MySQL的后台master线程每隔1s将系统缓存的日志文件刷新到磁盘中;(主机正常,数据库宕机后:数据不会丢失)
---注意:如果数据库所在主机宕机后:参数0 会丢失最近1s的事务;参数1 不会有任何数据丢失; 参数2 会丢失最近1s的事务;
第二、数据库undo段管理:
在innodb中支持的回滚段总共有:128X1024=131072个,在每一个事务开始的时候,都会分配一个rseg,就是从长度为128的数组中,根据最近使用的情况,找到一个临近位置的rseg;
在事务执行的过程中,会产生两种回滚日志,一种是insert的undo记录,一种是update的undo记录;(因为innodb把undo分为两类,一类就是新增,也就是insert,一类是修改,就是update,分类的依据就是事务提交后要不要做purge操作,因为insert是不需要purge的,只要事务提交了,那这个回滚记录就可以丢掉了,而对于更新和删除操作而言,如果事务提交了,还需要为MVCC服务,那就需要将这些日志放到history list中去,等待去做purge已经MVCC的多版本查询等,所以分为两类)
2.1、数据库undo日志记录格式:
undo有4种类型:
①:trx_undo_insert_rec:记录插入的undo日志类型,插入记录用于回滚时,只需要通过其主键就可以实现回滚操作,所以在undo日志中,只记录了表ID及主键信息;
②:trx_undo_upd_exist_rec:更新一条存在记录的undo日志类型;
③:trx_undo_upd_del_rec:更新一条已经打了删除标志记录的undo日志类型;
④:trx_undo_del_mark_rec:删除记录时对记录打删除标志的undo日志类型;
---注意:与redo日志记录存储不同,undo日志的存储,是不会垮页面的;
---注意:使用参数innodb_force_recovery来决定要不要做回滚操作,如果设置3或3以上,那么在启动innodb的时候就不回滚了,这样可能导致数据库逻辑上的不一致;