Percona Server 5.7交换分区后导入表空间失败求助
问题:InnoDB导入表空间时服务器崩溃,重启后数据正常的原因排查
环境信息
- 源服务器(srcsrv):存在一个包含数百个分区的大表
srcdb.partitioned_table1 - 目标服务器(dstsrv):需创建非分区表
db1.table1,用于接收源服务器指定分区的数据
操作流程
源服务器(srcsrv)操作步骤
- 执行SQL:
create database db1; - 执行SQL:
use db1; - 执行SQL:
create table table1(通过执行/tmp/table1.sql脚本,创建与srcdb.partitioned_table1结构一致的非分区表) - 执行SQL:
alter table srcdb.partitioned_table1 exchange partition p_XXX with table db1.table1 without validation; - 执行SQL:
flush tables db1.table1 for export; - 执行Linux命令:
cp /var/lib/mysql/db1/table1.ibd /tmp/; - 执行SQL:
unlock tables; - 执行SQL:
alter table srcdb.partitioned_table1 exchange partition p_XXX with table db1.table1 without validation;
操作完成后,所有数据回到
srcdb.partitioned_table1,db1.table1恢复为空
目标服务器(dstsrv)操作步骤
- 执行SQL:
create database db1; - 执行SQL:
use db1; - 执行SQL:
create table table1(通过执行/tmp/table1.sql脚本,创建与源端完全一致的非分区表结构) - 执行SQL:
alter table db1.table1 discard tablespace; - 执行Linux命令:
cp /tmp/table1.ibd /var/lib/mysql/db1/table1.ibd; - 执行SQL:
alter table db1.table1 import tablespace;
报错现象
执行目标服务器第6步时,MySQL服务器崩溃并抛出错误:
[ERROR] InnoDB: Trying to access page number XXX in space XXX , space name db1/table1, which is outside the tablespace bounds. Byte offset 0, len 8192, i/o type read. If you get this error at mysqld startup, please check that your my.cnf matches the ibdata files that you have in the MySQL server.
重启目标服务器MySQL(sudo systemctl start mysqld)后,db1.table1状态正常,数据已成功导入。
另外,如果从源服务器同时拷贝table1.cfg文件用于导入,则整个过程无任何报错。
疑问
根据官方文档说明,导入表空间过程无需.cfg文件,且我确认操作中的表结构元数据完全一致,想请教该报错的原因及解决思路?
内容的提问来源于stack exchange,提问作者Evgeny
相关产品推荐
相关产品推荐

