首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL InnoDB引擎表空间(tablespace)

MySQL InnoDB引擎表空间(tablespace)

原创
作者头像
devsql
发布2018-10-24 18:58:50
5.7K0
发布2018-10-24 18:58:50
举报
文章被收录于专栏:MySQL内核MySQL内核MySQL内核

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

现在的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的函数调用

  1. 直接通过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等信息写入文件头
  1. 当然用户也可以在建表时指定(包括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:创建表空间语法

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.System tablespace
  • 2.UNDO tablespace
  • 3.Temporary tablespace
  • 4.General tablespace
  • 5. tablespace相关设置
  • 6. 创建普通tablespace的函数调用
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档