MYSQL的大事务影响和限制手段

2023年 12月 9日 71.0k 0

数据库大事务操作影响很严重, ORACLE 这里好像也不挺严重的,因为它是物理备库, 物理就是 数据文件某个区被修改了,直接传输给备库,这个区域一般就是8K大小.

而MYSQL 是逻辑备库, 传递的是 SQL语句, 虽然BINLOG改成了ROW模式,其实也是SQL语句,不过原本一条 比如说DELETE FROM ORDER表 ;只传一条SQL语句到从库执行, ROW模式 是ORDER 表有多少行记录,就传多少条SQL过去, 大概像这样 DELETE FROM ORDER WHERE ID=???;
并且那么多条语句打包成一个事务发到从库去执行!

其实也没有什么,顶多是慢了而已,只要系统稳定,最终都要执行完的.不过很多从库都要执行读写分离,需要承担业务读的功能,必然一定程度影响了业务.

大事务在MYSQL上最可怕的是 膨胀和回滚操作!

从本图可知,它会导致UNDO LOG的膨胀,ORACLE它也无法避免,UNDO LOG 也会膨胀 达到32GB; 不过如果你限制了UNDO 表空间大小,大事务可能没有UNDO可用空间分配而报错, 一报错就跳到回滚操作,又是个超长时间的回滚! 我想MYSQL 的UNDO LOG 膨胀到最大值 也会阻塞其它事务的进行,因为无法获得UNDOLOG空间.

ORACLE 的REDO LOG文件 可以进行归档, MYSQL的REDO LOG 会循环被覆盖,其实这点也没啥,就是恢复,回滚的时候 MYSQL需要BINLOG的参与,BINLOG记录的才是完整的事务.且是提交的事务!

说到BINLOG MYSQL的每个线程有个BINLOG CACHE 缓存 你可以把它看成LOG BUF. 如果写满了BINLOG CAHCE ,那么CACHE会写进磁盘, 隐藏的临时文件.

所以大事务会膨胀UNDO LOG和 BINLOG ;膨胀最大值就涉及LINUX系统文件大小限制,磁盘空间限制!

如果失败需要恢复和回滚操作

从本图可知,它会导致UNDO LOG的膨胀,ORACLE它也无法避免,UNDO LOG 也会膨胀 达到32GB; 不过如果你限制了UNDO 表空间大小,大事务可能没有UNDO可用空间分配而报错, 一报错就跳到回滚操作,又是个超长时间的回滚! 我想MYSQL 的UNDO LOG 膨胀到最大值 也会阻塞其它事务的进行,因为无法获得UNDOLOG空间.

ORACLE 的REDO LOG文件 可以进行归档, MYSQL的REDO LOG 会循环被覆盖,其实这点也没啥,就是恢复,回滚的时候 MYSQL需要BINLOG的参与,BINLOG记录的才是完整的事务.且是提交的事务!

说到BINLOG MYSQL的每个线程有个BINLOG CACHE 缓存 你可以把它看成LOG BUF. 如果写满了BINLOG CAHCE ,那么CACHE会写进磁盘, 隐藏的临时文件.

所以大事务会膨胀UNDO LOG和 BINLOG ;膨胀最大值就涉及LINUX系统文件大小限制,磁盘空间限制!

如果失败需要恢复和回滚操作

大事务问题多多,最终如何防止大事务呢? 很遗憾是没有什么办法的

OB 数据库设计的是 REDO LOG 只保存已提交的事务日志,这样就可以减少REDO LOG写.恢复的时候也不需要做回滚操作,只要重新做一边事务!

那么只是在恢复的情况下,大事务就影响不到了! 因为不需要回滚大事务的脏数据,实例恢复速度就快!

必然就要学BINLOG CACHE BINLOG TMP方式 搞个REDO CACHE REDO TMP 每个事务!

这样也好 如果系统不崩溃,磁盘空间足够,不过整体来说解决50%问题.

其实本来MYSQL应该提供一个参数 限制每个事务的修改行数

TRX_ROWS_LIMIT=10000;

现实MYSQL是没有这个参数的,那么我们只能开启安全更新参数,

安全更新参数部分解决问题, 安全更新参数要求 要么有索引,要么有ID,要么有LIMIT.

另外 我们可以在SQL审核的时候设置这个规范,且可以借助审核工具实现,

SQLE 可以审核MAP文件.

如果是JAVA开发的,那么我们可以进行改写,最后在DML语句 添加LIMIT

自然 ORACLE 也有ROWNUM

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论