Innodb独立的undo tablespace

[MySQL5.6] Innodb独立的undo tablespace

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

1.使用

有几个参数来控制该行为

#innodb_undo_tablespaces

用于设定创建的undo表空间的个数,在Install db时初始化后,就再也不能被改动了;

默认值为0,表示不独立设置undo的tablespace,默认记录到ibdata中;否则,则在undo目录下创建这么多个undo文件,例如假定设置该值为16,那么就会创建命名为undo001~undo016的undo tablespace文件,每个文件的默认大小为10M

修改该值可能会导致Innodb无法完成初始化;

#innodb_undo_logs

用于表示回滚段的个数(早期版本的命名为innodb_rollback_segments ),该变量可以动态调整,但是物理上的回滚段不会减少,只是会控制用到的回滚段的个数;

默认为128个回滚段

#innodb_undo_directory

当开启独立undo表空间时,指定undo文件存放的目录

如果我们想转移undo文件的位置,只需要修改下该配置,并将undo文件拷贝过去就可以了。

2.相关代码

#在innodb启动时(innobase_start_or_create_for_mysql),会进行undo表空间初始化,细节见函数srv_undo_tablespaces_init

–>如果是新建实例,会去创建undo log文件,undo表空间的space id从1开始;默认初始化大小为10M,由宏SRV_UNDO_TABLESPACE_SIZE_IN_PAGES控制;

–>读取当前实例的所有undo表空间的space id (trx_rseg_get_n_undo_tablespaces)

首先从ibdata中读取到事务系统的文件头,然后再从其中记录的回滚段信息,找到回滚段对应的space id和page no(trx_sysf_rseg_get_space,trx_sysf_rseg_get_page_no),并按照space id排序后返回;

–>根据上一步读到的space id依次打开undo文件(srv_undo_tablespace_open),如果不存在,就标识启动失败

所以undo文件也是类似ibdata的重要文件,目前是不可以删除的。。。所以不要试图删除undo文件来释放空间- -!

可以容忍定义的table space个数比已有的undo文件个数要少(但所有的undo文件依然会打开),反之则报错初始化失败

#undo回滚段初始化 (trx_sys_create_rsegs)

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

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

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

[email protected]_schema 12:16:18>show status like ‘Innodb_available_undo_logs‘;
+—————————-+——-+
| Variable_name              | Value |
+—————————-+——-+
| Innodb_available_undo_logs | 128   |
+—————————-+——-+
1 row in set (0.00 sec)

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

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

TODO

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

转载自Simple Life

时间: 2024-12-31 06:32:44

Innodb独立的undo tablespace的相关文章

InnoDB undo tablespace使用及原理

前言 Undo log是InnoDB MVCC事务特性的重要组成部分,对记录做了变更操作时会产生undo记录,默认存储到系统表空间中,但是从5.6开始,可以使用独立的undo表空间. Undo记录存储的是老版本数据,当一个旧事务需要读取数据时,为了能读取到老版本数据,需要顺着undo连找到满足其可见性的记录.当版本链很长时,可以认为这是要一个比较耗时的操作. 大多数对记录的变更insert.update.delete.Insert操作在事务提交前只对当前事务可见,因此产生的undo日志可以在事务

Oracle Undo tablespace恢复(无备份)

Oracle Undo tablespace恢复 系统环境:   操作系统:RedHat EL55   Oracle:  Oracle 11gR2   Oracle 9i后,采用了undo tablespace管理undo数据,实现undo的自动管理,本案例演示了undo表空间被破坏后如何恢复:如果有备份,通过备份恢复非常容易,但在没有备份的情况下,就需要采用非常规手段来恢复了,呵呵. 1.案例应用环境 undo表空间undo segments: 14:34:44 [email protecte

How manager undo tablespace

What is the undo data ? 事务在修改数据块时,oracle db会copy修改前的数据块到undo tablespace,这个数据块称之为undo data. Why oracle db needs undo data ? 1.回滚未提交的事务 2.确保数据库一致性读 3.支持oracle flashback功能 What is the undo tablespace? 存放undo data的表空间称之为undo 表空间.undo tbs空间可以重复使用. Undo Re

undo tablespace RETENTION GUARANTEE

DBA_TABLESPACES中的RETENTION列说明: Undo tablespace retention: GUARANTEE---Tablespace is an undo tablespace with RETENTION specified as GUARANTEE A RETENTION value of GUARANTEE indicates that unexpired undo in all undo segments in the undo tablespace shou

UNDO TABLESPACE切换后,旧的长时间没有完全OFFLINE,案列:

案列: 由于生产库impdp导入一个分区表,期间出了问题,终止了导入,但是undo tablespace增长飞快增长到300G了,且经过两天才降下来,但是undo tablespace如果是自动扩展,只会扩展,当事务都结束了它自己也不会收缩的,所以只能手工去收缩. 于是创建一组新的undo tablespace,命名为undotbs2 alter system set undo_tablespace=undotbs2; 在线切换了undo tablespace; 手工切换完了但是还不能立即将旧的

Managing the UNDO TABLESPACE

Every Oracle Database must have a method of maintaining information that is used to roll back, or undo, changes to the database. Such information consists of records of the actions of transactions, primarily before they are committed. These records a

InnoDB独立表空间

使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:数据文件(.MYD),索引文件(.MYI)和表结构文件(.frm).我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而,当你使用InnoDB的时候,一切都变了. InnoDB默认会将所有的数据库的数据存储在一个共享表空间:ibdata1文件中,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题.通常只能将数据使用mysqldump导出,

MySQL InnoDB存储引擎undo redo解析

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo Log Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中.还用Undo Log来实现多版本号并发控制(简称:MVCC). - 事务的原子性(Atomicity) 事务中的所有操作,要么所有完毕,要么不做不论什么操作.不能仅仅做部分操作. 假设在运行的过程中发生 了错误,要回滚(Rollback)到事务開始前的状态,就像这个事务从来没有运行过. - 原理 Undo Log的原理非常ea

Innodb独立表空间的配置

环境介绍: MySQL版本:5.5.40 1.查看独立表空间是否开启 mysql> show variables like '%per_table%'; +-----------------------+-------+ | Variable_name         | Value | +-----------------------+-------+ | innodb_file_per_table | OFF   | +-----------------------+-------+ 1 r