undo tablespace 中包含undo log,是一种独立的表空间。在mysql启动时会默认创建两个undo表空间,且系统要求起码有两个活跃的undo表空间以支持自动truncate功能。(这样可以保证一个离线truncate另一个继续提供服务)。undo表空间文件创建在–innodb_undo_derectory变量指定的位置,默认在data目录下,文件名undo_N格式。每个文件的初始大小基于–innodb_page_size参数(默认16K), 默认大小为10M。
添加undo表空间
8.0.14版本以前,可以在启动时设置–innodb_undo_tablespaces来指定创建的undo表空间,后续版本废弃改参数,创建可以使用
create undo tablespace tablespace_name add datafile "filename";
使用该语法时,指定的filename可以是绝对路径,但是该路径必须是innodb可以识别的,–innodb_directoried变量定义了这些路径,而且不管该变量如何显示定义,都会包含三个默认路径,分别是–innodb_undo_directory, –data_dir,–innodb_data_home_dir,mysql启动时会在这些路径里扫描寻找undo tablespaces。
如果没有指定绝对路径,那么undo tablespace会被创建在innodb_undo_directory下,如果该变量为空,会创建在mysql的data(/var/lib/mysql)目录下.
删除undo表空间
用create undo tablespace语法创建的undo表空间可以使用drop undo tablespace语法来删除(默认创建的表空间不可用),在删除前必须保证该空间是empty状态。
在清空一个表空间前必须把它的状态设置为inactive,确保该表空间的rollback segment的undo segment不会分配给事务使用。
alter undo tablespace tablespace_name set inactive;
设置后会等待已经使用该表空间的事务提交,待所有的事务提交后,purge线程开始truncate表空间至初始大小,这时候表空间的状态为empty,即可以被drop。
drop undo tablespace tablespace_name;
可以在INNODB_TABLESPACES 表里查询到每个表空间的状态,包括undo表空间
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE NAME LIKE tablepace_name;
默认的undo表空间不可以被drop但是可以设置成inactive状态,但是必须保证起码有两个活跃的表空间以支持表空间的自动truncate,否则会报错。
移动undo表空间
用create undo tablespace语法创建的undo表空间文件可以移动到任何innndb可以识别的路径,mysql在启动时会找到他们,但是默认创建的undo表空间不可移动,如果默认undo表空间被移动了,那么必须在启动时更改–innodb_undo_directory参数为移动后的路径。
清除undo表空间
一个表空间文件默认最大为1G,由–innodb_max_undo_log_size参数控制,innodb提供了自动和手动两种方式清除undo log
自动清除由purge线程(垃圾回收线程,可能有多个,后台独立运行,参数–innodb_purge_threads指定)完成,需要开启–innodb_undo_log_truncate参数,默认是开启的。
由于自动truncate必须保证有两个活动的undo表空间,那么手动就必须有三个获得undo表空间,因为可能有一个正在truncate而处于offline。
两种方式清除过程如上所述,等undo表空间的状态时empty后,状态再设置成active
对于自动清除可以使用–innodb_purge_rseg_truncate_frequency参数来提高清除频率,默认是purge被触发(undo tablespace大小超过–innodb_max_undo_log_size参数)了128次后,执行一次truncate,可以设置更小的值加速truncate。