1 Mysql5.6

1.1 相关参数

MySQL 5.6增加了参数innodb_undo_directory、innodb_undo_logs和innodb_undo_tablespaces这3个参数,可以把undo log从ibdata1移出来单独存放。

  • innodb_undo_directory:指定单独存放undo表空间的目录,默认为.(即datadir),可以设置相对路径或者绝对路径。该参数实例初始化之后虽然不可直接改动,但是可以通过先停库,修改配置文件,然后移动undo表空间文件的方式去修改该参数。

默认参数:

mysql> show variables like '%undo%';+-------------------------+-------+| Variable_name      | Value |+-------------------------+-------+| innodb_undo_directory  | .   || innodb_undo_logs    | 128  || innodb_undo_tablespaces | 0   |+-------------------------+-------+
mysql_install_db ...... --innodb_undo_tablespaces$ ls...undo001 undo002 undo003

初始化实例之前,我们只需要设置innodb_undo_tablespaces参数(建议大于等于3)即可将undo log设置到单独的undo表空间中。如果需要将undo log放到更快的设备上时,可以设置innodb_undo_directory参数,但是一般我们不这么做,因为现在SSD非常普及。innodb_undo_logs可以默认为128不变。

undo log可以存储于ibdata之外。但这个特性依然鸡肋:

  • 首先你必须在install实例的时候就指定好独立Undo tablespace, 在install完成后不可更改。
  • Undo tablepsace的space id必须从1开始,无法增加或者删除undo tablespace。

1.3 大事务测试

mysql> create table test.tbl( id int primary key auto_increment, name varchar(200));Query OK, 0 rows affected (0.03 sec)mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> insert into test.tbl(name) values(repeat('1',00));Query OK, 1 row affected (0.00 sec)mysql> insert into test.tbl(name) select name from test.tbl;Query OK, 1 row affected (0.00 sec)Records: 1 Duplicates: 0 Warnings: 0...mysql> insert into test.tbl(name) select name from test.tbl;Query OK, 2097152 rows affected (24.84 sec)Records: 2097152 Duplicates: 0 Warnings: 0mysql> commit;Query OK, 0 rows affected (7.90 sec)
$ du -sh undo*10M  undo00169M  undo00210M  undo003

5.7引入了在线truncate undo tablespace

2.1 相关参数

必要条件:

  • innodb_undo_tablespaces:最少有两个,这样一个在清理的时候可以使用另一个,该参数实例初始化之后不可改动
  • innodb_rollback_segments:回滚段的个数,总会有一个回滚段分配给系统表空间,32个保留给临时表空间。所以如果想使用undo表空间的话,这个值要至少为33。例如使用两个undo表空间,这个值就配35。如果设置多个undo表空间,系统表空间中的回滚段会变成非活跃状态。

启动参数:

  • innodb_undo_log_truncate=on
  • innodb_max_undo_log_size:超过这个值的表空间会标记为truncate,动态参数默认是1G
  • innodb_purge_rseg_truncate_frequency:指定purge操作被唤起多少次之后才释放rollback segments。当undo表空间里面的rollback segments被释放时,undo表空间才会被truncate。由此可见,该参数越小,undo表空间被尝试truncate的频率越高。

2.2 清理过程

  1. undo表空间大小超过innodb_max_undo_log_size后,标记该表空间需要清理。标记会循环进行,避免一个表空间被反复清理。
  2. 标记表空间内的回滚段变为非活跃状态,正在运行的事务等待执行完。
  3. 开始purge
  4. 释放undo表空间中的所有回滚段后,运行truncate并将undo表空间截断为其初始大小,初始大小由innodb_page_size决定,默认16KB的大小对应表空间为10MB
  5. 重新激活回滚段,以便将它们分配给新事务

2.3 性能建议

truncate表空间时避免影响性能的最简单方法是增加撤消表空间的数量

2.4 大事务测试

配置8个undo表空间,innodb_purge_rseg_truncate_frequency=10

mysqld --initialize ... --innodb_undo_tablespaces=8
mysql> show global variables like '%undo%';+--------------------------+------------+| Variable_name      | Value   |+--------------------------+------------+| innodb_max_undo_log_size | 1073741824 || innodb_undo_directory  | ./     || innodb_undo_log_truncate | ON     || innodb_undo_logs     | 128    || innodb_undo_tablespaces | 8     |+--------------------------+------------+mysql> select @@innodb_purge_rseg_truncate_frequency;+----------------------------------------+| @@innodb_purge_rseg_truncate_frequency |+----------------------------------------+|                   10 |+----------------------------------------+select @@innodb_max_undo_log_size;+----------------------------+| @@innodb_max_undo_log_size |+----------------------------+|          10485760 |+----------------------------+mysql> create table test.tbl( id int primary key auto_increment, name varchar(200));Query OK, 0 rows affected (0.03 sec)mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> insert into test.tbl(name) values(repeat('1',00));Query OK, 1 row affected (0.00 sec)mysql> insert into test.tbl(name) select name from test.tbl;Query OK, 1 row affected (0.00 sec)Records: 1 Duplicates: 0 Warnings: 0...mysql> insert into test.tbl(name) select name from test.tbl;Query OK, 2097152 rows affected (24.84 sec)Records: 2097152 Duplicates: 0 Warnings: 0mysql> commit;Query OK, 0 rows affected (7.90 sec)

$ du -sh undo*
10M undo001
10M undo002
10M undo003
10M undo004
10M undo005
10M undo006
125M undo007
10M undo008

$ du -sh undo*
10M undo001
10M undo002
10M undo003
10M undo004
10M undo005
10M undo006
10M undo007
10M undo008

3 Reference

https://dev.mysql.com/doc/ref...

总结

更多相关文章

  1. Linux系统查看磁盘可用空间的5个命令
  2. 解决Android(安卓)Studio和Android(安卓)SDK Manager无法在线更
  3. Android(安卓)获取存储卡路径和空间使用情况
  4. 解决Android(安卓)Studio 和 Android(安卓)SDK Manager 无法在线
  5. 【Android】两步搞定AndroidSDKManager在线更新SDK版本失败问题
  6. Android(安卓)Studio无法在线更新
  7. eclipse ADT在线安装 https://dl-ssl.google.com/android/eclips
  8. Android中设置控件可见与不可见详…
  9. 推荐一个Android的在线课程

随机推荐

  1. android用于打开各种文件的intent
  2. Android : 继承BaseAdapter对ListView进
  3. 强制系统横屏竖屏
  4. Android: 下载并编译Android Source Tree
  5. iPhone与Android对比
  6. 2011.08.30——— android setOnTouchLis
  7. android 程序日志记录
  8. android - 制作底部选项卡TabHost
  9. Android Service 示例
  10. Android 蓝牙2.0工具类