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查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七