冷数据导回

更新时间:
复制 MD 格式

本文介绍如何将已归档到 OSS 的PolarDB MySQL冷数据导回PolarDB存储空间,恢复为 InnoDB 引擎的热数据。

适用场景

  • 需要修改已归档的冷数据(OSS 冷存表为只读,修改前必须先导回)。

  • 冷数据重新变为热数据,需要恢复在线查询性能。

  • 数据审计或合规要求需要将冷数据重新纳入PolarDB存储空间管理。

导回前检查

在执行导回操作前,请完成以下检查:

  1. 确认表结构和分区定义:执行 SHOW CREATE TABLE,确认当前存储引擎和完整的分区定义。

  2. 记录分区属性:记录目标分区的名称、VALUES LESS THAN 边界、字符集及其他分区属性。

  3. 评估资源影响:评估待导回数据量和PolarDB存储可用空间,建议选择业务低峰期执行。

  4. 检查 DLM 策略:如果仍满足归档条件,导回后的数据可能再次被自动归档。如有需要,请先调整 DLM 策略。

  5. 确认影响范围:展示准确的 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 一次性导回整个分区表。正确做法如下:

  1. SHOW CREATE TABLE 获取全部冷分区的原始定义。

  2. 按分区边界逐个执行 REORGANIZE PARTITION

  3. 每完成一个分区都应验证引擎、数据和实例负载后再继续下一个。

导回后验证

  1. 确认表和分区定义:

    SHOW CREATE TABLE <table_name>;
  2. 检查分区引擎:

    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,确认当前元数据状态。

  • 重新归档:导回完成后如需重新归档,应单独走归档流程,不能把删除文件当作回滚。