本文介绍如何将已归档到 OSS 的PolarDB MySQL版冷数据导回PolarDB存储空间,恢复为 InnoDB 引擎的热数据。
适用场景
需要修改已归档的冷数据(OSS 冷存表为只读,修改前必须先导回)。
冷数据重新变为热数据,需要恢复在线查询性能。
数据审计或合规要求需要将冷数据重新纳入PolarDB存储空间管理。
导回前检查
在执行导回操作前,请完成以下检查:
确认表结构和分区定义:执行
SHOW CREATE TABLE,确认当前存储引擎和完整的分区定义。记录分区属性:记录目标分区的名称、
VALUES LESS THAN边界、字符集及其他分区属性。评估资源影响:评估待导回数据量和PolarDB存储可用空间,建议选择业务低峰期执行。
检查 DLM 策略:如果仍满足归档条件,导回后的数据可能再次被自动归档。如有需要,请先调整 DLM 策略。
确认影响范围:展示准确的 SQL、导回范围和资源影响,确认无误后再执行。
资源影响说明:导回是从 OSS 向PolarDB存储空间的数据搬迁。执行期间会消耗 OSS 读取、网络、CPU、IO 和 PolarDB存储空间,DDL 提交阶段还可能短暂等待或持有元数据锁(MDL)。
导回普通表(非分区表)
将非分区冷存表导回为PolarDB存储空间的InnoDB引擎:
ALTER TABLE <table_name> ENGINE = InnoDB;该操作支持Online。执行期间请持续观察会话状态、实例负载、PolarDB空间和错误日志,不要并发对同一张表执行其他 DDL。
ALTER TABLE ... ENGINE = InnoDB 不能用于分区表的整表导回。分区表需要按原分区定义,使用下文的 REORGANIZE PARTITION 逐个导回冷分区。
导回分区表
导回指定分区
通过 REORGANIZE PARTITION 使用原分区名称和原边界重建目标分区:
ALTER TABLE <table_name>
REORGANIZE PARTITION <partition_name> INTO (
PARTITION <partition_name> VALUES LESS THAN ('xxxx-xx-xx')
);当表的默认引擎为 InnoDB 时,省略分区级 ENGINE 会按 InnoDB 重建。为避免依赖默认值,推荐显式指定目标引擎:
ALTER TABLE <table_name>
REORGANIZE PARTITION <partition_name> INTO (
PARTITION <partition_name> VALUES LESS THAN ('xxxx-xx-xx') ENGINE = InnoDB
);分区边界注意事项
必须将
'xxxx-xx-xx'替换为SHOW CREATE TABLE中该分区原有的精确边界,不能根据数据内容猜测边界。对于数值、日期时间、
MAXVALUE、多列RANGE COLUMNS或带子分区的表,必须完整保留原定义中对应的类型、值、顺序和子分区结构。只导回目标分区,不要把相邻分区一起写入
REORGANIZE PARTITION,一次只能导回一个分区。
导回分区表中的全部冷分区
不能使用 ALTER TABLE ... ENGINE = InnoDB 一次性导回整个分区表。正确做法如下:
从
SHOW CREATE TABLE获取全部冷分区的原始定义。按分区边界逐个执行
REORGANIZE PARTITION。每完成一个分区都应验证引擎、数据和实例负载后再继续下一个。
导回后验证
确认表和分区定义:
SHOW CREATE TABLE <table_name>;检查分区引擎:
SELECT PARTITION_NAME, ENGINE, TABLE_ROWS FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = '<db_name>' AND TABLE_NAME = '<table_name>' ORDER BY PARTITION_ORDINAL_POSITION;
异常处理
资源不足或 DDL 报错:PolarDB存储空间不足、OSS 读取异常、DDL 报错或负载超出预期时,停止新增导回任务并保留当前会话与错误日志。
不要删除 OSS 文件:不要通过删除 OSS 文件来处理导回失败,失败对象仍可能依赖原冷存数据。
不要盲目重试:不要重试修改过分区边界的 SQL。先重新获取
SHOW CREATE TABLE,确认当前元数据状态。重新归档:导回完成后如需重新归档,应单独走归档流程,不能把删除文件当作回滚。