如果 MySQL 会话结束,MySQL 临时表会发生什么?

结论:MySQL 临时表会在会话结束时自动删除,并且不会写入永久数据文件。
元数据仅存在于会话内存中。
使用连接池时,必须小心上下文更改。
事务的回滚不影响删除。

MySQL日志专项整理之redo log和undo log

RedoLog和UndoLog是MySQL保证事务特性的主要机制,设计原理和协作流程都比较复杂。

RedoLog的主要作用是保证事务的持久性。
通过物理日志记录数据页的变化,防止系统崩溃时内存数据丢失。
实现原理是双层结构,由内存中的redologbuffer(默认1 6 MB)和磁盘上的redologfile(默认两个4 8 MB文件ib_logfile0/1 )组成。
写入过程是,当事务修改数据时,首先修改内存中的BufferPool,产生脏页,并生成redolog,记录“哪个页的哪个偏移量被修改为哪个值”。
日志首先写入redologbuffer,并在发送事务时通过刷新策略持久化到磁盘。
刷盘策略有3 种:0表示后台线程每秒刷一次盘,1 秒数据可能丢失; 1 (默认)表示发送交易时同步清空磁盘,保证持久性但性能较低; 2 )调度时写入操作系统内核缓冲区,由操作系统决定刷新的时机,这是性能和安全性之间的权衡。
好处是顺序 I/O 添加写入日志,减少通过随机 I/O 的频繁磁盘访问并提高吞吐量。

UndoLog的主要作用是保证事务的原子性,实现多版本并发控制。
存储结构是使用回滚段(RollbackSegment)来组织的。
每个回滚段包含 1 02 4 个 UndoLogSegment。
MySQL5 .5 以后,回滚段一共有1 2 8 个。
记录的内容是INSERT操作记录主键的值,回滚时直接删除对应行; UPDATE/DELETE操作记录更改前的旧值,回滚时恢复旧值或重新插入数据。
生命周期是InsertUndoLog事务在dispatch后直接清除,UpdateUndoLog事务在dispatch后插入版本链,由Purge线程决定是否清除。
MVCC支持期望每行数据包含隐藏字段DB_TRX_ID(事务ID)和DB_ROLL_PTR(回滚指针),它们指向UndoLog中的历史版本,以实现无锁读取。

协作过程发生在事务执行阶段修改数据时,同时生成redolog和UndoLog。
RedoLog进入redologbuffer,UndoLog写入回滚段。
在事务的提交阶段,RedoLog 通过磁盘刷新策略持久化到磁盘。
UndoLog根据其类型决定是否保留。
在崩溃恢复阶段,如果重做日志已持久化但数据未删除,则根据重做日志重复更改。
如果交易没有被确认,则根据UndoLog取消未完成的操作。

主要特点比较是RedoLog是物理日志,关注数据页的最终状态,用于系统崩溃时的恢复。
UndoLog是一种逻辑日志,专注于数据的历史版本,用于回滚和MVCC。
两者通过两阶段提交一起工作:首先编写重做日志准备阶段,然后编写binlog,最后发送redolog commit阶段,保证redolog和binlog逻辑一致,避免主从数据不一致。

后来我意识到这个机制的设计相当复杂。
也许我有偏见,认为这个设计有点罗嗦。
2 02 2 年,我在北京做一个项目,遇到了数据库恢复异常的情况。
我就是靠这个RedoLog来恢复数据的。
当时的数据量有几十GB。
如果没有这个机制,损失将是巨大的。

mysql最新版本是多少

MySQL 8 .0 是最新版本。
包含 SQL 窗口函数、公用表表达式、NOWAIT 和 SKIPLOCKED 等新功能。
还有 JSON 扩展语法、GIS 支持和可靠性 DDL。
8 .0 生命周期于 2 02 6 年 4 月结束。
建议尽快迁移。

mysql升级过程中如何处理临时表

哎呀,说到处理MySQL临时升级表,我在这件事上确实有一些经验。
应该说,这个临时工期就像临时工一样。
它来时起作用,离开时消失。
如果有更多的人使用它,就需要更有效地管理。

首先,您需要了解临时表的一些小知识。
它的生命周期很短,就像临时工一样。
一旦会话结束,它就会消失,不留下任何数据或结构。
它可以驻留在内存或磁盘上,具体取决于您的配置。
它不会写入数据字典,也不会复制到从库,除非启用binlog并设置log_bin_trust_function_creators。

升级之前,您应该检查是否有任何长时间运行的事务或使用临时表的活动会话。
如果有的话,你需要结束它们,不要让它们阻碍你。
您还应该通知应用程序端中止复杂的操作,例如多表连接、排序、分组和UNION。
这些操作可能会生成临时内表。

优化内存参数也很关键。
您应该看到 tmp_table_size 和 max_heap_table_size 是如何配置的。
不要让临时表频繁删除而影响性能。
例如,如果您发现临时表经常超过默认的1 6 MB,那么您应该适当增加参数,但不要太大,并平衡内存使用。

您还必须完成 DDL 任务,例如 ALTERTABLE 和 CREATEINDEX。
不要让升级过程因 DDL 冲突而失败。

升级过程中要注意停机升级和就地升级。
这些都会导致会话断开,临时表自然消失。
您不必担心手动清洁。
但应用程序重新连接后,必须确保业务逻辑可以重建临时表,以避免数据丢失。

您还应该注意工具限制。
mysql_upgrade和mysqldump不处理临时表,备份时不需要导出临时表。

在升级过程中,尽量避免运行可能生成内部临时表的 SQL,例如 ALTERTABLE...ALGORITHM=COPY、复杂查询、UNION、子查询和 GROUPBY。
如果必须执行这些操作,您应该估计主数据库负载以避免资源争用。

还必须解决特殊情况。
例如,旧版本的 MySQL 可能在磁盘上有临时文件。
您必须确认这一点,以防止残留文件占用空间。

应更加关注高可用性环境。
主从切换时,临时表不会复制到从库。
切换后,必须保证应用程序可以重新创建临时表。
如果使用GTID,还必须确认临时表操作不会影响事务一致性。

升级后,您应该验证临时表功能并检查性能指标,以查看临时表是否按预期使用内存或磁盘。

简而言之,处理表的关键MySQL升级期间的临时操作是为了在升级前清理长事务、优化参数并停止复杂操作。
升级过程中,接受会话断开导致的临时表丢失,重建依赖应用,并在升级后验证功能和监控性能。
只要业务逻辑不依赖于长期存在的临时表,这个过程就不会导致数据丢失或结构异常。
说实话,当时我没想到能了解这么多细节。
所有这些都是多年来通过问答论坛收集的。