本文介绍不锁表转冷存的最佳实践。
场景描述
通过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
文档内容是否对您有帮助?