暂无图片
mysql有没有类似oracle中undo retention的东西,来控制update undo log什么时候purge?
我来答
分享
小北
2024-09-28
mysql有没有类似oracle中undo retention的东西,来控制update undo log什么时候purge?

mysql有没有类似oracle中undo retention的东西,来控制update undo log什么时候purge?

因为update undo log一致性的时候还是需要的。有没有类似ora-01555的快照过旧报错。

谢谢!

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
吾亦可往
  1. MySQL 中的 undo 日志管理与 purge 机制
    • 在 MySQL 中,没有和 Oracle 的 undo retention 完全一样的概念。MySQL 使用回滚段(Rollback Segments)来存储 undo 日志,这些 undo 日志用于事务回滚和 MVCC(多版本并发控制)。
    • MySQL 的 InnoDB 存储引擎有自己的 purge 机制。它会自动清理不再需要的 undo 日志。这个清理过程是由后台线程(purge 线程)来完成的。purge 线程会周期性地检查和删除那些已经提交事务对应的 undo 日志,这些事务对应的更新操作所产生的旧版本数据已经不再被其他事务需要(例如,所有基于 MVCC 机制读取这些旧版本数据的事务都已经结束)。
  2. 与快照过旧相关的情况(类似 ORA - 01555)
    • MySQL 也会出现类似 “快照过旧” 的情况。在 InnoDB 存储引擎中,当长事务长时间运行并且不断产生新的 undo 日志,同时系统又因为内存等资源限制或者大量事务并发导致 undo 日志不能及时 purge 时,可能会出现这种情况。
    • 例如,在一个 RR(Repeatable Read)隔离级别下的事务,如果它读取了某个数据版本,而由于大量事务并发导致系统无法及时 purge 旧的 undo 日志来释放空间,并且其他事务不断更新数据使得 undo 日志链过长,当这个事务后续需要再次读取之前的数据版本(基于 RR 隔离级别的一致性读要求)时,可能会发现需要的旧版本数据已经被 purge 掉了。这种情况在 MySQL 中虽然和 Oracle 的 ORA - 01555 报错不完全相同,但原理上是类似的,都是由于无法获取到合适的旧数据版本而导致的问题。


为了避免这种情况,可以采取以下措施:


  • 尽量减少长事务的运行时间,因为长事务会占用 undo 日志资源并且增加出现这种问题的风险。
  • 合理配置 InnoDB 存储引擎的相关参数,如innodb_purge_batch_size(控制每次 purge 操作处理的 undo 日志数量)和innodb_max_purge_lag(用于限制 purge 操作滞后的程度)等参数,来优化 undo 日志的 purge 过程。
暂无图片 评论
暂无图片 有用 0
若城

MySQL中的更新操作会生成撤销日志(undo log),用于事务回滚和MVCC。与Oracle的UNDO RETENTION不同,MySQL没有直接设置来控制undo log保留时间。InnoDB存储引擎有一个后台线程(_PURGE_线程)自动清理不再需要的undo log。
MySQL没有与Oracle ORA-01555完全对应的错误,但如果事务需要的undo log被清理,可能会遇到查询不到数据的错误

暂无图片 评论
暂无图片 有用 1
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏