MySQL 8.0 表空间机制

墨墨导读:数据是以表空间来维护和存放的。在表空间中包含数据,结构,索引等信息,如何有效使用表空间对于MySQL来说非常重要。

数据库的表空间是用来存储数据的逻辑空间,也是存储数据的最大逻辑单元,其下还有段、区、页等逻辑数据类型。表空间设计是为了提升更高的IO,不同处理数据的解耦,便于管理。

通过表空间来实现对数据文件的灵活控制。目前MySQL8.0 版本Tablespaces,从原有的共享表空间,数据表空间分成如下5中表空间:

  • System tablespace

  • File-per-table tablespaces

  • General tablespaces

  • Undo Tablespace

  • Temporary Tablespaces

下面逐步了解一下。

1. System tablespace

系统表空间:到目前为止的8.0.23保留下来的就是change buffer的存储区域。如果表在系统表空间创建的,而不是在file-per-table或General表空间中创建的,那么它还包含表和索引数据。之前版本中,系统表空间包含InnoDB数据字典。还包含doublewrite缓冲区存储区域。从MySQL 8.0.20开始 分离出来生成单独的doublewrite文件。

innodb_data_home_dir =/opt/data8.0/dbdata 
innodb_data_file_path = ibdata1:16M;ibdata2:16M:autoextend

备注:autoextend属性只能在innodb_data_file_path设置的最后一个数据文件中指定,对于系统表空间现有系统表空间的大小减少是不支持的。要实现更小的系统表空间,唯一的选择是将数据从备份恢复。Mysql里删除数据是不释放空间的。

所以之前版本的系统表空间是非常大的。为了避免使用大的系统表空间,可使用每个表文件的表空间。File-per-table表空间是默认的表空间类型,在创建InnoDB表时隐式使用。与系统表空间不同,在截断或删除在每个表文件表空间中创建的表之后,磁盘空间返回给操作系统。

2. File-per-table tablespaces

独立表空间包含单个InnoDB表的数据和索引,并存储在文件系统中自己的数据文件中。

#my.cnf配置
[mysqld]
innodb_file_per_table=ON


#命令行方式
mysql> SET GLOBAL innodb_file_per_table=ON;


mysql>CREATE TABLE city(
    ID  int
)ENGINE=Innodb TABLESPACE=innodb_file_per_table;

独立表空间优势:

  • truncate或drop在table操作,磁盘空间返回给操作系统。但共享表空间不会释放,只能用于InnoDB数据。换句话说,共享表空间数据文件的大小不会缩小。

  • 在共享表空间中的表上执行表复制ALTER TABLE操作因为table-copying动作,会增加表空间所占用的磁盘空间增加。

  • 独立表空间执行TRUNCATE表时,性能更好。

  • 独立表空间数据文件可以在不同的存储设备上创建,用于I/O优化、空间管理或备份。

  • 通过DISCARD/IMPORT TABLESPACE 方式迁移独立表空间
    https://dev.mysql.com/doc/refman/8.0/en/innodb-table-import.html

  • 独立表空间中创建的表支持与动态和压缩行格式相关的特性,而系统表空间不支持这些特性。

  • 存储在独立表空间数据文件中的表可以节省时间,当数据损坏发生时,当备份或二进制日志不可用时,或者当MySQL服务器实例不能重新启动时,成功恢复的机会会增加。独立表空间数据可以通过第三方工具进行分析和数据的抽取。还可以通过单独恢复独立表空间。

  • 每个表文件表空间,允许通过监视表空间数据文件的大小来监视表大小。

  • 当innodb_flush_method设置为O_DIRECT时,普通的Linux文件系统不允许对单个文件(如共享表空间数据文件)进行并发写操作。因此,当结合

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要恢复 MySQL 8.0表空间,你可以按照以下步骤进行操作: 1. 停止 MySQL 服务器:使用适当的方式停止 MySQL 服务器,确保在进行任何操作之前数据库处于离线状态。 2. 备份原始表空间:在进行任何更改之前,强烈建议备份原始表空间文件。这样,即使操作出现问题,你也可以还原到先前的状态。 3. 删除或移动损坏的表空间:如果你已经确定哪个表空间损坏或丢失,可以删除或移动它。你可以使用以下两种方法之一来完成此操作: - 使用 DROP TABLESPACE 命令删除表空间。例如:`DROP TABLESPACE your_tablespace;` - 使用 ALTER TABLE ... REMOVE PARTITIONING 命令移除分区,并将数据从损坏的表空间转移到其他有效的表空间。例如:`ALTER TABLE your_table REMOVE PARTITIONING;` 4. 创建新的表空间:使用 CREATE TABLESPACE 命令创建一个新的表空间。指定正确的数据文件路径和名称。例如:`CREATE TABLESPACE your_tablespace ADD DATAFILE 'path/to/your_tablespace.ibd';` 5. 将表移回新的表空间:使用 ALTER TABLE ... TABLESPACE 命令将表移回新的表空间。例如:`ALTER TABLE your_table TABLESPACE your_tablespace;` 6. 启动 MySQL 服务器:启动 MySQL 服务器,并确保能够正常访问恢复的表空间和数据。 请注意,这些步骤仅适用于恢复表空间而不是整个数据库。如果你需要恢复整个数据库,请参考 MySQL 官方文档或与专业数据库管理员联系以获取更多帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值