PostgreSQL改造非分区表为分区表
novel开发重建visit表;没考虑之前的visit表是分区表;过了几天;平台数据迟迟未出。visit表一天大概3-4G的量级。
1、获取非分区表的大小,以及最开始的数据
这个好确定分区从那个时间开始
--获取大小
select pg_size_pretty(pg_relation_size('tbl_novel_visit_new_log'));
--获取第一条数据
select * from tbl_novel_visit_new_log limit 1;
2、创建分区
每个分区包含1天的跨度数据;且不迁移数据
select
create_range_partitions('tbl_novel_visit_new_log'::regclass,
'reg_time',
'2020-11-01 00:00:00'::timestamp,
interval '1 day',
30,
false) ;
3、迁移数据
这个过程是漫长;可以采用非阻塞迁移
select partition_table_concurrently('tbl_novel_visit_new_log'::regclass,
10000,
1.0);
查看进度
select * from pathman_concurrent_part_tasks;
4、 查询禁用主表
数据迁移完成后,禁用主表
select set_enable_parent('tbl_novel_visit_new_log'::regclass, false);
5、新建append_partition脚本示例
# 功能:1. 处理PostgreSQL分区表增加分区;2. 将时间最早的分区数据导出;保持数据库大小的平稳。
source /home/postgres/.bashrc
unload_dir=/data1/novel/p_visit/
unload_date=`date +%Y%m%d`
cd $unload_dir
if [ ! -d "$unload_date" ];then
mkdir $unload_date
fi
cd $unload_date
psql -At -p 15432 adsas adsas -c 'select * from pathman_partition_list order by range_min limit 1' > pg_unload_conf
table_name=`awk -F"|" '{print $2}' pg_unload_conf`
echo "copy adsas.$table_name to '${unload_dir}${unload_date}/${table_name}' DELIMITER '|'" > pg_unload.sql
# unload data
psql -p 15432 adsas postgres -f pg_unload.sql
# 删除分区
echo "select drop_range_partition('${table_name}',true)" > drop_partition.sql
psql -p 15432 adsas adsas -f drop_partition.sql
# 添加分区
echo "select append_range_partition('tbl_novel_visit_log'::regclass)" > add_parition.sql
psql -p 15432 adsas adsas -f add_parition.sql