MySQL undo log 管理
在InnoDB存储引擎中,undo log是采用分段(segment)的方式进行存储的。rollback segment称为回滚段,每个回滚段中有1024个undo log segment。在MySQL5.5之前,只支持1个rollback segment,也就是只能记录1024个undo操作。在MySQL5.5之后,可以支持128个rollback segment,分别从resg slot0 - resg slot127,每一个resg slot,也就是每一个回滚段,内部由1024个undo segment 组成,即总共可以记录128 * 1024个undo操作。
不仅存放着数据更新前的记录,还记录着RowID、事务ID、回滚指针。其中事务ID每次递增,回滚指针第一次如果是insert语句的话,回滚指针为NULL,第二次update之后的undo log的回滚指针就会指向刚刚那一条undo log日志,依次类推,就会形成一条undo log的回滚链,方便找到该条记录的历史版本。
在MySQL5.6中开始支持把undo log分离到独立的表空间,并放到单独的文件目录下;这给我们部署不同IO类型的文件位置带来便利,对于并发写入型负载,我们可以把undo文件部署到单独的高速存储设备上.
MySQL从8.0开始undo 表空间管理已经发生了改变:
在5.7版本中一旦MySQL初始化以后,就不能再改变undo表空间了,所以我们在5.7版本中都是在初始化的时候对undo表空间进行一些设置,类似这样:在my.cnf文件中加入innodb_undo_directory= /data/mysql/undologs 和 innodb_undo_tablespaces=5 这两个参数,之所以这么改,是因为我们想把undo表空单独从系统表空间idbdata中分离出来,这样就可以消除因undo的问题造成对ibdata系统表空间的影响,所以上面的参数配置在5.7版本中是我们对MySQL初始化做的一个常规的最佳实践设置,如果不设置,那么在5.7版本中,undo还是默认会放在ibdata中。
从MySQL8.0版本开始,MySQL默认对undo进行了分离操作,也就是说,不需要在初始化中手动配置参数,默认会在datadir目录下生成两个10兆大小的undo表空间文件undo_001 和 undo_002 并且可以在线的增加和删除undo表空间文件进行动态扩容和收缩,这在之前的版本都是不被准许的。
8.0在线增加undo tablespace
- undo tablespace 文件名必须以
.ibu
结尾。 - tablespace名字不能以
innodb_
开头。
mysql> create undo tablespace innodb_undo_003 ADD DATAFILE 'undo_003';
ERROR 3119 (42000): InnoDB: Tablespace names starting with `innodb_` are reserved.
mysql> create undo tablespace undo_003 ADD DATAFILE 'undo_003';
ERROR 3121 (HY000): The ADD DATAFILE filepath must end with '.ibu'.
mysql> create undo tablespace undo_003 ADD DATAFILE 'undo_003.ibu';
Query OK, 0 rows affected (0.49 sec)
8.0在线删除表空间
ALTER UNDO TABLESPACE tablespace_name SET INACTIVE;
DROP UNDO TABLESPACE tablespace_name;
mysql> alter undo tablespace undo_003 set inactive;
Query OK, 0 rows affected (0.00 sec)
mysql> drop undo tablespace undo_003;
Query OK, 0 rows affected (0.01 sec)
8.0 查看表空间的状态
5.7是没有这个视图的。
mysql> SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES;
+---------------------------------------------+--------+
| NAME | STATE |
+---------------------------------------------+--------+
| mysql | normal |
| innodb_temporary | normal |
| innodb_undo_001 | active |
| innodb_undo_002 | active |
| sys/sys_config | normal |
| flinktest/products | normal |
| eo_oscomment/comment_like | normal |
| eo_oscomment/comment_content | normal |
| eo_oscomment/comment_relation | normal |
| eo_oscomment/comment_user_set | normal |
| eo_oslms/lms_feature_guid | normal |
| eo_oslms/lms_grade_display | normal |
| eo_oslms/learning_materials | normal |
| eo_oslms/lms_summary_score | normal |
| eo_oslms/lms_activity_student_ability_score | normal |
| eo_oslms/lms_activity_do | normal |
| eo_oslms/lms_activity | normal |
| eo_oslms/lms_activity_ability | normal |
| eo_oslms/lms_ability_summary_score | normal |
| eo_oslms/learning_materials_students | normal |
| eo_oslms/lms_system_grade_rule | normal |
| eo_oslms/lms_activity_extension | normal |
| eo_oslms/lms_ability_group | normal |
| eo_oslms/lms_activity_student | normal |
| eo_oslms/lms_teacherIn_import_record | normal |
| eo_oslms/lms_unit | normal |
| eo_oslms/lms_unit_student_summary | normal |
| eo_oslms/record_class_student_videos | normal |
| eo_oslms/record_class | normal |
| eo_oslms/lms_activity_teacher | normal |
| eo_oslms/lms_ability | normal |
| eo_oslms/record_class_students | normal |
| eo_oscomment/comment_group | normal |
| eo_oslms/lms_evaluation_setting | normal |
| eo_oslms/discuss | normal |
| eo_oslms/discuss_students | normal |
| ptest/record_class_students | normal |
| ptest/_eeo_course_class_del | normal |
| ptest/eeo_course_class | normal |
+---------------------------------------------+--------+
评论区