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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM