MySQL InnoDB引擎表空间(tablespace)--探究

1.System tablespace

系统表空间是MySQL Server进行相关操作的公共表空间,其主要内容包括:

  • 表数据页
  • 表索引页
  • 数据字典
  • MVCC控制数据
  • Undo space
  • 回滚段
  • Double write buffer
  • Insert buffer

相关参数

innodb_data_file_path = /ibdata/ibdata1:10M:autoextend
innodb_file_per_table = ON

本人安装的数据库表空间目录为: 

root@centosnode01 ~]# find / -name 'ibdata1';

/usr/local/mysql/data/ibdata1
 MySQL InnoDB引擎表空间(tablespace)--探究_第1张图片

mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'innodb_data_file_path';
+-----------------------+-----------------------------------+
| Variable_name         | Value                             |
+-----------------------+-----------------------------------+
| innodb_data_file_path | ibdata1:12M;ibdata2:1G:autoextend |
+-----------------------+-----------------------------------+
1 row in set (0.00 sec)

 

现在的MySQL版本已经可以实现自动扩展表空间,其中innodb_file_per_table默认是开启的,表示为每一张新建的表创建表空间,这样可以避免ibdata1过于庞大。

数据字典

数据字典是由各种表对象的元数据信息(表结构,索引,列信息等)组成的内部表。

Double Write Buffer

InnoDB从buffer pool中取数据并写到数据文件中前的buffer区域,其也存在于tablespace中,主要是防止mysqld进程意外崩溃,导致数据丢失,一旦崩溃则可以从Double Write Buffer中恢复。

REDO logs

用于崩溃恢复,当mysqld启动时,InnoDB会根据REDO log自动恢复由不完整事务修改的数据,哪怕没有建立任何连接,mysqld崩溃前的没有更新完整的数据都会被replay,其实现基于LSN(Log Sequence Number),数据落盘前都会先写REDO log.

2.UNDO tablespace
UNDO表空间用于存放一个或多个UNDO log文件。UNDO通过保留活动事务(MVCC)的已修改未提交数据来保证读一致性。 从此存储区域检索未修改的数据。UNDO log也称为回滚段。默认情况下,UNDO表空间是系统表空间的一部分,当然从MySQL5.6开始也允许用户自定义一个UNDO表空间,需要注意的是:

如果自定义了UNDO表空间,在系统表空间的UNDO log也就会失效
这一配置需要在MySQL初始化之前完成
可以truncate但不能drop,如果要使用truncate的话则UNDO表空间必须已经独立于系统表空间
默认大小10M
相关参数
innodb_undo_tablespace : Number of undo tablespaces, default 0 , max 95 
innodb_undo_directory : Location for undo tablespace,default is data_dir with 10MB initial size.
innodb_undo_logs : Number of undo logs in a single undo tablespace, default and max value is ‘128’ [ Deprecated in 5.7.19 , innodb_rollback_segments variable will control this]    
innodb_undo_log_truncate: truncate undo tablespace, Default OFF  
3.Temporary tablespace
保存和检索临时表已修改未提交的数据和相关的对象,始于MySQL5.7.2,server运行时用于回滚临时表的修改。

临时表的UNDO log存在于临时表空间
server启动时,默认的临时表空间文件ibtmp1会被重新创建
优点:临时表的REDO log I/O被消除,性能得以提升
相关参数
innodb_temp_data_file_path = ibtmp1:12M:autoextend (default)
4.General tablespace
用户定义表空间,用户可以用CREATE TABLESPACE的语法来创建自定义的表空间,并在创建表的时候指定该表所属的表空间。

优点:

比innodb_file_per_table更有存储上(Memory)的优势
支持Antelope和Barracuda文件格式
支持所有行格式以及相关特性
支持在非数据目录的目录下创建
NOTE: tablespace名是大小写敏感的
5. tablespace相关设置
#DATA STORAGE
datadir=/var/lib/mysql
#InnoDB Configuration
innodb_file_per_table=1
#InnoDB Memory
innodb_buffer_pool_size = 2000M
#System Tablespace configuration
innodb_data_file_path= ibdata1:512M;ibdata2:512M:autoextend
#Redo log and buffer configuration
innodb-log-files-in-group=3
innodb_log_file_size=100M
innodb_log_buffer_size=30M
#InnoDB file formate
innodb_file_format = Barracuda
#UNDO Tablespace Configuration
innodb_undo_directory = /var/lib/mysql/
innodb_undo_tablespaces = 3
innodb_undo_logs = 128
innodb_undo_log_truncate = ON
innodb_rollback_segments = 128
#Temp Tablespace Configuration
tmpdir = /var/lib/mysql/
innodb_temp_data_file_path = ibtmp1:20M:autoextend
#tablespace 数据加密插件,在Enterprise版本中提供
#Keyring configuration
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql-keyring/keyring

6. 创建普通tablespace的函数调用
直接通过CREATE TABLESPACE语法
|-mysql_parse ()
  |-mysql_execture_command ()
    |-Sql_cmd_create_tablespace::execute ()
      |-innobase_alter_tablespace ()
        |-innobase_create_tablespace ()     
          |-dict_build_tablespace () //创建逻辑tablespace对象
            |-fil_ibd_create () //创建tablespace.ibd文件
              |-fsp_header_init_fields () //将tablespace id等信息写入文件头
当然用户也可以在建表时指定(包括innodb-file-per-table=ON)
tablespace 信息在建表语句的create_info中大致的函数调用关系:
|-Sql_cmd_create_table::execute ()
  |-mysql_create_table ()
    |-mysql_create_table_inner ()
      |-mysql_create_table_no_lock ()
        |-create_table_impl ()
          |-rea_create_base_table ()
            |-ha_create_table ()
              |-ha_innobase::create ()
                |-innobase_basic_ddl::create_impl ()
                  |-create_table_info_t::create_table ()
                    |-create_table_info_t::create_table_def ()
                      |-row_create_table_for_mysql ()
                        |-dict_build_table_def ()
                          |-dict_build_tablespace_for_table ()
                            |-fil_ibd_create () 
                              |-fsp_header_init_fields ()
参考1:MySQL 5.7 InnoDB Tablespace

参考2:创建表空间语法

你可能感兴趣的:(MySQL数据库实战)