如何实现不锁表转冷存

本文介绍不锁表转冷存的最佳实践。

场景描述

通过ALTER TABLE tblname SET TABLESPACE oss转冷存会将表锁住,即转存过程中无法对表进行读写操作,如果表数据量比较大,转存的时间会比较久,长时间锁表可能会影响业务。为了解决这类问题,PolarDB PostgreSQL版(兼容Oracle)提供了一种不锁表转冷存的途径,本文介绍操作方法。

创建扩展

CREATE EXTENSION IF NOT EXISTS pg_repack;

操作步骤

PolarDB PostgreSQL版(兼容Oracle)数据库提供的pg_repack插件可以实现在不持有大锁的情况下在线将数据转为冷存,这样可以大幅度降低数据迁移对在线业务的影响。

pg_repack以安装在PolarDB PostgreSQL版(兼容Oracle)侧的插件作为服务端,并提供专用的客户端给用户,两者需要搭配使用。具体用法参考pg_repack

普通表不锁表转冷存

-- tblname为普通表,包含三个索引tblname_partial_idx、tblname_pkey、tblname_with_idx

-- 通过pg_repack将tblname转存到oss(不包含索引)
pg_repack -U user1 --dbname=db01 --table=tblname --tablespace=oss

-- 通过pg_repack将tblname及其索引转存到oss
pg_repack -U user1 --dbname=db01 --table=tblname --tablespace=oss --moveidx

-- 通过pg_repack 将tblname表的所有索引转存到oss
pg_repack -U user1 --dbname=db01 --table=tblname --tablespace=oss --only-indexes

-- 通过pg_repack只将索引oss1_partial_idx转存到oss
pg_repack -U user1 --dbname=db01 --index=tblname_partial_idx --tablespace=oss

分区表不锁表转冷存

-- prt是一个分区表,包含4个分区:prt_p_0、prt_p_1、prt_p_2、prt_p_def(默认分区)

-- 通过pg_repack将分区表转存到oss(不包含索引)
pg_repack -U user1 --dbname=db01 --parent-table=prt --tablespace=oss

-- 通过pg_repack将分区表所有子分区及其索引转存到oss
pg_repack -U user1 --dbname=db01 --parent-table=prt --tablespace=oss --moveidx

-- 通过pg_repack将分区表中的子分区转存到oss
pg_repack -U user1 --dbname=db01 --table=prt_p_0 --table=prt_p_1 --tablespace=oss

-- 通过pg_repack指定索引到oss
pg_repack -U user1 --dbname=db01 --index=prt_p_0_a_idx  --tablespace=oss