方法导入表移动式表空间特性,该特性允许导入表、分区表或位于“逐表文件”表空间中的单个表分区。导入表的原因有很多:
在非生产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
设置。相关信息请参见定义表的行格式.
这个例子演示了如何导入一个常规的非分区表,这个表驻留在一个文件-表空间中。
在目标实例上,创建一个与打算导入的表定义相同的表。(您可以使用
显示创建表
语法)。如果表定义不匹配,则在尝试导入操作时报告模式不匹配错误。mysql>使用测试;CREATE TABLE t1 (c1 INT) =INNODB;
在目标实例上,丢弃刚刚创建的表的表空间。(导入前,必须丢弃接收表的表空间。)
删除表空间
在源实例上运行
抽水马桶…用于出口
使要导入的表静默。当一个表处于静默状态时,该表上只允许只读事务。mysql>使用测试;mysql> FLUSH TABLES t1 FOR EXPORT
抽水马桶…用于出口
确保对已命名表的更改被刷新到磁盘,以便在服务器运行时可以复制二进制表。当抽水马桶…用于出口
运行时,InnoDB
生成一个. cfg
表的模式目录下的元数据文件。的. cfg
文件包含导入操作期间用于模式验证的元数据。复制
.ibd
文件和. cfg
从源实例到目标实例的元数据文件。例如:壳> scp/ / datadir /路径/测试/ t1。{ibd, cfg}目标服务器:/ / datadir /路径/测试
的
.ibd
文件和. cfg
在释放共享锁之前,必须复制文件,如下一步所述。请注意如果从加密的表空间导入表,
InnoDB
生成一个.cfp
文件除了一个. cfg
元数据文件。的.cfp
文件必须与. cfg
文件。的.cfp
文件包含传输密钥和加密的表空间密钥。进口,InnoDB
使用转移密钥解密表空间密钥。相关信息请参见第15.13节“InnoDB静态数据加密”.mysql>使用测试;mysql>解锁表
在目标实例中,导入表空间:
mysql>使用测试;导入表空间
这个例子演示了如何导入一个分区表,其中每个表分区都位于一个文件-每个表的表空间中。
在目标实例上,创建一个分区表,其定义与要导入的分区表相同。(您可以使用
显示创建表
语法)。如果表定义不匹配,则在尝试导入操作时报告模式不匹配错误。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
在目标实例上,丢弃已分区表的表空间。(导入操作前,必须先丢弃接收表的表空间。)
删除表空间
三个表空间
.ibd
分区表中的文件将从/
目录中。datadir
/测试在源实例上运行
抽水马桶…用于出口
使要导入的分区表处于静默状态。当一个表处于静默状态时,该表上只允许只读事务。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
文件包含导入表空间时用于模式验证的元数据。抽水马桶…用于出口
只能在表上运行,不能在各个表分区上运行。复制
.ibd
而且. cfg
从源实例架构目录到目标实例架构目录的文件。例如:壳> scp/ / datadir /路径/测试/ t1 *。{ibd, cfg}目标服务器:/ / datadir /路径/测试
的
.ibd
而且. cfg
在释放共享锁之前,必须复制文件,如下一步所述。请注意如果从加密的表空间导入表,
InnoDB
生成一个.cfp
文件除了一个. cfg
元数据文件。的.cfp
的文件必须复制到目标实例. cfg
文件。的.cfp
文件包含一个传输密钥和一个加密的表空间密钥。进口,InnoDB
使用转移密钥解密表空间密钥。相关信息请参见第15.13节“InnoDB静态数据加密”.mysql>使用测试;mysql>解锁表
在目标实例中,导入已分区表的表空间:
mysql>使用测试;导入表空间
这个例子演示了如何导入单独的表分区,其中每个分区位于一个文件-每个表的表空间文件中。
在下面的示例中,有两个分区(p2
而且p3
)的四个分区表。
在目标实例上,创建一个分区表,其定义与希望从中导入分区的分区表相同。(您可以使用
显示创建表
语法)。如果表定义不匹配,则在尝试导入操作时报告模式不匹配错误。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
在目标实例上,丢弃打算从源实例导入的分区。(在导入分区之前,必须从接收分区表中丢弃相应的分区。)
删除分区p2和p3表空间
表空间
.ibd
中的两个废弃分区的文件将被删除/
目录在目标实例,留下以下文件:datadir
/测试mysql > \ !ls/ / datadir /路径/测试/ t1 # # p0 p。ibd t1 # # p1.ibd p
请注意当
修改表…丢弃分区…表空间
在子分区表上运行时,允许使用分区和子分区表名。当指定分区名称时,该分区的子分区将包含在操作中。在源实例上运行
抽水马桶…用于出口
暂停分区表。当一个表处于静默状态时,该表上只允许只读事务。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
文件包含导入操作期间用于模式验证的元数据。抽水马桶…用于出口
只能在表上运行,不能在各个表分区上运行。复制
.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静态数据加密”.mysql>使用测试;mysql>解锁表
在目标实例上,导入表分区
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