これは、PostgreSQL拡張機能のトピックに触れた以前のブログエントリの続きです。 PostgreSQL拡張機能は、PostgreSQLクラスターに追加の機能セットを追加する拡張機能のプラグアンドプレイセットです。これらの機能の中には、外部データベースの読み取りまたは書き込みと同じくらい簡単なものもあれば、データベースのレプリケーションや監視などを実装するための高度なソリューションになるものもあります。
PostgreSQLは、単純なオープンソースORDBMSから、信頼性、パフォーマンス、およびすべてのACID準拠機能を提供する30年以上の積極的な開発を備えた強力なデータベースシステムへと長年にわたって進化してきました。数か月前にリリースされたPostgreSQL12では、このデータベースソフトウェアはますます大きく、より良く、より速くなっています。
拡張機能は、時間の制約またはエッジケースデータベースの証拠が不十分なために開発されなかったため、ネイティブコードでは利用できなかった拡張機能を実現するためにPostgreSQLクラスターに追加する必要がある場合がありました。問題。開発者とDBAが使用するいくつかのデモを使用して、お気に入りの拡張機能のいくつかについて順不同で説明します。
これらの拡張機能の一部は、サーバーの起動時にプリロードされるコンマ区切りのリストとして、shared_preload_librariesサーバーパラメーターに含める必要がある場合があります。ほとんどの拡張機能はソースコードのcontribモジュールに含まれていますが、PostgreSQL拡張機能ネットワークと呼ばれるPostgreSQL拡張機能専用の外部Webサイトからダウンロードする必要がある拡張機能もあります。
この2部構成のブログシリーズでは、データへのアクセス(postgres_fwd)およびデータベースの縮小またはアーカイブ(pg_partman)に使用される拡張機能について説明します。追加の拡張機能については、第2部で説明します。
postgres_fdw
postgres_fdwは、外部PostgreSQLサーバーに保存されているデータにアクセスするために使用できる外部データラッパー拡張機能です。この拡張機能は、dblinkと呼ばれる古い拡張機能に似ていますが、標準に準拠した構文と優れたパフォーマンスを提供するという点で、以前の拡張機能とは異なります。
postgres_fdwの重要なコンポーネントは、サーバー、ユーザーマッピング、および外部テーブルです。リモートサーバーに対してクエリを実行する実際のコストに、通信オーバーヘッドであるわずかなオーバーヘッドが追加されます。 postgres_fdw拡張機能は、PostgreSQL 8.3までのバージョンを持つリモートサーバーと通信することもできるため、以前のバージョンとの下位互換性があります。
デモでは、PostgreSQL12からPostgreSQL11データベースへの接続を示します。 pg_hba.conf設定は、サーバーが相互に通信できるようにすでに構成されています。 PostgreSQLクラスター内から拡張機能を作成する前に、拡張機能制御ファイルをPostgreSQL共有ホームディレクトリにロードする必要があります。
リモートサーバー:
$ /usr/local/pgsql-11.3/bin/psql -p 5432 -d db_replica postgres
psql (11.3)
Type "help" for help.
db_replica=# create table t1 (sno integer, emp_id text);
CREATE TABLE
db_replica=# \dt t1
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | t1 | table | postgres
db_replica=# insert into t1 values (1, 'emp_one');
INSERT 0 1
db_replica=# select * from t1;
sno | emp_id
-----+---------
1 | emp_one
(1 row)
ソースサーバー:
$ /database/pgsql-12.0/bin/psql -p 5732 postgres
psql (12.0)
Type "help" for help.
postgres=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION
postgres=# CREATE SERVER remote_server
postgres-# FOREIGN DATA WRAPPER postgres_fdw
postgres-# OPTIONS (host '192.168.1.107', port '5432', dbname 'db_replica');
CREATE SERVER
postgres=# CREATE USER MAPPING FOR postgres
postgres-# SERVER remote_server
postgres-# OPTIONS (user 'postgres', password 'admin123');
CREATE USER MAPPING
postgres=# CREATE FOREIGN TABLE remote_t1
postgres-# (sno integer, emp_id text)
postgres-# server remote_server
postgres-# options (schema_name 'public', table_name 't1');
CREATE FOREIGN TABLE
postgres=# select * from remote_t1;
sno | emp_id
-----+---------
1 | emp_one
(1 row)
postgres=# insert into remote_t1 values (2,'emp_two');
INSERT 0 1
postgres=# select * from remote_t1;
sno | emp_id
-----+---------
1 | emp_one
2 | emp_two
(2 rows)
ソースサーバーからのWRITE操作は、リモートサーバーテーブルをすぐに反映します。 oracle_fdwと呼ばれる同様の拡張機能も存在し、PostgreSQLテーブルとOracleテーブル間の読み取りおよび書き込みアクセスを可能にします。これに加えて、ディスク上のフラットファイルからのデータアクセスを可能にするfile_fdwと呼ばれる別の拡張機能があります。詳細と詳細については、ここで公開されているpostgres_fdwの公式ドキュメントを参照してください。
pg_partman
データベースとテーブルが大きくなるにつれて、データベースを縮小したり、不要なデータをアーカイブしたり、少なくともテーブルをさまざまな小さなフラグメントに分割したりする必要が常にあります。これは、クエリオプティマイザがテーブルのヒープ全体をスキャンするのではなく、クエリ条件を満たすテーブルの部分のみにアクセスするためです。
PostgreSQLは、範囲、リスト、ハッシュ、サブパーティション化の手法など、長い間パーティション化機能を提供してきました。ただし、親テーブルのプロパティを継承してパーティションにする子テーブルの定義、データをパーティションにリダイレクトするトリガー関数の作成、さらにそれらの関数を呼び出すトリガーの作成など、多くの管理および管理作業が必要です。これはここでpg_partmanが機能し、これらの面倒な作業はすべて自動的に処理されます。
db_replica=# show shared_preload_libraries;
shared_preload_libraries
--------------------------
pg_partman_bgw
(1 row)
db_replica=# CREATE SCHEMA partman;
CREATE SCHEMA
db_replica=# CREATE EXTENSION pg_partman SCHEMA partman;
CREATE EXTENSION
db_replica=# CREATE ROLE partman WITH LOGIN;
CREATE ROLE
db_replica=# GRANT ALL ON SCHEMA partman TO partman;
GRANT
db_replica=# GRANT ALL ON ALL TABLES IN SCHEMA partman TO partman;
GRANT
db_replica=# GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA partman TO partman;
GRANT
db_replica=# GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA partman TO partman;
GRANT
db_replica=# GRANT ALL ON SCHEMA PUBLIC TO partman;
GRANT
db_replica=# create table t1 (sno integer, emp_id varchar, date_of_join date not null);
db_replica=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | t1 | table | postgres
(1 row)
db_replica=# \d t1
Table "public.t1"
Column | Type | Collation | Nullable | Default
--------------+-------------------+-----------+----------+---------
sno | integer | | |
emp_id | character varying | | |
date_of_join | date | | not null |
db_replica=# SELECT partman.create_parent('public.t1', 'date_of_join', 'partman', 'yearly');
create_parent
---------------
t
(1 row)
db_replica=# \d+ t1
Table "public.t1"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------------+-------------------+-----------+----------+---------+----------+--------------+-------------
sno | integer | | | | plain | |
emp_id | character varying | | | | extended | |
date_of_join | date | | not null | | plain | |
Triggers:
t1_part_trig BEFORE INSERT ON t1 FOR EACH ROW EXECUTE PROCEDURE t1_part_trig_func()
Child tables: t1_p2015,
t1_p2016,
t1_p2017,
t1_p2018,
t1_p2019,
t1_p2020,
t1_p2021,
t1_p2022,
t1_p2023
db_replica=# select * from t1;
sno | emp_id | date_of_join
-----+--------+--------------
(0 rows)
db_replica=# select * from t1_p2019;
sno | emp_id | date_of_join
-----+--------+--------------
(0 rows)
db_replica=# select * from t1_p2020;
sno | emp_id | date_of_join
-----+--------+--------------
(0 rows)
db_replica=# insert into t1 values (1,'emp_one','01-06-2019');
INSERT 0 0
db_replica=# insert into t1 values (2,'emp_two','01-06-2020');
INSERT 0 0
db_replica=# select * from t1;
sno | emp_id | date_of_join
-----+---------+--------------
1 | emp_one | 2019-01-06
2 | emp_two | 2020-01-06
(2 rows)
db_replica=# select * from t1_p2019;
sno | emp_id | date_of_join
-----+---------+--------------
1 | emp_one | 2019-01-06
(1 row)
db_replica=# select * from t1_p2020;
sno | emp_id | date_of_join
-----+---------+--------------
2 | emp_two | 2020-01-06
(1 row)
これは単純なパーティション分割手法ですが、上記の単純なパーティションのそれぞれをさらにサブパーティションに分割できます。提供されるその他の機能については、ここで公開されているpg_partmanの公式ドキュメントを確認してください。
このブログのパート2では、pgAudit、pg_repack、HypoPGなどの他のPostgreSQL拡張機能について説明します。