MySQL的rollback实例分析

本文主要介绍“MySQL的rollback实例分析”的相关知识,文中所提到的一些操作方法不仅实用性强,且操作简单、快捷,不仅能帮助大家取得一定工作成果,而且还能提升工作效率,如果感兴趣的话,请耐心阅读!

MySQL的rollback实例分析

事务回滚

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

MySQL的rollback实例分析

  • undo文件MySQL的rollback实例分析
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),用于存储对用户创建的临时表所做更改的回滚段。

MySQL的rollback实例分析

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):

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

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

MySQL的rollback实例分析

从最新的MySQL8.0.27源码实现中 storageinnobaseincludetrx0rseg.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个普通事务。
官方提供undbo回滚并发读写场景:

MySQL的rollback实例分析

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

MySQL的rollback实例分析

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

上述便是相关“MySQL的rollback实例分析”的所有详细介绍,如果您对于此事还存有困惑,可点击进入Worktile网站,检索相关频道栏目以获得大量相关内容。后面我也会按时对“MySQL的rollback实例分析”相关知识要点开展汇总和整理,为大伙儿奉上大量详尽、适用的常识具体内容。

本文有关“MySQL的rollback实例分析”的介绍就到这里,如果您已经掌握上述知识,那就赶紧行动实操一下!如果还需要了解更多“MySQL的rollback实例分析”相关内容,可点击进入Worktile网站相关频道,进行搜索与查询。

文章标题:MySQL的rollback实例分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/14820

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年6月27日
下一篇 2022年6月27日

相关推荐

  • Sqlmap自动化注入的示例分析

    使用sqlmap对dvwa进行自动化注入 设置dvwa级别为low 打开dvwa的SQL Injection(SQL Injection (Blind)),打开浏览器调试,输入user id并submit,查看拦截到的请求。 可以看到是一条GET请求,url“http://192.168.1.222…

    2022年9月16日
    53300
  • Javascript怎样替换数组中的特定值

    替换数组中的特定值 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。该方法会改变原始数组。特别需要注意插入值的位置! // arrayObject.splice(index,howmany,item1,…..,itemX)var plants = [‘Saturn’, ‘…

    2022年8月31日
    62200
  • windows print spooler内存不能为read怎么解决

    问题描述 spoolsv.exe在打印文档的时候报错,内存不能为read! 问题分析 spoolsv.exe 是Print Spooler的进程,管理所有本地和网络打印队列及控制所有打印工作。如果此服务被停用,本地计算机上的打印将不可用。该进程属 Windows 系统服务。 spoolsv.exe用…

    2022年9月2日
    42100
  • vue组件值变化但不刷新问题怎么解决

    今天分享文章“vue组件值变化但不刷新问题怎么解决”,主要从:组件值变化但不刷新强制组件刷新、bug复现、解决等几个方面为大家介绍,希望能帮到您。 组件值变化但不刷新强制组件刷新 在调用组件的时候,如果数据中只是某个属性变化(比如id)变化,在vue开发工具中看到变量值变化,但是组件上的数据就是不刷…

    2022年6月29日
    2.0K00
  • 导入mdf文件损坏如何解决

    解决方法: 1、安装D-RecoveryForMSSQLServer软件。 2、进入主界面。 3、点击“打开数据库文件”。 4、选择损坏文件点击“确定”。 5、左侧为打开文件。 6、点击把所有表导入数据库。 7、将信息填完整即可。 以上就是关于“导入mdf文件损坏如何解决”这篇文章的内容,相信大家都…

    2022年9月8日
    41600
  • windows声卡驱动被卸载了如何恢复

    声卡驱动被卸载了恢复方法: 方法一: 1、现在的系统都自带自动安装驱动的功能。 2、只要我们连接了网络,那么重启电脑就可以恢复声卡驱动了。 3、如果是耳机或音响等外接声音设备驱动,可以尝试拔出连接线重新连接即可恢复。 方法二: 1、如果电脑无法联网,那么可以尝试手动恢复。 2、右键开始菜单,打开“设…

    2022年9月21日
    68500
  • 怎么深入理解GOT表和PLT表

    0x01 前言 操作系统通常使用动态链接的方法来提高程序运行的效率。在动态链接的情况下,程序加载的时候并不会把链接库中所有函数都一起加载进来,而是程序执行的时候按需加载,如果有函数并没有被调用,那么它就不会在程序生命中被加载进来。这样的设计就能提高程序运行的流畅度,也减少了内存空间。而且现代操作系统…

    2022年9月26日
    86900
  • Codeql如何分析cookie未启用httponly的问题

    序 今天我们利用codeql分析下“cookie未启用httponly“这类的安全问题,由此加深自己对codeql的使用。如果反应好的话,可以考虑把Vulnerability-goapp的其他漏洞也弄一弄。 分析go程序时必须额外下载codeql-go 说明 审计对象 Vulnerability-g…

    2022年9月15日
    46300
  • mysql索引的查询语句怎么写

    mysql索引的查询语句是“SHOW INDEX”,可以返回与当前数据库或指定数据库中的表关联的索引信息,完整语法“SHOW INDEX FROM 表名 [FROM 数据库名];”;其中,“FROM 数据库名”选项是可选的,省略则返回当前数据库中表关联的索引信息,若不省略则返回指定数据库中表的索引信…

    2022年9月26日
    83100
  • JavaScript变量or循环中的var和let怎么使用

    在for循环中使用var声明初始化带来的问题 // 一道经典面试题:var funcs = [];for (var i = 0; i < 3; i++) { funcs[i] = function() { console.log(“My value: ” + i) };}for (var j …

    2022年9月15日
    34300
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部