pg_pathman是一个很好的分区表的插件,建议PostgreSQL11及以下的版本数据库尽量用这个插件:
Yum安装
[root@ztt-test-pg pg_pathman-1.5.3]# yum install pg_pathman11.x86_64
更改postgresql.conf的配置文件
[root@ztt-test-pg pg_pathman-1.5.3]# vi /home/postgres/pgdata/postgresql.conf
将shared_preload_libraries注释取消,将下面变量赋值进去
shared_preload_libraries = ‘pg_pathman ‘
重启pg
[root@ztt-test-pg pg_pathman-1.5.3]# su - postgres
[postgres@ztt-test-pg ~]$ pg_ctl restart
配置扩展
[postgres@ztt-test-pg ~]$ psql
psql (11.3)
Type "help" for help.
postgres=# create extension pg_pathman ;
CREATE EXTENSION
查看已安装的扩展
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
------------+---------+------------+----------------------------------
pg_pathman | 1.5 | public | Partitioning tool for PostgreSQL
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
创建测试表
postgres=# create table tbl_test (id int, info text, c_time timestamp);
CREATE TABLE
插入测试数据
postgres=# insert into tbl_test select generate_series(1,100000),md5(random()::text),clock_timestamp();
INSERT 0 100000
postgres=# select count(id) from tbl_test;
count
--------
100000
范围分区
create_range_partitions(relation REGCLASS, — 主表OID
attribute TEXT, — 分区列名
start_value ANYELEMENT, — 开始值
p_interval ANYELEMENT, — 间隔;任意类型,适合任意类型的分区表
p_count INTEGER DEFAULT NULL, — 分多少个区
partition_data BOOLEAN DEFAULT TRUE) — 是否立即将数据从主表迁移到分区
postgres=# select
create_range_partitions('tbl_test'::regclass,'c_time','2019-05-28 00:00:00'::timestamp,interval '1 month',50,false) ;
create_range_partitions
-------------------------
50
(1 row)
注意:
分区列必须有not null约束
分区个数必须能覆盖已有的所有记录
使用非堵塞式的迁移接口
partition_table_concurrently(relation REGCLASS, — 主表OID
batch_size INTEGER DEFAULT 1000, — 一个事务批量迁移多少记录
sleep_time FLOAT8 DEFAULT 1.0) — 获得行锁失败时,休眠多久再次获取,重试60次退出任务
postgres=# select partition_table_concurrently('tbl_test'::regclass,10000,1.0);
仅仅存在主表的数据
postgres=# select count(*) from only tbl_test;
count
-------
0
(1 row)
明显全部迁移走了
查看分区表
postgres=# select * from pathman_partition_list ;
parent | partition | parttype | expr | range_min | range_max
----------+-------------+----------+--------+---------------------+---------------------
tbl_test | tbl_test_1 | 2 | c_time | 2019-05-28 00:00:00 | 2019-06-28 00:00:00
tbl_test | tbl_test_2 | 2 | c_time | 2019-06-28 00:00:00 | 2019-07-28 00:00:00
tbl_test | tbl_test_3 | 2 | c_time | 2019-07-28 00:00:00 | 2019-08-28 00:00:00
tbl_test | tbl_test_4 | 2 | c_time | 2019-08-28 00:00:00 | 2019-09-28 00:00:00
Hash分区
创建分区并迁移
postgres=# SELECT create_hash_partitions('tbl_test', 'id', 100);
create_hash_partitions
------------------------
100
(1 row)