什么是InnoDB事务日志

你有没有在文本编辑器中使用过撤消或重做的功能,想像一下编辑器在那种场景下的操作?我确信你应该使用过。你相信吗?事务型数据库有同样的功能。可能不完全一样,但原理是相同的。

就像当你编辑文字时始终有能力撤消数步的重要性一样,重做和撤消功能也对事务型数据一样重要。为什么呢?

主要有两个原因:

1.回滚事务(那是撤消)

2.在数据库崩溃的情况下回放已提交的事务(那是重做)

  • 撤消

当你使用的是事务存储引擎(假设是InnoDB),你更改一个记录时,更改并没有马上写入数据文件。

首先,它们被写入到一个硬盘上特定的文件叫做事务日志。同时,它们也更改了内存 – InnoDB缓冲池。现在新InnoDB页面包含了已更改的记录叫脏数据。

被复制到硬盘上特别区域的原始未被更改的页面叫做回滚段。

如果有人在提交之前使用ROLLBACK中断了一个事务,撤消操作就发生了 – 你的记录已经被还原到原始状态。

由于更改还没有被写入到数据文件,这个操作相当简单 – InnoDB仅仅需要从回滚段中提取旧页面,从内存中擦除脏页,并在事务日志中标记那个事务已经回滚。

所以你看,数据文件从没有被更改,因为在执行随机写操作以把脏数据刷新到硬盘之前你已经把所有更改取消了。

  • 重做

当你提交事务,然后InnoDB确认你的提交,更改准备写入到实际的数据文件。

现在你认为它们会被马上写入到硬盘的数据文件,事实上不是这样的。为什么?因为这样做效率非常低。反而,更改仅仅被写入到事务日志(因为是顺序写,速度会很快,称为重做日志记录),而更改的记录仍然在日志中 – InnoDB缓冲池的脏页,过一定的时间才刷新到硬盘。

这时候MySQL崩溃了!

猜猜MySQL会怎样做?

如果MySQL(实际上是InnoDB)没有重做日志,仅仅是保留了脏页在内存中 – 所有未被刷新到硬盘已提交的事务将会永久丢失。

幸运的是,所以的更改总会写入到事务日志,

所以InnoDB需要做的就是在重做日志中找到上一次的checkpoint(已同步数据到硬盘的位置),然后重做未同步到硬盘已提交的事务。

  • 日志大小

    你可能想知道的一个事就是如何正确设置innodb_log_file_size的大小。

    规则很简单:

    • 小日志文件使写入速度更慢,崩溃恢复速度更快
    • 大日志文件使写入更快,崩溃恢复速度更慢

由于事务日志相当于一个写缓冲,而小日志文件会很快的被写满,这时候就需要频繁地刷新到硬盘,速度就慢了。如果产生大量的写操作,MySQL可能就不能足够快地刷新数据,那么写性能将会降低。

大的日志文件,另一方面,在刷新操作发生之前给你足够的空间来使用。反过来允许InnoDB填充更多的页面。

对于崩溃恢复 – 大的重做日志意味着在服务器启动前更多的数据需要读取,更多的更改需要重做,这就是为什么崩溃恢复慢了。

  • 重做日志大小

最后,让我们来谈谈如何找出重做日志的正确大小。

幸运的是,你不需要费力算出正确的大小,这里有一个经验法则:

在服务器繁忙期间,检查重做日志的总大小是否够写入1-2小时。

你如何知道InnoDB写入多少,下面有一个方法:


mysql> pager grep seq
mysql> show engine innodb status\G select sleep(60); show engine innodb status\G
Log sequence number 1777308180429
...
Log sequence number 1777354541591 mysql> nopager
mysql> select (1777354541591-1777308180429)*60/1024/1024;
+--------------------------------------------+
| (1777354541591-1777308180429)*60/1024/1024 |
+--------------------------------------------+
| 2652.80696869 |
+--------------------------------------------+
1 row in set (0.00 sec)

在这个60s的采样情况下,InnoDB每小时写入2.6GB数据。所以如果innodb_log_files_in_group没有更改(默认是2,是InnoDB重复日志的最小数字),然后设置innodb_log_file_size为2560M,那么你实际上两个日志文件加起来有5GB,够你写两小时数据了。

  • 更改重做日志大小

更改innodb_log_file_size的难易程度和能设置多大取决于你现在使用的MySQL版本。

特别地,如果你使用的是5.6之前的版本,你不能仅仅的更改变量,期望服务器会自动重启。

好了,下面是步骤:

1.在my.cnf更改innodb_log_file_size
2.停止mysql服务器
3.删除旧的日志,通过执行命令rm -f /var/lib/mysql/ib_logfile*
4.启动mysql服务器 – 应该需要比之前长点的时间,因为需要创建新的事务日志。

最后,需要注意的是,有些mysql版本(比如5.6.2)限制了重做日志大小为4GB。所以在你设置innodb_log_file_size为2G或者更多时,请先检查一下MySQL的版本这方面的限制。

设置MySQL重做日志大小的更多相关文章

  1. MySQL 重做日志文件

    一.innodb log的基础知识 · innodb log顾名思义:即innodb存储引擎产生的日志,也可以称为重做日志文件,默认在innodb_data_home_dir下面有两个文件ib_log ...

  2. mysql重做日志

    一.重做日志(redo log) 1.作用 确保事务的持久性. 防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性. 2 ...

  3. MySQL重做日志相关

      Ⅰ.事务的实现 这里我们先抛出答案,通过答案再展开分析 特性 实现 A(原子性) redo C(一致性) undo I(隔离性) lock D(持久性) redo/undo 本节针对redo展开分 ...

  4. MySQL重做日志(redo log)

    前面介绍了三种日志:error log.slow log.binlog,这三种都是 Server 层的.今天的 redo log 是 InnoDB引擎专有的日志文件. 为什么要有 redo log 用 ...

  5. 设置mysql二进制日志过期时间

    ((none)) > show variables like 'expire_logs_days'; +------------------+-------+ | Variable_name | ...

  6. MySQL慢日志功能分析及优化增强

    本文由  网易云发布. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据.本 ...

  7. mysql binlog日志自动清理及手动删除

    说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-b ...

  8. 清理docker容器的日志大小

    Docker容器日志清理 date :2019-04-08  13:57:40 1. 问题 docker容器日志导致主机磁盘空间满了.docker logs -f container_name 发现大 ...

  9. MySQL慢日志线上问题分析及功能优化

    本文来源于数据库内核专栏. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据 ...

随机推荐

  1. POJ 2528 Mayor's posters(线段树染色问题+离散化)

    http://poj.org/problem?id=2528 题意: 给出一面无限长的墙,现在往墙上依次贴海报,问最后还能看见多少张海报. 题意:这道题目就相当于对x轴染色,然后计算出最后还能看见多少 ...

  2. Flex 布局的各属性取值解释

    Flex布局是一种弹性布局.布局样式比较灵活,大多数情况下可以替代float,而且不会脱离文档里流. Flex中定义了两个轴线,一个主轴一个副轴,这个概念你可以想想屏幕坐标系(X轴向右,Y轴向下),F ...

  3. Spring4 MVC文件下载实例(javaconfig)

    展示如何使用Spring MVC4执行文件下载,我们将看到应用程序从文件系统内部以及外部文件下载文件. 下载文件是相当简单的,涉及以下步骤. 创建一个InputStream到文件用于下载. 查找MIM ...

  4. 利用JS将页面中包含“一个”字段值的元素改为红色

    document.body.innerHTML = document.body.innerHTML.replace(/一个/ig,"<span style='color: red;'& ...

  5. 2018-2019-2 网络对抗技术 20165332 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165332 Exp1 PC平台逆向破解 NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP汇编指令:执行到NOP指令时,CPU仅仅当做一个 ...

  6. poj3734矩阵快速幂

    挑战上面的题目,感觉脑洞很大 分别找红蓝个数全为偶,全为奇,一奇一偶的个数ai,bi,ci 转移矩阵是| 2 1 0 |,是一个对称矩阵(会不会有什么联系.) | 2 2 2 | | 0 1 2 | ...

  7. HDU 1969 精度二分

    Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  8. iOS笔记之文件读写

    最近做的项目中要存储一组图片数据,图片带有name,date等属性,处理办法是讲image图片直接存在沙盒documents文件中,再使用plist文件存储图片属性和image路径. 存入图片: - ...

  9. 《Agile Web Development With Rails》读后感--rails基于web设计的best Practices

    最近看完<Agile Web Development with Rails>一书,受益匪浅.书中先是用一个简单的web应用带你进入Rails的世界,然后在你大致熟悉之后,再带你了解Rail ...

  10. java回收finalize方法的作用(编程思想)

    清理:终结处理和垃圾回收 java有垃圾回收期负责回收无用对象占据的内存资源.但也有这种情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收期只知道释放那些由new分配的内存 ...