10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 41.5 mb
PDF (A4)- 41.6 mb
手册页(TGZ)- 262.2 kb
手册页(Zip)- 372.3 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

15.6.1.3导入InnoDB表

方法导入表移动式表空间特性,该特性允许导入表、分区表或位于“逐表文件”表空间中的单个表分区。导入表的原因有很多:

  • 在非生产MySQL服务器实例上运行报告,以避免在生产服务器上放置额外的负载。

  • 将数据复制到新的复制服务器。

  • 从备份的表空间文件恢复表。

  • 作为一种比导入转储文件更快的移动数据的方式,导入转储文件需要重新插入数据和重建索引。

  • 将数据移动到具有更适合您的存储需求的存储介质的服务器。例如,您可能会将繁忙的表移动到SSD设备,或将大型表移动到高容量的HDD设备。

移动式表空间本节将从以下主题介绍特性。

先决条件
  • innodb_file_per_table变量必须启用,默认为启用。

  • 表空间的页大小必须与目标MySQL服务器实例的页大小相匹配。InnoDB页面大小由innodb_page_size变量,在初始化MySQL服务器实例时配置。

  • 如果表有外键关系,foreign_key_checks执行前必须禁用丢弃表空间。此外,您应该在相同的逻辑时间点导出所有与外键相关的表,如修改表…导入表空间不对导入的数据强制外键约束。为此,停止更新相关的表,提交所有事务,获取表上的共享锁,并执行导出操作。

  • 当从另一个MySQL服务器实例导入表时,两个MySQL服务器实例必须具有通用可用性(GA)状态,并且必须是相同的版本。否则,必须在将表导入的同一个MySQL服务器实例上创建该表。

  • 属性在外部目录中创建表数据目录条款创建表语句,则在目标实例上替换的表必须使用相同的语句定义数据目录条款。如果子句不匹配,则报告模式不匹配错误。来确定源表是否使用数据目录条款,使用显示创建表命令,查看表定义。的信息数据目录条款,请参阅15.6.1.2节,“从外部创建表”

  • 如果一个ROW_FORMAT选项在表定义或中没有显式定义ROW_FORMAT =违约使用时,innodb_default_row_format源实例和目标实例上的设置必须相同。否则,在尝试导入操作时将报告模式不匹配错误。使用显示创建表检查表定义。使用显示变量要检查innodb_default_row_format设置。相关信息请参见定义表的行格式

导入表

这个例子演示了如何导入一个常规的非分区表,这个表驻留在一个文件-表空间中。

  1. 在目标实例上,创建一个与打算导入的表定义相同的表。(您可以使用显示创建表语法)。如果表定义不匹配,则在尝试导入操作时报告模式不匹配错误。

    mysql>使用测试;CREATE TABLE t1 (c1 INT) =INNODB;
  2. 在目标实例上,丢弃刚刚创建的表的表空间。(导入前,必须丢弃接收表的表空间。)

    删除表空间
  3. 在源实例上运行抽水马桶…用于出口使要导入的表静默。当一个表处于静默状态时,该表上只允许只读事务。

    mysql>使用测试;mysql> FLUSH TABLES t1 FOR EXPORT

    抽水马桶…用于出口确保对已命名表的更改被刷新到磁盘,以便在服务器运行时可以复制二进制表。当抽水马桶…用于出口运行时,InnoDB生成一个. cfg表的模式目录下的元数据文件。的. cfg文件包含导入操作期间用于模式验证的元数据。

  4. 复制.ibd文件和. cfg从源实例到目标实例的元数据文件。例如:

    壳> scp/ / datadir /路径/测试/ t1。{ibd, cfg}目标服务器:/ / datadir /路径/测试

    .ibd文件和. cfg在释放共享锁之前,必须复制文件,如下一步所述。

    请注意

    如果从加密的表空间导入表,InnoDB生成一个.cfp文件除了一个. cfg元数据文件。的.cfp文件必须与. cfg文件。的.cfp文件包含传输密钥和加密的表空间密钥。进口,InnoDB使用转移密钥解密表空间密钥。相关信息请参见第15.13节“InnoDB静态数据加密”

  5. 在源实例上,使用打开表方法获取的锁抽水马桶…用于出口声明:

    mysql>使用测试;mysql>解锁表
  6. 在目标实例中,导入表空间:

    mysql>使用测试;导入表空间
导入分区表

这个例子演示了如何导入一个分区表,其中每个表分区都位于一个文件-每个表的表空间中。

  1. 在目标实例上,创建一个分区表,其定义与要导入的分区表相同。(您可以使用显示创建表语法)。如果表定义不匹配,则在尝试导入操作时报告模式不匹配错误。

    mysql>使用测试;mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION

    /datadir/测试目录中,有一个表空间.ibd文件的三个分区。

    mysql > \ !ls/ / datadir /路径/测试/ t1 # # p0 p。ibd t1 # # p1.ibd pt1#p#p2.ibd
  2. 在目标实例上,丢弃已分区表的表空间。(导入操作前,必须先丢弃接收表的表空间。)

    删除表空间

    三个表空间.ibd分区表中的文件将从/datadir/测试目录中。

  3. 在源实例上运行抽水马桶…用于出口使要导入的分区表处于静默状态。当一个表处于静默状态时,该表上只允许只读事务。

    mysql>使用测试;mysql> FLUSH TABLES t1 FOR EXPORT

    抽水马桶…用于出口确保对已命名表的更改被刷新到磁盘,以便在服务器运行时可以复制二进制表。当抽水马桶…用于出口运行时,InnoDB生成. cfg表的模式目录中的元数据文件用于表的每个表空间文件。

    mysql > \ !ls/ / datadir /路径/测试/ t1 # # p0 p。ibd t1 # # p1.ibd pt1#p#p2.ibd t1#p#p0.cfg t1#p#p1.cfg t1#p#p2.cfg

    . cfg文件包含导入表空间时用于模式验证的元数据。抽水马桶…用于出口只能在表上运行,不能在各个表分区上运行。

  4. 复制.ibd而且. cfg从源实例架构目录到目标实例架构目录的文件。例如:

    壳> scp/ / datadir /路径/测试/ t1 *。{ibd, cfg}目标服务器:/ / datadir /路径/测试

    .ibd而且. cfg在释放共享锁之前,必须复制文件,如下一步所述。

    请注意

    如果从加密的表空间导入表,InnoDB生成一个.cfp文件除了一个. cfg元数据文件。的.cfp的文件必须复制到目标实例. cfg文件。的.cfp文件包含一个传输密钥和一个加密的表空间密钥。进口,InnoDB使用转移密钥解密表空间密钥。相关信息请参见第15.13节“InnoDB静态数据加密”

  5. 在源实例上,使用打开表释放所获得的锁抽水马桶…用于出口

    mysql>使用测试;mysql>解锁表
  6. 在目标实例中,导入已分区表的表空间:

    mysql>使用测试;导入表空间
导入表分区

这个例子演示了如何导入单独的表分区,其中每个分区位于一个文件-每个表的表空间文件中。

在下面的示例中,有两个分区(p2而且p3)的四个分区表。

  1. 在目标实例上,创建一个分区表,其定义与希望从中导入分区的分区表相同。(您可以使用显示创建表语法)。如果表定义不匹配,则在尝试导入操作时报告模式不匹配错误。

    mysql>使用测试;mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION

    /datadir/测试目录中,有一个表空间.ibd文件中的四个分区。

    mysql > \ !ls/ / datadir /路径/测试/ t1 # # p0 p。ibd t1 # # p1.ibd pt1#p#p2.ibd t1#p#p3.ibd
  2. 在目标实例上,丢弃打算从源实例导入的分区。(在导入分区之前,必须从接收分区表中丢弃相应的分区。)

    删除分区p2和p3表空间

    表空间.ibd中的两个废弃分区的文件将被删除/datadir/测试目录在目标实例,留下以下文件:

    mysql > \ !ls/ / datadir /路径/测试/ t1 # # p0 p。ibd t1 # # p1.ibd p
    请注意

    修改表…丢弃分区…表空间在子分区表上运行时,允许使用分区和子分区表名。当指定分区名称时,该分区的子分区将包含在操作中。

  3. 在源实例上运行抽水马桶…用于出口暂停分区表。当一个表处于静默状态时,该表上只允许只读事务。

    mysql>使用测试;mysql> FLUSH TABLES t1 FOR EXPORT

    抽水马桶…用于出口确保对已命名表的更改被刷新到磁盘,以便在实例运行时可以复制二进制表。当抽水马桶…用于出口运行时,InnoDB生成一个. cfg表的模式目录中每个表的表空间文件的元数据文件。

    mysql > \ !ls/ / datadir /路径/测试/ t1 # # p0 p。ibd t1 # # p1.ibd pt1#p#p2.ibd t1#p#p3.ibd t1#p#p0.cfg t1#p#p1.cfg t1#p#p2.cfg t1#p#p3.cfg

    . cfg文件包含导入操作期间用于模式验证的元数据。抽水马桶…用于出口只能在表上运行,不能在各个表分区上运行。

  4. 复制.ibd而且. cfg用于分区的文件p2和分区p3从源实例架构目录到目标实例架构目录。

    Shell > SCP t1#p#p2。ibd t1 # # p2 p。cfg t1#p#p3.ibd t1#p#p3.cfg destination-server:/ / datadir /路径/测试

    .ibd而且. cfg在释放共享锁之前,必须复制文件,如下一步所述。

    请注意

    如果从加密表空间导入分区,InnoDB生成一个.cfp文件除了一个. cfg元数据文件。的.cfp的文件必须复制到目标实例. cfg文件。的.cfp文件包含一个传输密钥和一个加密的表空间密钥。进口,InnoDB使用转移密钥解密表空间密钥。相关信息请参见第15.13节“InnoDB静态数据加密”

  5. 在源实例上,使用打开表释放所获得的锁抽水马桶…用于出口

    mysql>使用测试;mysql>解锁表
  6. 在目标实例上,导入表分区p2而且p3

    mysql>使用测试;导入p2、p3表空间
    请注意

    修改表…导入分区…表空间在子分区表上运行时,允许使用分区和子分区表名。当指定分区名称时,该分区的子分区将包含在操作中。

限制
  • 移动式表空间该特性仅支持驻留在“逐表文件”表空间中的表。对于系统表空间或一般表空间中的表,不支持这种方法。共享表空间中的表不能被静默。

  • 抽水马桶…用于出口的表不支持全文索引,因为全文搜索辅助表不能被刷新。导入表后使用全文指数运行优化表重建全文索引。另外,下降全文在导出操作之前创建索引,并在导入目标实例上的表之后重新创建索引。

  • 由于. cfg导入分区表时,对于分区类型或分区定义差异,不会报告元数据文件限制、模式不匹配。报告列差异。

  • 在MySQL 8.0.19之前,索引键部分排序顺序信息不存储到. cfg导入表空间时使用的元数据文件。因此,索引键部分的排序顺序被假定为升序,这是默认的。因此,如果导入操作中涉及的一个表定义了DESC索引键部分排序顺序,而另一个表则不是,那么记录可能会以一种非预期的顺序进行排序。解决方法是删除并重新创建受影响的索引。有关索引键部分排序顺序的信息,请参见第13.1.15节,CREATE INDEX语句

    . cfg文件格式在MySQL 8.0.19更新,包括索引键部分排序顺序信息。上述问题不影响MySQL 8.0.19或更高服务器实例之间的导入操作。

使用笔记
  • 修改表…导入表空间不需要. cfg导入表的元数据文件。但是,在导入时不执行元数据检查. cfg文件,并发出类似如下的警告:

    InnoDB: IO Read error:(2, No such file or directory)错误打开'。\ test\t.cfg',将尝试在没有模式验证的情况下导入set (0.00 sec)

    导入一个没有. cfg只有在没有模式不匹配的情况下才应该考虑元数据文件。的导入功能. cfg文件在无法访问元数据的崩溃恢复场景中可能很有用。

  • 在Windows上,InnoDB在内部以小写形式存储数据库、表空间和表名。为了避免在区分大小写的操作系统(如Linux和Unix)上导入问题,请使用小写名称创建所有数据库、表空间和表。确保名称创建时使用小写字母的一个方便方法是setlower_case_table_names在初始化服务器之前,设置为1。禁止使用lower_case_table_names与服务器初始化时使用的设置不同的设置。)

    (mysqld) lower_case_table_names = 1
  • 运行时修改表…丢弃分区…表空间而且修改表…导入分区…表空间在子分区表上,分区表名和子分区表名都是允许的。当指定分区名称时,该分区的子分区将包含在操作中。

内部

以下信息描述在表导入过程中写入错误日志的内部信息和消息。

修改表…丢弃表空间在目标实例上运行:

  • 表在X模式下被锁定。

  • 表空间与表分离。

抽水马桶…用于出口在源实例上运行:

  • 要导出的表在共享模式下被锁定。

  • 清除协调器线程停止。

  • 脏页被同步到磁盘。

  • 表元数据被写入二进制文件. cfg文件。

此操作预期的错误日志消息:

[注]InnoDB:同步到“test”盘。“t1”开始。[注]InnoDB:正在停止清除[注]InnoDB:正在写入表元数据到'./test/t1.cfg'[注]InnoDB: table '"test"。“t1”'被刷新到磁盘

打开表在源实例上运行:

  • 二进制. cfg文件被删除。

  • 释放正在导入的表上的共享锁,并重新启动清除协调器线程。

此操作预期的错误日志消息:

[注]InnoDB:正在删除元数据文件'./test/t1.cfg'[注]InnoDB:正在恢复清除

修改表…导入表空间时,导入算法对每个被导入的表空间执行以下操作:

  • 检查每个表空间页是否损坏。

  • 刷新每个页面的空间号和日志序列号。

  • 为页眉验证标志并更新LSN。

  • 更新Btree页面。

  • 页面状态被设置为dirty,以便将其写入磁盘。

此操作预期的错误日志消息:

InnoDB:导入表'test/t1'的表空间host_name“[注]InnoDB:第一阶段-更新所有页面[注]InnoDB:同步到磁盘[注]InnoDB:同步到磁盘-完成!”[注]InnoDB: Phase III - Flush changes to disk[注]InnoDB: Phase IV - Flush complete
请注意

您可能还会收到一个警告,说一个表空间被丢弃了(如果您丢弃了目标表的表空间),以及一条消息,说明由于丢失了一个表空间,无法计算统计数据.ibd文件:

[警告]InnoDB: Table“test”。“t1”表空间设置为丢弃。7f34d9a37700 InnoDB不能计算test表的统计信息。“t1”,因为.ibd文件丢失。如需帮助,请登录//www.delbede.com/doc/refm10bet靠谱an/8.0/en/innodb-troubleshooting.html