MySQL OCP888题解014-表空间

文章目录

  • 1、原题
    • 1.1、英文原题
    • 1.2、中文翻译
    • 1.3、答案
  • 2、题目解析
    • 2.1、题干解析
    • 2.2、选项解析
      • 2.2.1、选项A解析
      • 2.2.2、选项B解析
      • 2.2.3、选项C解析
      • 2.2.2、选项B解析
  • 3、知识点
    • 3.1、知识点1:表空间
    • 3.2、知识点2:系统表空间
    • 3.3、知识点3:file-per-table表空间
    • 3.4、知识点4:通用表空间
    • 3.5、知识点5:undo表空间
  • 4、总结

1、原题

1.1、英文原题

MySQL OCP888题解014-表空间_第1张图片

Which statement is true about tablespaces?
A. General tablespaces can be configured to span multiple files.
B. All tables must be in either the system tablespace or a general tablespace.
C. All tablespace files must be in the directory specified by the --datadir option.
D. The system tablespace can be configured to span multiple files.

1.2、中文翻译

关于表空间,哪一条陈述是正确的?
A. 可以将通用表空间(General tablespaces)配置为跨多个文件。
B. 所有表必须位于系统表空间或通用表空间中。
C. 所有表空间文件必须位于–datadir选项指定的目录中。
D. 系统表空间可以配置为跨多个文件。

1.3、答案

2、题目解析

2.1、题干解析

本题考察表空间下相关的知识。

2.2、选项解析

2.2.1、选项A解析

通用表空间只能配置为一个文件,所以选项A错误。

2.2.2、选项B解析

InnoDB支持每个表拥有自己单独的表空间,所以选项B错误。

2.2.3、选项C解析

单独表空间和通用表空间都可以自定义所在目录,不一定非要在数据目录里。所以选项C错误。

2.2.2、选项B解析

系统表空间可以配置为跨多个表,所以选项D正确。

3、知识点

3.1、知识点1:表空间

表空间共有如下五种分类:

  • 系统表空间:系统表空间是InnoDB数据字典、双写缓冲区(doublewrite buffer)、变更缓冲区(change buffer)和撤销日志(undo log)的存储区域。对于那些没用独立表空间或通用表空间的表,这些表的表数据和索引数据也会存储在系统表空间。
  • file-per-table表空间:包含了一个单独的InnoDB表的数据和索引,并存储在一个单独的文件里。
  • 通用表空间:通用表空间是一个能够存储多个表的数据的共享表空间,使用CREATE TABLESPACE语法创建。
  • undo表空间:撤销日志默认存储在系统表空间中,但也可以存储在一个或多个撤销表空间中。撤销日志包含如何撤销事务对聚类索引记录的最新更改的信息。
  • 临时表空间:非压缩的、用户创建的临时表,磁盘上的内部临时表,会被在一个共享的临时表空间里创建。

官方参考文档

3.2、知识点2:系统表空间

  • 系统表空间是InnoDB数据字典、双写缓冲区(doublewrite buffer)、变更缓冲区(change buffer)和撤销日志(undo log)的存储区域。
  • 对于那些没用独立表空间或通用表空间的表,这些表的表数据和索引数据也会存储在系统表空间。
  • 系统表空间可以有一个或多个数据文件。默认情况下,在数据目录下创建一个名为ibdata1的系统表空间数据文件。系统表空间数据文件的大小和数量由innodb_data_file_path启动选项定义。
  • 增加系统表空间大小的最简单方法是将其配置为自动扩展。要做到这一点,在innodb_data_file_path设置中为最后一个数据文件指定自动扩展属性,然后重新启动服务器。比如说:innodb_data_file_path=ibdata1:10M:autoextend
  • 为了避免大的系统表空间,尽量使用file-per-table表空间或通用表空间来建表。与系统表空间不同,file-per-table表空间在被截断或丢弃时,会向操作系统返回磁盘空间,而系统表空间基本不会变小。

官方参考文档

3.3、知识点3:file-per-table表空间

  • 每一个file-per-table表空间包含了一个单独的InnoDB表的数据和索引,并存储在一个单独的文件里。
  • InnoDB默认以file-per-table方式创建表,这是由innodb_file_per_table变量控制的。禁用innodb_file_per_table会导致InnoDB在系统表空间创建表。
  • 在MySQL数据目录下的模式目录中的.ibd数据文件中就是对应着某一个表的file-per-table表空间。例如,表test.t1的数据文件是在MySQL数据目录下的test目录中创建的。可以使用CREATE TABLE语句的DATA DIRECTORY子句,在数据目录之外创建某个表的file-per-table表空间。
  • file-per-table表空间的优点:
    • 在截断或丢弃表后,file-per-table表空间的磁盘空间将返还给操作系统。通用表空间和系统表空间的数据文件在表被截断或丢弃后,其大小不会缩减。
    • 可以在单独的存储设备上创建file-per-table表空间,方便I/O优化、空间管理或者备份。
    • 当发生数据损坏、备份或二进制日志不可用或MySQL服务器实例不能重新启动时,存储在单个表空间数据文件中的表可以节省时间并提高成功恢复的机会。
    • file-per-table表空间对应的表大小监控很直观,就是其表空间数据文件的大小。
    • 通用表空间中的表的大小受到64TB表空间大小限制。相比之下,每个按文件划分的表空间有64TB的大小限制,这为单个表的大小增长提供了足够的空间。。
  • file-per-table表空间的缺点:
    • 每个表都可能有未使用的空间,这些空间只能被同一个表的行所利用,如果管理不当,就会导致空间的浪费。
    • fsync操作是在多个逐个文件的数据文件上进行的,而不是在一个共享的表空间数据文件上。因为fsync操作是按文件进行的,所以对多个表的写操作不能合并,这可能导致fsync操作的总数增加。
    • mysqld必须为每个逐个文件的表空间保持一个开放的文件句柄,如果你在逐个文件的表空间中有许多表,这可能影响性能。
    • 当每个表有它自己的数据文件时,需要更多的文件描述符。

官方参考文档

3.4、知识点4:通用表空间

  • 通用表空间是一个能够存储多个表的数据的共享表空间,使用CREATE TABLESPACE语法创建。提供以下功能。
    • 与系统表空间类似,通用表空间是共享表空间,能够存储多个表的数据。
    • 有潜在的内存优势:通用表空间中的多个表比在单独的file-per-table空间中的相同数量的表,可以更好的利用空间,消耗更少的内存。
    • 通用表空间的数据文件默认存放在数据目录中,但也可以放在数据目录之外的其他目录中。
    • TABLESPACE选项可以与CREATE TABLE一起使用,以在通用表空间、file-per-table表空间或系统表空间中创建表
    • TABLESPACE选项可以和ALTER TABLE一起使用,以便在通用表空间、file-per-table表空间和系统表空间之间移动表。
  • 创建通用表空间的方法
    • 通用表空间如果要在数据目录之外创建,所在目录必须已经存在。
    • 当在数据目录外创建通用表空间时,将在数据目录中创建一个.isl文件,相当于软链接。
    • 在数据目录中创建一个通用表空间,如下例所示:
      mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
    • 在数据目录之外的目录中创建一个通用表空间,如下例所示:
      mysql> CREATE TABLESPACE `ts2` ADD DATAFILE '/opt/tablespace/ts2.ibd' Engine=InnoDB;
  • 使用通用表空间的方法:
    • 创建表时指定表空间:mysql> CREATE TABLE t1(c1 INT PRIMARY KEY) TABLESPACE ts1;
    • 更改表时指定通用表空间:mysql> ALTER TABLE t1 TABLESPACE ts2;

官方参考文档

3.5、知识点5:undo表空间

  • 撤销日志默认存储在系统表空间中,但也可以存储在一个或多个undo表空间中。撤销日志包含如何撤销事务对聚类索引记录的最新更改的信息。
  • InnoDB使用的undo表空间的数量是由innodb_undo_tablespaces选项控制的,默认值是0。这个选项只能在初始化MySQL实例时进行配置,之后不能改变。innodb_undo_tablespaces选项已被废弃,预计在未来的版本中会被移除。
  • 将undo日志不是存放在系统表空间而是存放在专门的undo表空间的好处是:系统表空间使用的磁盘空间无法被收回,即使undo日志被释放。而使用专门的undo表空间,配合innodb_undo_tablespaces变量和innodb_undo_log_truncate变量,可以在undo日志释放后,将表空间也返还给操作系统,特别是避免在大事务之后导致系统表空间变得很大且无法回收。

官方参考文档

4、总结

  1. InnoDB表空间共有系统表空间、通用表空间、file-per-table表空间、undo表空间和临时表空间五种。
  2. 从表空间文件位置来看,系统表空间一定位于数据目录下,系统用表空间、file-per-table表空间、undo表空间默认处于数据目录下,但也可以存放到其他目录下,这样有利于存储优化、备份等管理操作。
  3. 只有系统表空间,可以跨多个文件。
  4. 系统表空间主要存储数据字典、双写缓存、change buffer、undo日志(如果undo日志没有被指定存储到undo表空间),还会为没有使用file-per-table或通用表空间的表存储数据和索引。
  5. 通用表空间类似于系统表空间,不过不是由系统自行创建,而是由用户自行创建,并可以在表创建或变更时指定使用通用表空间。通用表空间可以有多个,每个通用表空间可以存储多张表的数据和索引。
  6. file-per-table表空间是为每个表创建独立的表空间,这样有利于空间回收,因为一旦被这个表被截断或drop,则表空间文件所使用的磁盘空间可以被操作系统回收。
  7. undo日志默认存储在系统表空间,但可以被指定存储到undo表空间,优点是可以回收磁盘空间,特别对于大事务。
  8. 临时表空间适用于用户创建的临时表,或者在文件系统上创建的内部临时表。

你可能感兴趣的:(mysql,数据库,ocp)