专栏首页二狗的DBA之路MySQL innodb_undo_tablespaces相关参数

MySQL innodb_undo_tablespaces相关参数

摘录自:http://gfsunny.blog.51cto.com/990565/1566683

undo log(回滚): 服务器异常关机或断电重启后,MySQL会对修改过,但尚未提交的事务进行回滚。

在MySQL5.6中开始支持把undo log分离到独立的表空间,并放到单独的文件目录下。这给部署不同IO类型的文件位置带来便利,对于并发写入型负载,可以把undo文件部署到单独的高速SSD存储设备上。

undo tablespaces相关参数

参数

含义

innodb_undo_directory[=/opt/mysql/undo]

Innodb为还原日志创建的独立表空间的相对或绝对路径。通常用于日志被放置在哪些不同的存储设备上。配合参数innodb_undo_logs和innodb_undo_tablespaces,这决定了系统表空间外还原日志的磁盘分布。默认目录为innodb默认创建它的其他日志文件的目录。如果想转移undo文件的位置,只需要修改下该配置,并将undo文件拷贝过去就可以了。【支持后期修改】

innodb_undo_logs[=128]

定义在一个事务中innodb使用的系统表空间中回滚段的个数。如果观察到同回滚日志有关的互斥争用,可以调整这个参数以优化性能。早期版本的命名为innodb_rollback_segments,该变量可以动态调整,但是物理上的回滚段不会减少,只是会控制用到的回滚段的个数;默认为128个回滚段【手册上最大就是128】【支持后期修改】

innodb_undo_tablespaces[=4]

用于设定创建的undo表空间的个数,在mysql_install_db时初始化后,就再也不能被改动了,修改该值会导致MySQL无法启动。默认值为0,表示不独立设置undo的tablespace,默认记录到ibdata中;否则,则在undo目录下创建这么多个undo文件(每个文件的默认大小为10M)。最多可以设置到126。例如假定设置该值为4,那么就会在mysql的data目录下创建命名为undo001~undo004的undo tablespace文件。【不支持后期修改】

undo 回滚段初始化

如果是正常shutdown重启,并且设置的回滚段个数大于目前已经使用的回滚段个数(trx_sysf_rseg_find_free),就会去新建回滚段(trx_rseg_create)

这里总是从第一个undologtablespace开始初始化回滚段,看起来似乎有些问题,极端情况下,如果我每次重启递增innodb_undo_logs,是不是意味着所有的undo回滚段都会写入到第一个undo tablespace中?

完成初始化后,将当前可用的undo回滚段的个数复制给srv_available_undo_logs,可以通过show status查看:

mysql> show status like'innodb_available_undo_logs';

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| Innodb_available_undo_logs | 128   |

+----------------------------+-------+

1 row in set (0.02 sec)

启动后,innodb_undo_logs是可以动态调整的,但最大不可以超过Innodb_available_undo_logs

在一个非只读的事务开启时,会为其分配回滚段(trx_assign_rseg_low),动态的调整innodb_undo_logs可以限定分配的回滚段范围;

当有长时间运行的事务时,可能导致purge操作来不及回收undo空间,进而导致undo空间急剧膨胀;理论上讲,如果做一次干净的shutdown,应该可以安全的将将这些undo文件删除并重新做一次初始化;也许未来的某个MySQL版本可能实现这个功能,这对于某些服务(比如按磁盘空间收费的云计算提供商)是非常有必要的功能。

参数设置演示:

# rm -rf /data/3306/data/*

# cd /usr/local/mysql/scripts/

# ./mysql_install_db--basedir=/usr/local/mysql --datadir=/data/3306/data --user=mysql --innodb_undo_tablespaces=4

# /etc/init.d/mysqld_3306start

注意:加了--innodb_undo_tablespaces=4参数初始化后,修改my.cnf,加入innodb_undo的参数,如下3行:

innodb_undo_logs=100

innodb_undo_tablespaces = 4

innodb_undo_directory = /tmp/  # 这里我是演示起见,随便设置的一个目录

启动mysql,在/tmp/目录下会生成独立的undo表空间文件,如下图:

> show variables like 'innodb_undo%'; 也可以看到修改生效了

MySQL5.6手册上的截图如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【转】MySQL8.0 · 引擎分析 · InnoDB history list 无法降到0的原因

    摘自阿里云博客,原文地址:https://yq.aliyun.com/articles/400891?spm=a2c4e.11153959.blogcont34...

    二狗不要跑
  • linux 删除特殊文件名的文件

    最近不小心touch文件时候,在文件名前面加了个短杠-,导致文件名类似于 -test.log 。 这样的话,按照常规的执行 rm -f '-test.log'...

    二狗不要跑
  • vim方向键乱码

    在使用Ubuntu的时候,vi编辑文件会出现按上下左右键,出现ABCD这种乱码,Backspace键也会出现乱动的情况。

    二狗不要跑
  • MySQL · 特性分析 ·MySQL 5.7新特性系列三无标题文章

    挑战者
  • 相克军_Oracle体系_随堂笔记012-undo

    undo表空间中undo段是自动生成的,oracle自动使用undo表空间的undo段。

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

    资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构...

    爱可生开源社区
  • New in 12.2- 让每个PDB都拥有自己的 local undo表空间

    12.1引入temp undo概念 ,12.2引入local undo,也就是每个pdb拥有自己的undo表空间(以前版本共用一个undo表空间),rac中每个...

    数据和云
  • 使用 Python 分析 14 亿条数据

    你用 Python 处理过的最大数据集有多大?我想大概不会超过上亿条吧,今天分享一个用 Python 处理分析 14 亿条数据的案例。

    崔庆才
  • 如何在Etherscan中支持合约接口调用

    默认情况下,etherscan只能查看合约上发生的tx,无法调用合约方法。不过,etherscan提供verify contract功能,完成验证之后,可以读取...

    lambeta
  • 配置Tomcat支持远程调试的方法

    飞奔去旅行

扫码关注云+社区

领取腾讯云代金券