概述

InnoDB作为事务性引擎,使用write-ahead logging(WAL)机制保证ACID中的Automicity和Durability,使用undo机制保证ACID中的Consistency和Isolation。


WAL和undo的机制

按照WAL和undo的机制,形成以下两个原则:

1、数据块的更改需要先记录redo日志。

2、数据块的更改需要先写入undo。

根据这两个原则,InnoDB更新数据的基本流程可以简单的总结为:

  1. 记录需要更改undo record的redo log
  2. 记录需要更改data record的redo log
  3. 写入redo log
  4. 写入undo record
  5. 更新data record

InnoDB Recovery

如果MySQL实例异常crash,那么重启过程中首先会进行InnoDB recovery。 即:根据last checkpoint点,顺序读取后面的redo log,按照先前滚,再回滚的原则, 应用所有的redo log。

因为redo record中记录着数据块的地址(space_id+page_no),所以recovery的过程首先会执行合并相同数据块的操作,以加快recovery的过程。

那么mysql数据库怎么根据space_id找到对应IDB数据文件? 因为在恢复的过程中,InnoDB只load了redo文件和系统表空间文件,如何查找InnoDB的数据文件呢?

  1. InnoDB的数据字典dict_table_t结构中也保存了对应关系,但数据字典受redo保护,recovery的过程中不可用。
  2. 扫描datadir的所有数据文件,读取page中保存的space_id,建立space_id和数据文件的对应关系。 MySQL目前采用第二种方式,但带来了一个问题,当设置了innodb_file_per_table后,每一个表对应一个表空间,那么需要读取所有的目录下的所有Innodb数据文件,这样就会严重的影响了recovery的时间。

MySQL 5.7改进策略:

MySQL 5.7中,在redo log中增加了一种新的record类型,即MLOG_FILE_NAME,记录了自last checkpoint以来更改的数据文件的file name。 这样在应用的时候,直接根据文件名就可以找到数据文件。


Oracle的设计机制

Oracle数据库recovery的过程中,有没有这个问题呢? 答案是没有。

看下Oracle的设计机制:

oracle同样在系统表空间中记录了数据字典,受redo保护,可以通过DBA_开头的表来查询。但Oracle还维护了一个control file,控制文件中记录了database name,redo file,datafile,backup等信息,通过v$开头的表查询。 当Oracle在recovery的过程中,需要数据库在mount状态下,即打开了控制文件,这时数据字典还不可用(DB没有open),在应用redo log的时候,根据控制文件中的v$datafile,检索file_id和file_name的对应关系。 MySQL是根据datadir,innodb_data_home_dir,innodb_log_group_home_dir等几个目录配置,通过文件系统的查找,找到相应文件的,而Oracle维护了一个集中式的control file管理这些初始加载的文件地址。


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

mysql如何植入到oracle_MySQL性能优化之数据库Recovery改进策略相关推荐

  1. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  2. MySQL相关参数配置及性能优化

    MySQL及其优化 文章目录 MySQL及其优化 数据库相关概念 事务的四大特性ACID 影响mysql数据库性能的几个方面 数据库性能优化的重点 CentOS系统参数优化 内核相关参数(/etc/s ...

  3. Android 性能优化之数据库优化(一)

    Android性能优化系列汇总已完成,包括: Android 性能优化实例 Android 性能优化之数据库优化(一) Android 性能优化之布局优化 (二) Android 性能优化之Java( ...

  4. MySQL索引使用方法和性能优化

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  5. MySQL史上最全性能优化方式

    MySQL有哪些性能优化方式?这个问题可以涉及到 MySQL 的很多核心知识,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 所 ...

  6. oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...

    本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...

  7. 熟悉mysql数据库设计和性能优化_Mysql数据库性能优化

    Mysql数据库性能优化,可以从下面三点入手: 数据库设计 SQL语句优化 架构优化 一.数据库设计优化 1.适度的违反范式,适度    遵循三大范式就会带来查询时经常需要join,导致查询效率降低 ...

  8. 转:MySQL史上最全性能优化方式

    一.设置索引 索引是一种可以让SELECT语句提高效率的数据结构,可以起到快速定位的作用. 索引的优缺点: 优点:某些情况下使用select语句大幅度提高效率,合适的索引可以优化MySQL服务器的查询 ...

  9. mysql 前索引_MySQL查询性能优化前,必须先掌握MySQL索引理论

    数据库索引在平时的工作是必备的,怎么建好索引,怎么使用索引,可以提高数据的查询效率.而且在面试过程,数据库的索引也是必问的知识点,比如: 索引底层结构选型,那为什么选择B+树? 不同存储引擎的索引的体 ...

最新文章

  1. “决胜算力时代 ”AI算力高端闭门分享会(7月21日)
  2. 后浪来袭!拼多多黄峥身价超过马云,成为中国第二大富豪
  3. 使用salt-api来搭建salt自动化平台
  4. STM32 电机教程 11 - BLDC 6 步方波开环速度控制
  5. 计算机听不到音乐怎么回事,电脑听不到声音怎么解决 电脑听不到声音的处理方法...
  6. OneAPM CI与阿里云容器服务集成
  7. poj3009深度优先搜索挑战程序设计竞赛
  8. 正交试验设计例题及答案_正交表测试用例设计方法的特点是什么?
  9. Qt 模态对话框不模态的问题
  10. 64位linux下的gns3网络模拟器配置
  11. Spring事务总结(一) 内部调用事务失效、异常回滚
  12. 程序结构程序设计(四)
  13. PHP+MYSQL 出现乱码的解决方法
  14. 转载:cisco voip转码设置
  15. RHEL6 开启远程桌面
  16. 分不清ERP、SAP、MES?我来帮你搞定
  17. 硬盘坏了怎么修复 教你如何修复硬盘坏道
  18. 小程序发布上线流程_微信小程序发布流程
  19. 微信支付 H5 版本 PHP
  20. win2003企业版安装

热门文章

  1. SpringBoot | 第三十五章:Mybatis的集成和使用
  2. vue 截取视频第一帧
  3. MOOC网站日志分析
  4. Java CompletableFuture
  5. CentOS6离线bash漏洞—再修复方法
  6. QTP学习笔记----2013.04.25
  7. 『後起Android开发02』对SharedPreferences和Toast的简单封装
  8. 编译内核模块找不到内核头文件解决办法
  9. spring 注解重复(防重复请求)
  10. 运用Java对微信公众平台二次开发技术——开发者模式接入