January 26, 2014

[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 […]