MySQL内核InnoDB存储引擎详解(13)

mysql> show variables like '%innodb_undo%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_undo_directory | ./ |
| innodb_undo_log_truncate | OFF |
| innodb_undo_logs | 128 |
| innodb_undo_tablespaces | 0 |

Innodb_undo_log_truncate参数决定是否开启undo表空间清空

mysql> SET GLOBAL innodb_undo_log_truncate=ON;

当设置了此参数为ON后,则代表undo文件大小超过innodb_max_undo_log_size(默认值是128M)的都标记为清空

mysql> SELECT @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
| 1073741824 |
mysql> SET GLOBAL innodb_max_undo_log_size=2147483648;
Query OK, 0 rows affected (0.00 sec)

当标记为清空后,回滚段标记为非激活状态表示不接收新的事务,而已存在的事务会等到完成;然后通过purge操作将回滚段空间释放;当undo表空间的所有回滚段都释放后,表空间就会清空成初始10M大小;然后回滚段重新变成激活状态以接收新的事务

InnoDB普通表空间

什么情况下需要普通表空间 
一般是当你有一些表访问比较频繁,而且你的物理磁盘性能不太一样,快的磁盘空间比较小的时候,可以考虑把这几个表通过表空间放到快的盘上。

通过create tablespace命令可以创建一个共享InnoDB表空间,和系统表空间一样,多个表可以在此表空间上存储数据, 此表空间的数据文件可以放置在任意的文件夹下。

CREATE TABLESPACE tablespace_name
ADD DATAFILE 'file_name'
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB; ##创建在
MySQL数据目录下
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd'
Engine=InnoDB;
当创建完表空间之后,就可以通过create table …tablespace或者alter table …
tablespace命令将表增加到此表空间上
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;
mysql> ALTER TABLE t2 TABLESPACE ts1;

通过alter table命令可以将InnoDB表在系统表空间、独立表空间和普通表空间之间转化:

ALTER TABLE tbl_name TABLESPACE [=] tablespace_name ##从系统表空间或者独立表空
间上转移到普通表空间
ALTER TABLE tbl_name ... TABLESPACE [=] innodb_system ##从普通表空间或者独立表空间上转移到系统表空间
ALTER TABLE tbl_name ... TABLESPACE [=] innodb_file_per_table ##从系统表空间或者普通表空间转移到独立表空间

Alter table … tablespace语句的执行都会导致此表会重建,即使表空间的属性和之前是 
一样的。

mysql> create tablespace ts1 add datafile
'/usr/local/mysql/data/ts1.ibd';
Query OK, 0 rows affected (0.02 sec)
mysql> use course;
#创建了一个普通表空间
mysql> create table students4(id int,name varchar(10)) tablespace ts1;
Query OK, 0 rows affected (0.00 sec)
#更改为独立表空间
mysql> alter table students4 tablespace=innodb_file_per_table;
root@localhost:/usr/local/mysql/data/course# ls students4.*
students4.frm students4.ibd

当删除一个普通表空间时,首先需要保证此表空间上的所有表都被删除,否则会报错。删除表空间是用drop tablespace语句来执行。Drop database的动作会删除所有的表,但创建的tablespace不会被自动删除,必须通过drop tablespace显示执行。

普通表空间不支持临时表,而且也不支持alter table … discard tablespace和alter table …import tablespace命令。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1fe1e788fe1712d1b3106819c6ce028f.html