iis服务器助手广告
返回顶部
首页 > 资讯 > 数据库 >Mysql中怎么实现在线回收undo表空间
  • 436
分享到

Mysql中怎么实现在线回收undo表空间

2024-04-02 19:04:59 436人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关Mysql中怎么实现在线回收undo表空间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 Mysql5.61.1 相关参数mysql

这期内容当中小编将会给大家带来有关Mysql中怎么实现在线回收undo表空间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1 Mysql5.6

1.1 相关参数

mysql 5.6增加了参数innodb_undo_directory、innodb_undo_logs和innodb_undo_tablespaces这3个参数,可以把undo log从ibdata1移出来单独存放。

  • innodb_undo_directory:指定单独存放undo表空间的目录,默认为.(即datadir),可以设置相对路径或者绝对路径。该参数实例初始化之后虽然不可直接改动,但是可以通过先停库,修改配置文件,然后移动undo表空间文件的方式去修改该参数。

默认参数:

mysql> show variables like '%undo%';
+-------------------------+-------+
| Variable_name      | Value |
+-------------------------+-------+
| innodb_undo_directory  | .   |
| innodb_undo_logs    | 128  |
| innodb_undo_tablespaces | 0   |
+-------------------------+-------+
  • innodb_undo_tablespaces:指定单独存放的undo表空间个数,例如如果设置为3,则undo表空间为undo001、undo002、undo003,每个文件初始大小默认为10M。该参数我们推荐设置为大于等于3,原因下文将解释。该参数实例初始化之后不可改动

实例初始化是修改innodb_undo_tablespaces:

mysql_install_db ...... --innodb_undo_tablespaces

$ ls
...
undo001 undo002 undo003
  • innodb_rollback_segments:默认128个。每个回滚段可同时支持1024个在线事务。这些回滚段会平均分布到各个undo表空间中。该变量可以动态调整,但是物理上的回滚段不会减少,只是会控制用到的回滚段的个数。

1.2 使用

初始化实例之前,我们只需要设置innodb_undo_tablespaces参数(建议大于等于3)即可将undo log设置到单独的undo表空间中。如果需要将undo log放到更快的设备上时,可以设置innodb_undo_directory参数,但是一般我们不这么做,因为现在SSD非常普及。innodb_undo_logs可以默认为128不变。

undo log可以存储于ibdata之外。但这个特性依然鸡肋:

  • 首先你必须在install实例的时候就指定好独立Undo tablespace, 在install完成后不可更改。

  • Undo tablepsace的space id必须从1开始,无法增加或者删除undo tablespace。

1.3 大事务测试

mysql> create table test.tbl( id int primary key auto_increment, name varchar(200));
Query OK, 0 rows affected (0.03 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test.tbl(name) values(repeat('1',00));
Query OK, 1 row affected (0.00 sec)

mysql> insert into test.tbl(name) select name from test.tbl;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

...

mysql> insert into test.tbl(name) select name from test.tbl;
Query OK, 2097152 rows affected (24.84 sec)
Records: 2097152 Duplicates: 0 Warnings: 0

mysql> commit;
Query OK, 0 rows affected (7.90 sec)

观察undolog已经开始膨胀了!事务commit后空间也没有回收。

$ du -sh undo*
10M  undo001
69M  undo002
10M  undo003

2 Mysql5.7

5.7引入了在线truncate undo tablespace

2.1 相关参数

必要条件:

  • innodb_undo_tablespaces:最少有两个,这样一个在清理的时候可以使用另一个,该参数实例初始化之后不可改动

  • innodb_rollback_segments:回滚段的个数,总会有一个回滚段分配给系统表空间,32个保留给临时表空间。所以如果想使用undo表空间的话,这个值要至少为33。例如使用两个undo表空间,这个值就配35。如果设置多个undo表空间,系统表空间中的回滚段会变成非活跃状态。

启动参数:

  • innodb_undo_log_truncate=on

  • innodb_max_undo_log_size:超过这个值的表空间会标记为truncate,动态参数默认是1G

  • innodb_purge_rseg_truncate_frequency:指定purge操作被唤起多少次之后才释放rollback segments。当undo表空间里面的rollback segments被释放时,undo表空间才会被truncate。由此可见,该参数越小,undo表空间被尝试truncate的频率越高。

2.2 清理过程

  1. undo表空间大小超过innodb_max_undo_log_size后,标记该表空间需要清理。标记会循环进行,避免一个表空间被反复清理。

  2. 标记表空间内的回滚段变为非活跃状态,正在运行的事务等待执行完。

  3. 开始purge

  4. 释放undo表空间中的所有回滚段后,运行truncate并将undo表空间截断为其初始大小,初始大小由innodb_page_size决定,默认16KB的大小对应表空间为10MB

  5. 重新激活回滚段,以便将它们分配给新事务

2.3 性能建议

truncate表空间时避免影响性能的最简单方法是增加撤消表空间的数量

2.4 大事务测试

配置8个undo表空间,innodb_purge_rseg_truncate_frequency=10

mysqld --initialize ... --innodb_undo_tablespaces=8

开始测试

mysql> show global variables like '%undo%';
+--------------------------+------------+
| Variable_name      | Value   |
+--------------------------+------------+
| innodb_max_undo_log_size | 1073741824 |
| innodb_undo_directory  | ./     |
| innodb_undo_log_truncate | ON     |
| innodb_undo_logs     | 128    |
| innodb_undo_tablespaces | 8     |
+--------------------------+------------+

mysql> select @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
|                   10 |
+----------------------------------------+

select @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
|          10485760 |
+----------------------------+

mysql> create table test.tbl( id int primary key auto_increment, name varchar(200));
Query OK, 0 rows affected (0.03 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test.tbl(name) values(repeat('1',00));
Query OK, 1 row affected (0.00 sec)

mysql> insert into test.tbl(name) select name from test.tbl;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

...

mysql> insert into test.tbl(name) select name from test.tbl;
Query OK, 2097152 rows affected (24.84 sec)
Records: 2097152 Duplicates: 0 Warnings: 0

mysql> commit;
Query OK, 0 rows affected (7.90 sec)

undo表空间情况,膨胀到100MB+后成功回收

$ du -sh undo*
10M    undo001
10M    undo002
10M    undo003
10M    undo004
10M    undo005
10M    undo006
125M   undo007
10M    undo008

$ du -sh undo*
10M    undo001
10M    undo002
10M    undo003
10M    undo004
10M    undo005
10M    undo006
10M    undo007
10M    undo008

上述就是小编为大家分享的Mysql中怎么实现在线回收undo表空间了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: Mysql中怎么实现在线回收undo表空间

本文链接: https://www.lsjlt.com/news/56048.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql中怎么实现在线回收undo表空间
    这期内容当中小编将会给大家带来有关Mysql中怎么实现在线回收undo表空间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 Mysql5.61.1 相关参数MySQL ...
    99+
    2024-04-02
  • MySQL5.7怎么在线收缩undo表空间
    这篇文章主要讲解了“MySQL5.7怎么在线收缩undo表空间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL5.7怎么在线收缩undo表空间”吧!1. MySQL 5.5时代的un...
    99+
    2023-06-06
  • MySQL中怎么回收表空间
    今天就跟大家聊聊有关MySQL中怎么回收表空间,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前置说明目前大部分MySQL数据库都是用的 InnoDB...
    99+
    2024-04-02
  • SQL Server表空间碎片化回收怎么实现
    这篇文章主要介绍了SQL Server表空间碎片化回收怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL Server表空间碎片化回收怎么实现文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-29
  • SQL Server表空间碎片化回收的实现
    目录1 锁片化的产生1.1 产生碎片化的原因1.2 碎片化的影响1.3 定位碎片化2 碎片化处理2.1 删除并重建聚集索引2.2 DROP_EXISTING2.3 DBCC ...
    99+
    2024-04-02
  • MySQL中怎么判断InnoDB表是独立表空间还是共享表空间
    MySQL中怎么判断InnoDB表是独立表空间还是共享表空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、独立表空间优缺点1. 优点:(1...
    99+
    2024-04-02
  • 怎么在java中实现线程间通信
    这篇文章将为大家详细讲解有关怎么在java中实现线程间通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以...
    99+
    2023-05-30
    java
  • Object表的删除和回收站怎么实现
    本篇内容主要讲解“Object表的删除和回收站怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Object表的删除和回收站怎么实现”吧! 一、同义词 ...
    99+
    2024-04-02
  • 怎么在R语言中实现线性回归
    本篇文章为大家展示了怎么在R语言中实现线性回归,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个...
    99+
    2023-06-15
  • 怎么在PHP中实现一个垃圾回收机制
    这篇文章给大家介绍怎么在PHP中实现一个垃圾回收机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。顽固垃圾的产生过程<php  $a = "new st...
    99+
    2023-06-06
  • oracle表空间自动扩容怎么实现
    Oracle数据库中的表空间可以通过以下几种方法实现自动扩容: 使用自动扩展数据文件:在创建表空间时,可以指定数据文件的最大大小...
    99+
    2024-04-09
    oracle
  • MySQL中怎么查看表占用空间大小
    今天就跟大家聊聊有关MySQL中怎么查看表占用空间大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码1,切换数据库use inform...
    99+
    2024-04-02
  • C++中怎么实现命名空间
    C++中怎么实现命名空间 ,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言命名空间可作为附加信息来区分不同库中相同名称的函数、类、变量等。命名空间即定义了上下...
    99+
    2023-06-20
  • MySQL中怎么实现实时在线备份恢复
    今天就跟大家聊聊有关MySQL中怎么实现实时在线备份恢复,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.主库准备测试数据mysql>&nbs...
    99+
    2024-04-02
  • 怎么在MySQL中实现分表与分区
    这篇文章将为大家详细讲解有关怎么在MySQL中实现分表与分区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。分表单表数据量太大时,会严重影响sql执行的性能。一般单表到达几百万的时候,性能就会...
    99+
    2023-06-14
  • 怎么在ccs3中使用timeline实现一个时间线
    本篇文章为大家展示了怎么在ccs3中使用timeline实现一个时间线,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。test.html文件<!DOCTYPE html><...
    99+
    2023-06-08
  • CSS怎么实现控制文字在一条线中间
    这篇文章主要讲解了“CSS怎么实现控制文字在一条线中间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS怎么实现控制文字在一条线中间”吧!这里用CSS控制...
    99+
    2024-04-02
  • MySQL中怎么利用空间函数实现位置打卡
    这篇文章将为大家详细讲解有关MySQL中怎么利用空间函数实现位置打卡,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。图形获取区域坐标因为项目前端使用微信小程序...
    99+
    2024-04-02
  • oracle创建表空间自动扩展怎么实现
    要实现Oracle数据库表空间的自动扩展,可以通过以下步骤来实现: 创建一个包含自动扩展属性的表空间:在创建表空间时,使用关键字“...
    99+
    2024-04-09
    oracle
  • python中的垃圾回收机制怎么实现
    这篇文章主要讲解了“python中的垃圾回收机制怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的垃圾回收机制怎么实现”吧!python采用的是引用计数机制为主,标记-清...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作