MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点6:InnoDB Tablespaces之系统表空间(System Tablespace)

本文主要是介绍MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点6:InnoDB Tablespaces之系统表空间(System Tablespace),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点6:InnoDB Tablespaces之系统表空间(System Tablespace)
    • 系统表空间(System Tablespace)
      • 主要系统变量
        • innodb_data_file_path
          • 关于autoextend和max属性
          • 系统表空间文件默认路径
        • innodb_file_per_table
      • 其他相关系统变量
        • innodb_autoextend_increment
        • innodb_data_home_dir
      • 增加系统表空间的大小
        • 0.查看当前设置
        • 1.停止MySQL服务器
        • 2.修改innodb_data_file_path参数
        • 3.启动MySQL服务器
        • 4.查看设置结果
      • 减小系统表空间的大小
    • 例题
    • 参考

【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。
编辑|SQL和数据库技术(ID:SQLplusDB)

MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点6:InnoDB Tablespaces之系统表空间(System Tablespace)

InnoDB表空间是MySQL中用于存储InnoDB存储引擎表数据和索引的物理文件。
InnoDB Architecture
InnoDB表空间根据用途可以分成多种类型:

  • 数据表空间:
    • System tablespace(系统表空间)
    • File-per-table tablespaces(单独表空间)
    • General tablespaces(一般表空间)
  • Undo 表空间
  • 临时表空间(Temporary table tablespaces)

系统表空间(System Tablespace)

系统表空间(System Tablespace)是InnoDB的默认表空间,存储了系统表和一些共享表的数据和索引。

  • 更改缓冲区(Change Buffer)的存储区域位于InnoDB的系统表空间中。

  • 除了存储更改缓冲区之外,如果表是在系统表空间而不是文件表空间或通用表空间中创建的话,系统表空间还可以包含表和索引数据

  • 在MySQL 8.0之前的版本中,系统表空间还包含InnoDB的数据字典(在MySQL 8.0中,InnoDB将元数据存储在MySQL数据字典中)。

  • 在MySQL 8.0.20之前的版本中,系统表空间还包含了双写缓冲区(doublewrite buffer )的存储区域(MySQL 8.0.20中双写缓冲区的存储区域位于单独的双写文件中doublewrite files )。

    ※关于Doublewrite Buffer可以参考如下说明
    15.6.4 Doublewrite Buffer
    https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html

  • 系统表空间可以有一个或多个数据文件,默认情况下,在数据目录中创建一个名为ibdata1的系统表空间数据文件。

主要系统变量

和系统表空间(System Tablespace)相关的系统变量主要包括如下2个:

- innodb_data_file_path
- innodb_file_per_table
innodb_data_file_path

innodb_data_file_path是一个InnoDB存储引擎的系统变量,用于指定InnoDB表空间的数据文件路径和大小。

Command-Line Format–innodb-data-file-path=file_name
System Variableinnodb_data_file_path
ScopeGlobal
DynamicNo
SET_VAR Hint AppliesNo
TypeString
Default Valueibdata1:12M:autoextend

参考:
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_data_file_path

该系统变量的默认值为ibdata1:12M:autoextend,表示使用名为ibdata1的数据文件作为系统表空间的默认文件,初始大小为12兆字节,并且可以自动扩展。

file_name:file_size[:autoextend[:max:max_file_size]]

※文件大小可以用K、M或G来表示,如果使用K来指定数据文件的大小,应该是1024的倍数(以KB为单位的值将会被四舍五入到MB)。所有数据文件的大小之和必须至少略大于12MB。

例:

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

innodb_data_file_path的值可以包含一个或多个数据文件的定义,每个数据文件的定义由冒号分隔。

innodb_data_file_path = ibdata1:12M;ibdata2:24M:autoextend
关于autoextend和max属性

注意autoextend和max属性只能用于最后指定的数据文件。
另外,当指定了autoextend属性时,数据文件会根据需要以64MB为单位自动增加大小。
自动增加的单位大小由innodb_autoextend_increment变量控制。

例:

mysql> show variables like 'innodb_autoextend_increment';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| innodb_autoextend_increment | 64    |
+-----------------------------+-------+
1 row in set, 1 warning (0.00 sec)
系统表空间文件默认路径

系统表空间文件默认情况下会在数据目录(datadir)中创建。
可以使用innodb_data_home_dir选项指定替代位置。
例如,要在名为myibdata的目录中创建系统表空间数据文件,可以使用以下配置:

[mysqld]
innodb_data_home_dir = /myibdata/
innodb_data_file_path=ibdata1:50M:autoextend

在指定innodb_data_home_dir的值时,需要在末尾加上斜杠。
InnoDB不会创建目录,因此在启动服务器之前,需要确保指定的目录已经存在。同时,确保MySQL服务器具有在该目录中创建文件的适当访问权限。

InnoDB通过将innodb_data_home_dir的值与数据文件名进行文本连接来形成每个数据文件的目录路径。
如果未定义innodb_data_home_dir,则默认值为“./”,即数据目录。(MySQL服务器在开始执行时会将其当前工作目录更改为数据目录。)

另外,还可以为系统表空间数据文件指定绝对路径。以下配置与前面的配置等效:

[mysqld]
innodb_data_file_path=/myibdata/ibdata1:50M:autoextend

当为innodb_data_file_path指定绝对路径时,该设置不会与innodb_data_home_dir设置进行连接。
系统表空间文件将在指定的绝对路径中创建。在启动服务器之前,指定的目录必须存在。

参考:
System Tablespace Data File Configuration
https://dev.mysql.com/doc/refman/8.0/en/innodb-init-startup-configuration.html#innodb-startup-data-file-configuration

innodb_file_per_table

对于innodb_file_per_table参数用于控制创建表时候的表空间,
当启用时,表会创建在 File-per-table tablespaces(单独表空间)中。
当禁用时,表会创建在System tablespace(系统表空间)中。

innodb_file_per_table变量可以使用SET GLOBAL语句在运行时进行配置,在启动时在命令行中指定,或在选项文件中指定。
当位于File-per-table tablespaces(单独表空间)中的表被truncate 或者drop时,释放的空间将返回给操作系统。截
位于系统表空间中的表被truncate 或者drop时,仅释放系统表空间中的空间。系统表空间中的空闲空间可以再次用于InnoDB数据,但不会返回给操作系统。
系统表空间数据文件永远不会缩小。

Command-Line Format–innodb-file-per-table
System Variableinnodb_file_per_table
ScopeGlobal
DynamicYes
SET_VAR Hint AppliesNo
TypeBoolean
Default ValueON

例:

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

参考:
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_file_per_table

其他相关系统变量

innodb_autoextend_increment

innodb_autoextend_increment是用于控制自动扩展InnoDB系统表空间文件大小的增量大小(以兆字节为单位)。
当系统表空间文件满时,会自动扩展其大小。默认值为64MB。

注意innodb_autoextend_increment设置不会影响 File-per-table tablespaces(单独表空间)或 General tablespaces(一般表空间)。这些文件会自动扩展但不受innodb_autoextend_increment设置的影响。
file-per-table tablespace files or general tablespace files

Command-Line Format–innodb-autoextend-increment=#
System Variableinnodb_autoextend_increment
ScopeGlobal
DynamicYes
SET_VAR Hint AppliesNo
TypeInteger
Default Value64
Minimum Value1
Maximum Value1000
Unitmegabytes

参考:
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_autoextend_increment

innodb_data_home_dir

innodb_data_home_dir用于InnoDB系统表空间数据文件的目录路径的公共部分。
默认值是MySQL数据目录。

Command-Line Format–innodb-data-home-dir=dir_name
System Variableinnodb_data_home_dir
ScopeGlobal
DynamicNo
SET_VAR Hint AppliesNo
TypeDirectory name

参考:
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_data_home_dir

增加系统表空间的大小

通过修改innodb_data_file_path参数,可以实现增加系统表空间的大小:

1.最简单方法是将innodb_data_file_path参数配置为自动扩展(事实上默认开启autoextend)。
2.innodb_data_file_path参数中添加另一个数据文件来增加系统表空间的大小。

对于一般参数而言,可以通过SET命令设置。但是系统表空间相关innodb_data_file_path参数设置,不能通过SET 命令进行修改。需要通过修改my.cnf(my.ini)配置文件中的相应参数来实现。

mysql> SET PERSIST innodb_data_file_path='ibdata1:12M;ibdata2:24M:autoextend';
ERROR 1238 (HY000): Variable 'innodb_data_file_path' is a read only variable
mysql> SET PERSIST_ONLY innodb_data_file_path='ibdata1:12M;ibdata2:24M:autoextend';
ERROR 1238 (HY000): Variable 'innodb_data_file_path' is a non persistent read only variable

参考:
MySQL 8.0 OCP (1Z0-908) 考点精析-安装与配置考点1:设置系统变量
https://teacherwhat.blog.csdn.net/article/details/132378405

要增加系统表空间的大小操作步骤如下。

0.查看当前设置

参数设置:

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

文件系统

root@mysql-vm:/var/lib/mysql#  ls -lh ibdata*
-rw-r----- 1 mysql mysql 12M Oct 14 13:49 ibdata1
root@mysql-vm:/var/lib/mysql#
1.停止MySQL服务器

停止MySQL服务。

root@mysql-vm:/var/lib/mysql# systemctl status mysql
● mysql.service - MySQL Community ServerLoaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)Active: active (running) since Sat 2023-10-14 13:49:50 CST; 2h 56min agoMain PID: 678 (mysqld)Status: "Server is operational"Tasks: 38 (limit: 1102)Memory: 403.8MCPU: 1min 20msCGroup: /system.slice/mysql.service└─678 /usr/sbin/mysqldOct 14 13:49:41 mysql-vm systemd[1]: Starting MySQL Community Server...
Oct 14 13:49:50 mysql-vm systemd[1]: Started MySQL Community Server.root@mysql-vm:/var/lib/mysql# systemctl stop mysql
root@mysql-vm:/var/lib/mysql#  systemctl status mysql
○ mysql.service - MySQL Community ServerLoaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)Active: inactive (dead) since Sat 2023-10-14 16:46:32 CST; 32s agoProcess: 678 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS)Main PID: 678 (code=exited, status=0/SUCCESS)Status: "Server shutdown complete"CPU: 1min 164msOct 14 13:49:41 mysql-vm systemd[1]: Starting MySQL Community Server...
Oct 14 13:49:50 mysql-vm systemd[1]: Started MySQL Community Server.
Oct 14 16:46:29 mysql-vm systemd[1]: Stopping MySQL Community Server...
Oct 14 16:46:32 mysql-vm systemd[1]: mysql.service: Deactivated successfully.
Oct 14 16:46:32 mysql-vm systemd[1]: Stopped MySQL Community Server.
Oct 14 16:46:32 mysql-vm systemd[1]: mysql.service: Consumed 1min 164ms CPU time.
root@mysql-vm:/var/lib/mysql#
2.修改innodb_data_file_path参数

修改my.cnf(my.ini)配置文件中的innodb_data_file_path参数。

my.cnf(my.ini)配置文件的位置可以通过【mysql --help】命令中的Default options内容查看。

例:

$ mysql --help
...
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

配置文件中添加如下内容:

innodb_data_file_path = ibdata1:12M;ibdata2:24M:autoextend

如果innodb_data_file_path设置中的最后一个数据文件定义了autoextend属性,请将其删除,并修改size属性以反映当前数据文件的大小。要确定要指定的适当数据文件大小,请检查文件系统中的文件大小,并将该值向下舍入到最接近的MB值,其中1MB等于1024 x 1024字节。

将一个新的数据文件追加到innodb_data_file_path设置中,可选择指定autoextend属性。autoextend属性只能针对innodb_data_file_path设置中的最后一个数据文件指定。

3.启动MySQL服务器

启动MySQL服务

root@mysql-vm:/etc/mysql/mysql.conf.d# systemctl start mysql
root@mysql-vm:/etc/mysql/mysql.conf.d# systemctl status mysql
● mysql.service - MySQL Community ServerLoaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)Active: active (running) since Sat 2023-10-14 17:00:38 CST; 11s agoProcess: 1696 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)Main PID: 1704 (mysqld)Status: "Server is operational"Tasks: 38 (limit: 1102)Memory: 394.9MCPU: 1.120sCGroup: /system.slice/mysql.service└─1704 /usr/sbin/mysqldOct 14 17:00:37 mysql-vm systemd[1]: Starting MySQL Community Server...
Oct 14 17:00:38 mysql-vm systemd[1]: Started MySQL Community Server.
root@mysql-vm:/etc/mysql/mysql.conf.d#
4.查看设置结果

参数设置:

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

文件系统

root@mysql-vm:/var/lib/mysql#  ls -lh ibdata*
-rw-r----- 1 mysql mysql 12M Oct 14 17:00 ibdata1
-rw-r----- 1 mysql mysql 24M Oct 14 17:00 ibdata2
root@mysql-vm:/var/lib/mysql#

减小系统表空间的大小

目前MySQL并不支持直接减小现有系统表空间的大小。
减小系统表空间的唯一方法是创建的新MySQL实例,然后将数据从备份恢复到使用所需系统表空间大小。

为了避免过大的系统表空间,考虑使用单独表空间(file-per-table tablespaces)或一般表空间(general tablespaces)来存储数据。

※注:8.0版本中,创建InnoDB表时会默认使用单独表空间(file-per-table tablespaces)类型(innodb_file_per_table参数控制)。
与系统表空间不同,单独表空间(file-per-table tablespaces)在执行truncated或者 dropped时会将磁盘空间返回给操作系统。

例题

Choose two.
Which two are contained in the InnoDB system tablespace (ibdata1) by default?A) doublewrite buffer
B) change buffer
C) InnoDB Data Dictionary
D) primary indexes
E) table data
F) user privileges答案 AB

参考

15.6.3 Tablespaces
https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html

https://dev.mysql.com/doc/refman/8.0/en/innodb-init-startup-configuration.html#innodb-startup-data-file-configuration

https://segmentfault.com/q/1010000039941468?utm_source=sf-similar-question
https://wenku.baidu.com/view/8e6b63fca2c7aa00b52acfc789eb172ded639919.html?fr=sogou&wkts=1694952489836

这篇关于MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点6:InnoDB Tablespaces之系统表空间(System Tablespace)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/235173

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分