Print

【MVS】MySQL是discard/import tablespace能否使用在统一表空间中

2024-08-21 发表

问题描述

MySQL是discard/import tablespace能否使用在统一表空间中

解决方法

DISCARD TABLESPACE 和 IMPORT TABLESPACE 对于独立表空间(每个表都有自己的 .ibd 文件)特别有用,但当使用统一表空间(称为共享表空间,顾名思义,共享表空间中所有表的数据存储在共享的表空间文件中)时,这两个命令的适用性会有所不同。

独立表空间 vs. 统一表空间

独立表空间 (innodb_file_per_table=ON):

  • 每个表拥有自己的 .ibd 文件。
  • 在这种情况下,可以使用 DISCARD TABLESPACE 和 IMPORT TABLESPACE 操作来手动管理 .ibd 文件。

统一表空间 (innodb_file_per_table=OFF):

  • 所有表的数据存储在全局共享的系统表空间文件中(通常是 ibdata1 等文件)。
  • 在这种情况下,这两个命令的使用受到限制,因为表数据并没有独立的表空间文件可以操作。

操作流程在独立表空间中的应用

在启用了独立表空间的情况下,通过 innodb_file_per_table 设置,每个 InnoDB 表会有独立的 .ibd 文件,以下是 DISCARD TABLESPACE 和 IMPORT TABLESPACE 的用途和操作流程:

步骤示例

  1. 在原始服务器上 DISCARD TABLESPACE

    复制
    ALTER TABLE world.city DISCARD TABLESPACE;
  2. 复制 .ibd 文件
    将 world.city 表的 .ibd 文件从原始服务器复制到目标服务器的相应目录中。

  3. 在目标服务器上 IMPORT TABLESPACE

    复制
    ALTER TABLE world.city IMPORT TABLESPACE;

注意事项

  • DISCARD TABLESPACE 将会删除该表在 MySQL 数据库和文件系统上的所有内容,但会保留表定义(.frm 文件)。
  • 这个操作前需要备份数据,因为在操作期间表的数据将不可访问。

在统一表空间中的适用性

对于统一表空间情况(即 innodb_file_per_table=OFF),由于所有表的数据都存储在共享的表空间文件中,DISCARD TABLESPACE 和 IMPORT TABLESPACE 通常不适用。例如,假设你没有启用独立表空间,以下操作将不能正常工作:

复制
ALTER TABLE world.city DISCARD TABLESPACE; ALTER TABLE world.city IMPORT TABLESPACE;

这些命令依赖于独立 .ibd 文件的存在。如果 innodb_file_per_table 设置为 OFF,InnoDB 报错指出无法找到表的独立表空间文件。

结论

  1. 独立表空间innodb_file_per_table=ON):可以使用 DISCARD TABLESPACE 和 IMPORT TABLESPACE 来管理和迁移单个表的表空间文件。
  2. 统一表空间innodb_file_per_table=OFF):DISCARD TABLESPACE 和 IMPORT TABLESPACE 不适用,因为所有表的数据都在共享的表空间文件中。