如何实现分区表不锁表转冷存

通过SQL语句ALTER TABLE tablename_part1 SET TABLESPACE oss将子分区表转冷存时,整个父分区表将被锁定,即在转存过程中无法对分区表进行读写操作。如果子分区表的数据量较大,转存所需的时间可能较长,长时间的锁表将对业务产生影响。为了解决此类问题,您可以通过DETACHATTACH的方式,实现子分区表在不锁表的情况下进行转冷存操作。

注意事项

  • 当前方案仅适用于分区表中的子分区表转冷存场景,不适用于父分区表或非分区表。

  • 仅支持范围分区,不支持列表分区以及HASH分区。

  • 分区表上未创建全局索引

  • 转存过程中,仅对子分区表进行锁定,业务上需确保对该子分区表没有读写请求。转存完成后,可以正常进行读写操作。

操作步骤

此处以sales表为例,假设sales是一张按年分区的表。

  1. 先将sales_2024子分区卸载。

    ALTER TABLE sales DETACH PARTITION sales_2024;
  2. 卸载分区后,执行转冷存操作。在转存过程中,仅对sales_2024表本身进行锁定,父表及其他分区不受影响。

    ALTER TABLE sales_2024 SET TABLESPACE OSS;
  3. 转存完成后,将子分区重新挂载到父表。

    ALTER TABLE sales ATTACH PARTITION sales_2024 FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
  4. 挂载分区后,子分区表即可通过父表进行正常的读写访问。