0

0

MySQL的rollback(总结分享)

WBOY

WBOY

发布时间:2022-06-24 12:54:45

|

6500人浏览过

|

来源于CSDN

转载

本篇文章给大家带来了关于mysql的相关知识,其中主要整理了rollback的相关问题,主要介绍了书屋回滚以及回滚机制等内容,下面一起来看一下,希望对大家有帮助。

MySQL的rollback(总结分享)

推荐学习:mysql视频教程

经常会遇到操作一张大表,发现操作时间过长或影响在线业务,想要回退大表操作的场景。在停止大表操作之后,等待回滚是一个很漫长的过程,尽管可能对知道一些缩短时间的方法,处于对生产环境数据完整性的敬畏,也会选择不做介入。

事务回滚

事务是关系型数据库里的执行单位,可以通过最后阶段控制选择提交或回滚。在各种无法保证完整性的场景下进行回滚操作。MySQL里回滚是通过Undo日志完成,Undo日志记录包含关于如何撤消事务相关的最新更改的信息。Undo日志存在于Undo日志段中,Undo日志段包含在回滚段中。回滚段位于undo表空间和全局Temporary表空间中。
关系如下:

image.png

  • undo文件

    image.png

mysql > show variables like '%undo%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| innodb_max_undo_log_size | 1073741824         |
| innodb_undo_directory    | /opt/data8.0/mysql |
| innodb_undo_log_encrypt  | OFF                |
| innodb_undo_log_truncate | ON                 |
| innodb_undo_tablespaces  | 2                  |
+--------------------------+--------------------+
5 rows in set (0.00 sec)

全局Temporary所指的一个临时表空间(ibtmp1),用于存储对用户创建的临时表所做更改的回滚段。

image.png

mysql > SELECT @@innodb_temp_data_file_path;
+-------------------------------+
| @@innodb_temp_data_file_path  |
+-------------------------------+
| ibtmp1:128M:autoextend:max:30G |
+-------------------------------+

理解了回滚包含的文件都有那些 ,继续往下看。

回滚机制:

MySQL回滚控制是内部innodb引擎协调解决,不提供人为控制的机制。目前提供的MySQL回滚参数如下:

mysql> SHOW VARIABLES LIKE  '%ROLL%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_rollback_on_timeout | OFF   |
| innodb_rollback_segments   | 128   |
+----------------------------+-------+

innodb_rollback_on_timeout:

InnoDB默认只在事务超时时回滚最后一条语句。如果指定了——InnoDB -rollback-on-timeout,事务超时将导致InnoDB中止并回滚整个事务。默认下是关闭的,一旦指定时间,如回滚失败。可以想象到数据会存在不一致的问题。这个方式不可取。

Innodb_rollback_segments(1~128):

云网OA
云网OA

采用JSP开发的办公自动化产品、基于B/S结构,运行环境:JDK v1.5、Tomcat v5.5、MySQL v4.1,三者均为以上版本其他相关内容:可视化流程设计: 流程支持串签、会签和分支流程,可以设置流程节点的修改、删除权限,并可指定流程中各个用户在表单中可以填写的域。智能表单所见即所得设计: 智能设计,自动在数据库中生成表格,方便优化程序 公共交流: 集论坛、博客、聊天室于一体文件柜:C

下载

定义了分配给每个undo表空间的回滚段的数量,以及为生成undo记录的事务分配的全局临时表空间的数量。
回滚段支持的事务数量:取决于回滚段中的撤销slot数量以及每个事务所需的撤销日志数量

官方提供的回滚段中undo槽的数量根据InnoDB页面大小有关:

image.png

从最新的MySQL8.0.27源码实现中 storage\innobase\include\trx0rseg.h:

/* Number of undo log slots in a rollback segment file copy 
这里 UNIV_PAGE_SIZE正常页面的大小  即 1024*/
#define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)

/* Maximum number of transactions supported by a single rollback segment 
单个回滚段支持的最大事务数1024/2=512
*/
#define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)

在默认情况下page中又划分了1024个slot槽(TRX_RSEG_N_SLOTS),每个slot又对应到一个undo log对象,因此理论上InnoDB可以支持 128 * 512=65536个普通事务。
原理部分参考MySQL · 引擎特性 · InnoDB undo log 漫游
官方提供undbo回滚并发读写场景:

image.png

从上诉的原理中回到实际应用场景中:
对于回滚段支持的能力,还是可观的,但往往执行大批量的回滚的时候非常慢。特别是在线处理过程中发现10w行回滚 有可能10分钟这样的情况。甚至更长时间。
下面通过sysbench准备5000w的单表数据,在无负载下,大概删除1分钟,之后通过kill -9,强制停止方式回滚事务:

image.png

明显重新启动效果更加。
但kill -9 方式容易把数据页损坏,存在很大的风险。日常当中数据库也有负载,可想而知,大事务回滚的代价非常大。

总结

应尽量避免大的回退操作,非常消耗数据库资源和性能,生产环境下会导致重大生产事故。避免不了大事务回滚,可以采取以下方式:

  • 对于批量操作,可以分批提交 比如1000行 ~5000行之类的
  • undo空间和全局临时表空间 可以适当的调整。建议4个undo文件,全局ibtmp1初始化1G
  • 高可用环境下,能确数据的一致性下,可以把从提升新主,提供服务,等待大事务回滚。
  • 极端情况下,可以通过 kill -9 重启操作会因为数据量非常大,导致mysql恢复缓慢,此时需要等待mysql进行崩溃恢复,根据数据量的不同,等待的时间也不同
  • 如重新启动过程中,存在数据页损坏或跳过回滚 ,可通过innodb_force_recovery=3(不执行事务回滚操作。)

推荐学习:mysql视频教程

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 791人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号