当前位置:首页 > 文章列表 > 数据库 > MySQL > 新特性解读 | 趋近完美的 Undo 空间

新特性解读 | 趋近完美的 Undo 空间

来源:SegmentFault 2023-01-17 21:42:25 0浏览 收藏

小伙伴们对数据库编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《新特性解读 | 趋近完美的 Undo 空间》,就很适合你,本篇文章讲解的知识点主要包括MySQL、日志。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

在说 Undo 表空间前,先来简单说下 Undo Log 的概念。直白来讲,Undo Log 是 MySQL 用来记录事务操作的反方向逻辑日志。当确保事务提交成功后,MySQL 后台有专门的清理线程来清理掉这部分内容,确保 Undo Log 能循环使用。

Undo 的相关概念

  • undo log segment(undo segment)

    Undo Logs 合集。undo segment 可以被重复使用,但是一次只能由一个事务占用。

  • rollback segment

    也就是 Undo Logs 的物理存储区域。

  • undo tablespace

    rollback segment 被从系统表空间里分离出来后的实际磁盘文件表现形式。

所以基本关系如下:

undo log -> undo log segment-> rollback segment->undo tablespace

Undo Log 发展史

MySQL 5.5 和之前的版本

Undo Log 一直存在共享的系统表空间里(ibdata1...),但有两个问题:

  1. Undo 这块 IO 处理太集中,无法很好的监测单个瓶颈点
  2. 持续并发运行稍微大点的事务,会造成系统表空间持续增大,造成定期的重建系统表空间

MySQL 5.6

Undo Log 被分离出来,由单独的 Undo 表空间管理。

可以避免 Undo 这块 IO 消耗过于集中,有助于分散 IO 的负载。

MySQL 5.7

解决了 Undo Log 一直以来物理空间膨胀,无法自动收缩的问题

MySQL 8.0

开始从 SQL 层面非常方便的管理 Undo 表空间

MySQL 8.0 对 Undo Log 的改进说明

1、默认的表空间

MySQL 服务启动后,默认有两个 Undo 表空间:undo_01,undo_02

root@ytt-pc:/var/lib/mysql/3304# ls -sihl undo*
919027 14M -rw-r----- 1 mysql mysql 14M 3月  20 11:00 undo_001
918943 12M -rw-r----- 1 mysql mysql 12M 3月  20 11:00 undo_002

这两个默认产生的 Undo 表空间文件,不能在 SQL 层面来管理。直接删除会被 MySQL 阻止。

mysql> drop undo tablespace innodb_undo_001;
ERROR 3119 (42000): InnoDB: Tablespace names starting with `innodb_` are reserved.

mysql> show errors;
+-------+------+----------------------------------------------------------------+
| Level | Code | Message                                                        |
+-------+------+----------------------------------------------------------------+
| Error | 3119 | InnoDB: Tablespace names starting with `innodb_` are reserved. |
| Error | 3119 | Incorrect tablespace name `innodb_undo_001`                    |
+-------+------+----------------------------------------------------------------+
2 rows in set (0.00 sec)

2、可设置回滚段数量的参数

参数 innodb_rollback_segments 设置每个 undo 表空间的回滚段的数量。

在 MySQL 5.7 这个参数被用来设置所有 Undo 表空间的回滚段数量。最大 128,就是说 一个 MySQL 实例最多 128 个回滚段

注意高能时刻!

MySQL 8.0 放开了这个限制,使得这个参数设置限制在每个表空间。也就是说 每个表空间 最多 128 个回滚段,可以设置多个表空间!也就解决了 MySQL 5.7 在持续高并发时,事务争抢回滚段不足造成的资源抢占,减少了相关的锁开销。

3、自动收缩参数

参数 innodb_undo_log_truncate 默认开启。开启这个参数的目的是让 MySQL 自动收缩 Undo 表空间,防止磁盘占用过大。

4、废弃的参数

额外的 Undo 表空间 SQL 层面动态管理参数 innodb_undo_tablespaces 被废弃。

示例:Undo 表空间管理(不包括临时表空间)

具体语法:

CREATE [UNDO] TABLESPACE tablespace_name
InnoDB and NDB:
[ADD DATAFILE 'file_name']
InnoDB only:
[FILE_BLOCK_SIZE = value]
[ENCRYPTION [=] {'Y' | 'N'}]
NDB only:
USE LOGFILE GROUP logfile_group
[EXTENT_SIZE [=] extent_size]
[INITIAL_SIZE [=] initial_size]
[AUTOEXTEND_SIZE [=] autoextend_size]
[MAX_SIZE [=] max_size]
[NODEGROUP [=] nodegroup_id]
[WAIT]
[COMMENT [=] 'string']
InnoDB and NDB:
[ENGINE [=] engine_name]

1、创建表空间

语法方面和 MySQL 5.7 创建通用表空间类似,并且是从 MySQL NDB 引擎上借鉴过来的。

创建 Undo 表空间 undo_ts1.ibu

mysql> create undo tablespace undo_ts1 add datafile 'undo_ts1.ibu';
Query OK, 0 rows affected (0.47 sec)

2、查看表空间

查看 Undo 表空间的元数据信息

information_schema.innodb_tablesapces 表

mysql> select * from information_schema.innodb_tablespaces where SPACE_TYPE='undo'\G
*************************** 1. row ***************************
        SPACE: 4294967279
         NAME: innodb_undo_001
         FLAG: 0
   ROW_FORMAT: Undo
    PAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Undo
FS_BLOCK_SIZE: 0
    FILE_SIZE: 0
ALLOCATED_SIZE: 0
SERVER_VERSION: 8.0.18
SPACE_VERSION: 1
   ENCRYPTION: N
        STATE: active
*************************** 2. row ***************************
        SPACE: 4294967278
         NAME: innodb_undo_002
         FLAG: 0
   ROW_FORMAT: Undo
    PAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Undo
FS_BLOCK_SIZE: 0
    FILE_SIZE: 0
ALLOCATED_SIZE: 0
SERVER_VERSION: 8.0.18
SPACE_VERSION: 1
   ENCRYPTION: N
        STATE: active
*************************** 3. row ***************************
        SPACE: 4294967277
         NAME: undo_ts1
         FLAG: 0
   ROW_FORMAT: Undo
    PAGE_SIZE: 16384
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Undo
FS_BLOCK_SIZE: 0
    FILE_SIZE: 0
ALLOCATED_SIZE: 0
SERVER_VERSION: 8.0.19
SPACE_VERSION: 1
   ENCRYPTION: N
        STATE: active
3 rows in set (0.00 sec)

3、修改存放目录

Undo 表空间,默认是保存在变量 innodb_undo_directory 指定的目录,如果这个目录没有指定,就放在数据目录下。

# 默认在当前数据目录
mysql> select @@innodb_undo_directory;
+-------------------------+
| @@innodb_undo_directory |
+-------------------------+
| ./                      |
+-------------------------+
1 row in set (0.00 sec)

# 刚建立的 undo_ts1.ibu.
root@ytt-pc:/var/lib/mysql/3304# ls -sihl undo_ts1.ibu
918978 10M -rw-r----- 1 mysql mysql 10M 3月  20 11:33 undo_ts1.ibu

也可以把 Undo 表空间建立在非 innodb_undo_directory 指定的目录。

# 指定undo 表空间目录/var/lib/mysql-files/,新建立一个undo_ts2.ibu.

mysql> create undo tablespace undo_ts2 add datafile '/var/lib/mysql-files/undo_ts2.ibu';
Query OK, 0 rows affected (0.30 sec)

Undo 表空间的名字必须以 .ibu 为后缀

# 创建一个 undo 表空间 undo_ts3,没有带后缀,MySQL 拒绝创建。
   mysql> create undo tablespace undo_ts3 add datafile 'undo_ts3';
   ERROR 3121 (HY000): The ADD DATAFILE filepath must end with '.ibu'.
   mysql> show errors;
   +-------+------+-------------------------------------------------+
   | Level | Code | Message                                         |
   +-------+------+-------------------------------------------------+
   | Error | 3121 | The ADD DATAFILE filepath must end with '.ibu'. |
   | Error | 1528 | Failed to create UNDO TABLESPACE undo_ts3       |
   | Error | 3121 | Incorrect File Name 'undo_ts3'.                 |
   +-------+------+-------------------------------------------------+
   3 rows in set (0.00 sec)

4、删除表空间

删除表空间必须确保这个表空间没有被任何事务用到,也就是把这个表空间变为非激活状态,这样就能阻止任何事务进入这个表空间。

mysql> alter undo tablespace undo_ts2 set inactive;
Query OK, 0 rows affected (0.01 sec)

mysql> drop undo tablespace undo_ts2;
Query OK, 0 rows affected (0.01 sec)

5、移动表空间

移动 Undo 表空间到其他位置,需要按照这样的步骤:

  1. 停掉 mysqld 服务;
  2. 设置参数 innodb_undo_directory 到新的目录;
  3. 移动 Undo 日志到上一步设置好的目录;
  4. 启动 mysqld 服务;

步骤 2&3 具体如下:

设置变量 innodb_undo_directory,并且移动 Undo 表空间到这个目录

mysql> select @@innodb_undo_directory;
+-------------------------+
| @@innodb_undo_directory |
+-------------------------+
| /var/lib/mysql-files    |
+-------------------------+
1 row in set (0.00 sec)

一切完了后,检查移动后的 Undo 文件是否正常。

通过检索文件元数据表 information_schema.files 查看文件类型为 Undo Log 的记录。系统预留的两个表空间已经正确的在新目录下被识别了。

mysql> select file_name,file_type,tablespace_name,status from files where file_type = 'undo log';
+-------------------------------+-----------+-----------------+--------+
| FILE_NAME                     | FILE_TYPE | TABLESPACE_NAME | STATUS |
+-------------------------------+-----------+-----------------+--------+
| /var/lib/mysql-files/undo_001 | UNDO LOG  | innodb_undo_001 | NORMAL |
| /var/lib/mysql-files/undo_002 | UNDO LOG  | innodb_undo_002 | NORMAL |
+-------------------------------+-----------+-----------------+--------+
2 rows in set (0.00 sec)

再创建一个新的 Undo 表空间。默认的位置已经变道新的目录下。

mysql> create undo tablespace undo_ts_new add datafile 'undo_ts_new.ibu';
Query OK, 0 rows affected (0.51 sec)

root@ytt-pc:/var/lib/mysql-files# ls -l undo*
-rw-r----- 1 mysql mysql 10485760 3月  20 12:00 undo_001
-rw-r----- 1 mysql mysql 10485760 3月  20 12:00 undo_002
-rw-r----- 1 mysql mysql 10485760 3月  20 12:00 undo_ts_new.ibu

总结

这里我对 MySQL 8.0 的 Undo 表空间在使用上的改进简要做了一个说明,可以看出来,MySQL 8.0 对 Undo 的改进已经非常成熟。

本篇关于《新特性解读 | 趋近完美的 Undo 空间》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于数据库的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
UTF-8:一些好像没什么用的冷知识UTF-8:一些好像没什么用的冷知识
上一篇
UTF-8:一些好像没什么用的冷知识
【赵渝强老师】利用数据库触发实现复杂的安全性检查
下一篇
【赵渝强老师】利用数据库触发实现复杂的安全性检查
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO标题魔匠AI:高质量学术写作平台,毕业论文生成与优化专家
    魔匠AI
    SEO摘要魔匠AI专注于高质量AI学术写作,已稳定运行6年。提供无限改稿、选题优化、大纲生成、多语言支持、真实参考文献、数据图表生成、查重降重等全流程服务,确保论文质量与隐私安全。适用于专科、本科、硕士学生及研究者,满足多语言学术需求。
    24次使用
  • PPTFake答辩PPT生成器:一键生成高效专业的答辩PPT
    PPTFake答辩PPT生成器
    PPTFake答辩PPT生成器,专为答辩准备设计,极致高效生成PPT与自述稿。智能解析内容,提供多样模板,数据可视化,贴心配套服务,灵活自主编辑,降低制作门槛,适用于各类答辩场景。
    38次使用
  • SEO标题Lovart AI:全球首个设计领域AI智能体,实现全链路设计自动化
    Lovart
    SEO摘要探索Lovart AI,这款专注于设计领域的AI智能体,通过多模态模型集成和智能任务拆解,实现全链路设计自动化。无论是品牌全案设计、广告与视频制作,还是文创内容创作,Lovart AI都能满足您的需求,提升设计效率,降低成本。
    53次使用
  • 美图AI抠图:行业领先的智能图像处理技术,3秒出图,精准无误
    美图AI抠图
    美图AI抠图,依托CVPR 2024竞赛亚军技术,提供顶尖的图像处理解决方案。适用于证件照、商品、毛发等多场景,支持批量处理,3秒出图,零PS基础也能轻松操作,满足个人与商业需求。
    49次使用
  • SEO标题PetGPT:智能桌面宠物程序,结合AI对话的个性化陪伴工具
    PetGPT
    SEO摘要PetGPT 是一款基于 Python 和 PyQt 开发的智能桌面宠物程序,集成了 OpenAI 的 GPT 模型,提供上下文感知对话和主动聊天功能。用户可高度自定义宠物的外观和行为,支持插件热更新和二次开发。适用于需要陪伴和效率辅助的办公族、学生及 AI 技术爱好者。
    48次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码