分享更有价值
被信任是一种快乐

MySQL Innodb恢复的方法教程

文章页正文上

这篇文章主要介绍“MySQL Innodb恢复的方法教程”,在日常操作中,相信很多人在MySQL Innodb恢复的方法教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL Innodb恢复的方法教程”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!MySQL 引擎特性 InnoDB 崩溃恢复过程innodb中的 3个lsninnodb的lsn和oracle的scn一样,是一个重要的概念。比如在flush list中正是是使用low lsn作为链表的条件
参考buf_page_t中的lsn_t oldest_modification;在checkpoint中记录的也是lsn
参考宏在物理文件中每个块最后的刷新lsn
参考宏FIL_PAGE_LSN在写日志落盘的时候也是以lsn为标准的
参考函数log_write_up_to实际上lsn就是表示的日志量的字节数,是一个累加的值,在5.7中表现为:及一个8字节非负的整数。最大值及2的64次方。有了这种物理上概念,lsn很容易换算为当前日志的偏移量。下面描述一下和检查点相关的几个lsnibdata第一个块FIL中的lsn(flush lsn):ibdata的26后面8字节是在innodb 干净关闭的时候进行更新的,如果不正常关闭不会进行写入(FIL_PAGE_FILE_FLUSH_LSN)redolog中MLOG_CHECKPOINT的lsn: redolog MLOG_CHECKPOINT lsn的写入是在每次checkpoint的时候同步写入的.干净关闭会更新。redolog header中的lsn:是在每次checkpoint的时候异步写入的在MLOG_CHECKPOINT写入之后.干净关闭会更新。
我们表示为lsn1/lsn2/lsn3
正常关闭3个lsn是相等的,如果非正常关闭innodb,lsn1不会更新,因此lsn3必然不和lsn1相等,则判定需要进行carsh recovery。MLOG_CHECKPOINTlog_checkpoint 函数由master线程调用,以及关闭数据库的时候调用,不断的向redo log中写入MLOG_CHECKPOINT和MLOG_FILE_NAMElog_group_checkpoint 写入checkpoint信息到log header正常innodb运行的情况下 checkpoint是由master线程触发。我们知道脏数据通过page clean线程和lru manager线程是在不断写盘的,那么在进行异常重启的的时候我们必须要知道一个恢复的起点,但是这个起点是不能记录在内存中必要固化到磁盘,恢复的时候读取这个点以后的redo进行恢复,而checkpoint就是完成这个事情下面是checkpoint的执行流程。正常情况下master会每秒进行检查点其作用有:(参考log_checkpoint函数)
1、检查是否有自上次检查点以来的脏数据写盘了
2、如果有则在redo里面会为每个修改过的文件写入MLOG_FILE_NAME,完成后写入一个总的MLOG_CHECKPOINT(参考fil_names_clear函数)
MLOG_FILE_NAME主要记录至上次检查点以来更改过的数据文件
MLOG_CHECKPOINT主要记录检查点的lsn
3、如果有则在redo header中写入相应的检查点信息包含(异步写)(参考log_group_checkpoint函数)Log sequence number 697794162
Log flushed up to 697794162
Pages flushed up to 697794162
Last checkpoint at 697794153697794162-697794153 = 9 刚好是MLOG_CHECKPOINT的长度
oldest_lsn last_checkpoint_lsn + SIZE_OF_MLOG_CHECKPOINT
SIZE_OF_MLOG_CHECKPOINT=9redo的写入有6个途径:
1、master 线程每秒调用 栈帧(可能是idle可能是active 和检测是否需要插入缓存合并有关)
2、master 线程每秒checkpoint调用 (可能是idle可能是active 和检测是否需要插入缓存合并有关)
3、page clean 线程调用 栈帧 /* Force the log to the disk before writing the modified block */
4、主线程commit 调用 栈帧
5、innodb shutdown
6、redo buffer不足1、master线程调用 栈帧(可能是idle可能是active 和检测是否需要插入缓存合并有关)2、master 线程checkpoint调用 (可能是idle可能是active 和检测是否需要插入缓存合并有关)3、page clean 线程调用 栈帧 /* Force the log to the disk before writing the modified block */4、主线程commit 调用 栈帧入口函数
innobase_start_or_create_for_mysql
recv_recovery_from_checkpoint_start
1、此函数需要输入flush的lsn及脏数据写入到的位置
这个数据从FIL_PAGE_FILE_FLUSH_LSN中读取,这个值
只在ibdata的第一个page有效其他均为0,他的读取来自于
函数Datafile::validate_first_page,
其中
*flush_lsn = mach_read_from_8(
m_first_page + FIL_PAGE_FILE_FLUSH_LSN);2、此函数首先建立红黑树用于恢复并且做 force recovery判断
(srv_force_recovery >= SRV_FORCE_NO_LOG_REDO)
然后调用
recv_find_max_checkpoint 此函数就是找到最大的checkpoint lsn、redo文件,以及field 就是相对于一个日志而讲所在的offset set (5121 or 5123)_
读取如下:3、recv_group_scan_log_recs
循环读取64K(RECV_SCAN_SIZE)日志到redo buffer(log_group_read_log_seg)
recv_scan_log_recs
本函数将64K 的redo 通过每个512 bytes block大小循环加入到(recv_sys_add_to_parsing免费主机域名_buf) 扫描到parse buffer
代码片段拷贝那么recv_group_scan_log_recs为第一层循环,循环扫描64K日志到redo buffer
然后调用recv_scan_log_recs以block单位(512b)大小循环加入到parse buffer,这是通过函数recv_sys_add_to_parsing_buf完成
等到64k加入到parse buffer后调用recv_parse_log_recs函数对每次加入 parse buffer的64k进行分析,分析是循环以record为单位的,主要分析MLOG_SINGLE_REC_FLAG还是MLOG_MULTI_REC_END,同时确保MLOG_MULTI_REC_END记录是完整的。完成后recv_parse_log_recs函数 还要将其加入到hash table函数为recv_add免费主机域名_to_hash_table,本函数是通过recv_parse_log_rec进行 (type spaceid page_no data)的剥离。recv_apply_hashed_log_recs 最后完成分析完成后的日志应用,从hash table中到此,关于“MySQL Innodb恢复的方法教程”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注云技术网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: 分析MySQL数据库Innodb中的事务隔离级别和锁的关系

本篇内容主要讲解“分析MySQL数据库Innodb中的事务隔离级别和锁的关系”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析MySQL数据库Innodb中的事务隔离级别和锁的关系”吧!update class_t…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册