设为首页 加入收藏

TOP

深入理解MySQL innodb日志管理(二)
2018-11-25 16:13:36 】 浏览:230
Tags:深入 理解 MySQL innodb 日志 管理
宕机,buffer    pool太小,恢复起来也会比较慢;


1.8、redo日志记录格式:


 innodb的日志是具有逻辑意义的物理日志,所以,日志记录的格式就不完全是物理信息,而是有一定逻辑意义,基本的格式如下:
type(日志类型),space(表空间ID值),offset(前面space所指定的文件中的页面号,以页面大小为单位),data(表示这条日志记录对应的数据,这个数据是不确定的,根据不同的type值而不同)
---type类型有很多,比较常用的有:
①:mlog_ibyte、mlog_2bytes、mlog_4bytes、mlog_8bytes:这四个类型,表示要在某个位置,写入一个(两个、四个、八个)字节的内容;
②:mlog_write_string:这种类型的日志,其实和mlog_ibyte是类似的,只是mlog_ibyte是要写一个固定长度的数据,而mlog_write_string是要写一段变长的数据。
③:mlog_undo_insert:这个类型的日志,是在将一条记录设置为页面中的最小记录时产生的,因为只是打个标记,存储的内容比较简单;
④:mlog_init_file_page:这个类型的日志比较简单,只有前面的基本头信息,没有data部分;
⑤:mlog_comp_page_create:这个类型只需要村一个类型及要创建的页面的位置即可;
⑥:mlog_multi_rec_end:这个类型的记录是非常特殊的,它只起一个标记的作用,其存储的内容只有占一个字节的类型值。
⑦:mlog_comp_rec_clust_delete_mark:这个类型的日志是表示,需要将聚集索引中的某个记录打上删除标志;
⑧:mlog_comp_rec_update_in_place:这个类型的日志记录更新后的记录信息,包括所有被更新的列的信息。
⑨:mlog_comp_page_reorganize:这个类型的日志表示的是要重组指定的页面,其记录的内容也很简单,只需要存储要重组哪一个页面即可;


1.9、日志刷盘时机:共有5种时机:


①:log buffer空间用完了,这就会将已经产生的log buffer中的日志刷到磁盘中,这是最普遍的一种方式;
②:master线程在后台每秒钟刷一次,将当前log buffer中的日志刷到磁盘中;
③:每次执行DML操作时,都会主动检查日志空间是否足够,如果使用空间的量已经超过了一个预设的经验值,就会主动刷日志,以保证在后面真正执行时,不会再执行过程中被动的刷盘,但这里只会是写文件(写入OS缓冲中)不会刷盘
④:在做检查点的时候,要保证所有要刷的页面中LSN值最小的日志已经刷入到磁盘,不然,如果此时数据库宕机,日志不存在,但数据页面已经被修改,从而导致数据不一致,就违背了写日志的原则;
⑤:提交逻辑事务时,会因为参数innodb_flush_log_at_trx_commit值的不同,产生不同的行为。如果设置0,则在事务提交时,根本不会去刷日志缓冲区,这种设置是最危险的;如果设置2,则在事务提交时会将日志写入到文件中,但不会去刷盘,只要操作系统不挂,即使数据库挂了,数据还是不会丢失,一般都是设置为2;


1.10、redo log刷盘机制:


当提交事务(逻辑)时,可以通过参数innodb_flush_log_at_trx_commit来控制redo log写入的机制,参数值不同,产生的行为不同,主要参数值如下:


①: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的时候就不回滚了,这样可能导致数据库逻辑上的不一致;


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MySQL InnoDB 日志管理机制中的MT.. 下一篇MySQL 5.7基础之innodb存储引擎总..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目