AWSAWS 勉強会勉強会 (2019-01-18)(2019-01-18)
PostgreSQLPostgreSQL を拡張してを拡張して
もっと楽しもう!もっと楽しもう!
ぬこ@横浜ぬこ@横浜 (@nuko_yokohama)(@nuko_yokohama)
2
自己紹介
「 PostgreSQL ラーメン」
去年の 9 月に
こんな本だしました。
生油ラーメン@とらや
3
目次
Part.1 PostgreSQL 拡張開発概要
Part.2 独自データ型開発例
Part3. AWS RDS と拡張機能
4
Part.1
PostgreSQL
拡張開発概要
5
PostgreSQL
知ってる?
使ったことある?
開発したことある?
6
PostgreSQL に
かかわる開発にも
いろいろある
7
PostgreSQL
本体
PostgreSQL アプリケーション
PostgreSQL
クライアントライブラリ
拡張機能
PostgreSQL
本体の開発
クライアント
ライブラリの開発
拡張機能の開発
PostgreSQL を使った
アプリケーション開発
8
PostgreSQL
本体
PostgreSQL アプリケーション
PostgreSQL
クライアントライブラリ
拡張機能
PostgreSQL
本体の開発
クライアント
ライブラリの開発
拡張機能の開発
今日のお題は
「拡張機能」の開発
PostgreSQL を使った
アプリケーション開発
9
PostgreSQL では
どんな拡張が
できるのか
10
PostgreSQL 拡張の主な種類
ユーザ定義関数
データ型
Foreign Data Wrapper
手続き言語組み込み
HOOK インタフェース
ロジカルデコーディング
独自のインデックス
独自のスキャン
11
拡張機能の組み方
SQL で組む
pl/pgsql で組む
C 言語等で組む
12
ユーザ定義関数
13
SQL から呼び出す関数
( SQL 関数)を自作できる。
14
CREATE OR REPLACE FUNCTION add3(i integer )
RETURNS integer
LANGUAGE sql
AS $function$
SELECT i + 3;
$function$
;
CREATE FUNCTION
postgres=# SELECT add3(5);
add3
------
8
(1 row)
関数定義
関数実行
SQL で作成する例
15
pl/pgsql で作成する例
postgres=# CREATE OR REPLACE FUNCTION sigma(i integer )
RETURNS integer
LANGUAGE plpgsql
AS $function$
DECLARE
sigma integer := 0;
c integer := 1;
BEGIN
FOR c IN 1 .. i LOOP
sigma := sigma + c;
END LOOP;
RETURN sigma;
END;
$function$
;
CREATE FUNCTION
postgres=#
postgres=# SELECT sigma(10);
sigma
-------
55
(1 row)
関数定義
関数実行
16
こんな遊びもできる
pg_banner
pg_lifegame
作成
17
巨大文字を作ったり
postgres=# SELECT * FROM pg_banner('kof2018');
data
--------------------------------------------------
# # ####### ####### ### #### # ###
# # # # # # # # ## ## # #
# # # # # # # # # # # # # #
### # # ##### # # # # # ###
# # # # # # ## # # # #
# # # # # # # # # # #
# # ####### # ##### #### ##### ###
(7 rows)
life game (gen=1, lifes=23)
* *
* *
* ***
* * *
* * **
* ***
* **
*
life game (gen=2, lifes=23)
** **
* * **
* * **
* * **
* ***
*
**
lifegame を動かしたり
18
データ型
19
関数だけでなく、
独自のデータ型や
その型に対する
演算子も拡張できる
20
データ型の例
pg_fraction
作成
21
‘ 分子 / 分母’の
文字列表現で
様々な演算を
可能にするデータ型
22
SELECT id, data, data + '2/3' AS add, data - '2/3' AS sub FROM test;
id | data | add | sub
----+------+-------+-------
1 | 2/3 | 4/3 | 0/1
2 | 3/7 | 23/21 | -5/21
3 | 1/5 | 13/15 | -7/15
(3 rows)
SELECT id, data, data * '2/3' AS mul, data / '2/3' AS div FROM test;
id | data | mul | div
----+------+------+------
1 | 2/3 | 4/9 | 1/1
2 | 3/7 | 2/7 | 9/14
3 | 1/5 | 2/15 | 3/10
(3 rows)
test=# SELECT * FROM test ORDER BY data;
id | data
----+------
3 | 1/5
2 | 3/7
1 | 2/3
(3 rows)
test=# SELECT max(data), min(data) FROM test ;
max | min
-----+-----
2/3 | 1/5
(1 row)
四則演算
並び替え=比較演算
集約演算
23
実装については後で
説明します。
24
Foreign Data
Wrapper
25
外部の情報源
(DBMS, ファイル ,
Web 等 ) を
SQL で検索できる
26
FDW の例
contrib/postgres_fdw
contrib/file_fdw
oracle_fdw
FDW は色々あります!
https://wiki.postgresql.org/wiki/Foreign_data_wrappers
今日数えたら
100 種類超えてました
27
FDW の例
neo4j_fdw
作成
28
Neo4j Server
PostgreSQL
olumn1 column2 column3
・・・ ・・・ ・・・
・・・・ ・・・・ ・・・
Neo4j Foriegn Data Wrapper
Defined Cypher Query
Execute Cypher Query on REST
Generate PostgreSQL Record
PostgreSQL
Record
JSON
Result
Provide Cypher Result View
SQL
Cypher
Query
FDW 定義に記述した
グラフデータベース Neo4j の
クエリを使って Neo4j を検索し、
結果を PostgreSQL のレコードにして
PostgreSQL に返却する。
29
手続き言語
30
SQL 関数を記述する
言語を組み込める
その言語で関数を開
発できる
31
手続き言語の例
pl/sh
pl/v8
pl/python
32
plsh=# CREATE OR REPLACE FUNCTION df() RETURNS jsonb AS $$
#!/bin/sh
df . | tail -1 | awk '{printf("{"filesystem":"%s", "total":%d, "used":
%d, "available":%d}n", $1, $2, $3, $4)}'
$$ LANGUAGE plsh;
CREATE FUNCTION
plsh=#
plsh=# SELECT df();
--------------------------------------------------------------------------------
{"used": 16867508, "total": 18348032, "available": 1480524, "filesystem":
"/dev/mapper/centos-root"}
(1 row)
pl/sh による関数定義
定義した関数を実行
df コマンドの実行結果を取得して JSONB 型で返却
33
HOOK
インタフェース
34
PostgreSQL には
サーバ挙動に介入可能な
I/F (関数)が用意されている
PostgreSQL 11 では 38 種類の HOOK があると思う。
35
HOOK の利用例
pgaudit
https://github.com/pgaudit/pgaudit
pg_hint_plan
https://github.com/ossc-db/pg_hint_plan
36
HOOK 利用例
pg_sulog
作成
37
スーパーユーザ属性をもつ
ユーザ操作のみを強制ロギング
$ psql sampledb -U postgres -t -c "SELECT 1";
WARNING: pg_sulog: 2015-11-22 10:32:19 JST [logging] user=postgres SELECT 1
1
$ psql sampledb -U nuko -t -c "SELECT 2"
2
$ psql sampledb -U admin -t -c "SELECT 3"
WARNING: pg_sulog: 2015-11-22 10:32:27 JST [logging] user=admin SELECT 3
3
$
WARNING: pg_sulog: 2015-11-22 10:32:19 JST [logging] user=postgres SELECT 1
WARNING: pg_sulog: 2015-11-22 10:32:27 JST [logging] user=admin SELECT 3
スーパーユーザ
一般ユーザ
スーパーユーザ
サーバログにもスーパユーザ操作のみ書き込まれる
38
HOOK 組み込みの問題点
PostgreSQL 文書には
HOOK に関する情報がない!
PostgreSQL バージョンによって、頻繁
にインタフェースが変わってしまう!
39
ロジカル
デコーディング
40
PostgreSQL の更新ログを
任意の形式に変換できる
プラグインを組み込める
( PostgreSQL 9.4 ~)
41
ロジカルデコーディングの例
ロジカルレプリケーション
( PostgreSQL 10 ~)
BDR( 双方向レプリケータ )
https://www.2ndquadrant.com/en/resources/postgres-bdr-2ndquadrant/
wal2json
https://github.com/eulerto/wal2json
42
ロジカルデコーディングの例
wal2json + Logideco4neo4j
43
neo4j_fdw と組み合わせて、
グラフデータベース Neo4j を
PostgreSQL 経由で操作できる
44
Neo4j Server
Logideco4neo4j
PostgreSQL
Relational Model
Cypher Query
WAL
(wal_level=logical) Logical
Replication
Slot
Execute Cypher Query on REST
Convert Cypher Query
PostgreSQL
WAL to Neo4j
Graph Model
olumn1 column2 column3
・・・ ・・・ ・・・
・・・・ ・・・・ ・・・
Get Replication Slot Data
Decoding Function
wal2json
45
独自のインデックス
46
PostgreSQL ではもともと
多くのインデックスが利用できる。
btree 二分探索木を使ったインデックス。
通常はこのインデックスを用いることが多い。
hash 等比較に特化したインデックス。
btree のような汎用性はないが、等比較のみ使う場合
は、インデックスサイズや検索速度の優位がある。
gin 汎用転置インデックス。
全文検索や配列への検索などに利用される。
gist 独自インデックス構築の基盤。
sp-gist 空間インデックスに特化したインデックス構築基盤
brin ブロックレンジインデックス。物理的に整列されたデー
タに対して用いると、インデックスサイズを非常に小さ
くできる。( PostgreSQL 9.5 ~)
47
さらに独自のインデックス機構
を組み込むことができる。
gist 基盤を用いた実装
自分ですべて実装
48
独自インデックス例
contrib/btree-gist
contrib/bloom
49
カスタムスキャン
50
表をスキャンする独自の方法を
作成することができる。
例えば、特定の H/W に最速な
アクセス方法を組み込むなど。
51
カスタムスキャン例
PG-Strom
http://heterodb.github.io/pg-strom/ja/
PG-Strom の検証例 (GpuScan/GpuJoin などの例)
https://www.ntt-tx.co.jp/column/postgresql_blog/20180529/
52
Part.2
独自データ型開発例
53
PostgreSQL は
組込みデータ型が
とても多い
54
PostgreSQL 組込データ型 ( 一部 )
カテゴリ データ型
整数データ型 SMALLINT, INTEGER, BIGINT
任意精度数値型 NUMERIC, DECIMAL
浮動小数点数値型 REAL, DOUBLE PRECISION
連番型 SMALLSERIAL, SERIAL, BIGSERIAL
通過型 MONEY
文字型 CHAR, VARCHAR, TEXT
バイナリデータ型 BYTEA
日付 / 時刻データ型 TIMESTAMP, DATE, TIME, INTERVAL
論理値データ型 BOOLEAN
列挙型 ENUM
幾何データ型 POINT, LINE, LSEG, BOX, PATH, POLYGON, CIRCLE
ネットワークアドレス型 CIDR, INET, MACADDR, MACADDR8
ビット列データ型 BIT
テキスト検索用データ型 TSVECTOR, TSQUERY
UUID 型 UUID
XML 型 XML
JSON データ型 JSON, JSONB
55
たいていは組込のデータ型で
なんとかなるが、
自分で型を作成するほうが
便利なケースもある。
56
そこになければ
ないですね
作ればいいですね
57
独自のデータ型
(pg_fraction) を
PostgreSQL に
組み込む例
https://github.com/nuko-yokohama/pg_fraction
58
SELECT id, data, data + '2/3' AS add, data - '2/3' AS sub FROM test;
id | data | add | sub
----+------+-------+-------
1 | 2/3 | 4/3 | 0/1
2 | 3/7 | 23/21 | -5/21
3 | 1/5 | 13/15 | -7/15
(3 rows)
SELECT id, data, data * '2/3' AS mul, data / '2/3' AS div FROM test;
id | data | mul | div
----+------+------+------
1 | 2/3 | 4/9 | 1/1
2 | 3/7 | 2/7 | 9/14
3 | 1/5 | 2/15 | 3/10
(3 rows)
test=# SELECT * FROM test ORDER BY data;
id | data
----+------
3 | 1/5
2 | 3/7
1 | 2/3
(3 rows)
test=# SELECT max(data), min(data) FROM test ;
max | min
-----+-----
2/3 | 1/5
(1 row)
四則演算
並び替え=比較演算
集約演算
(再掲)
59
ユーザ定義型の構築順序 (1)
型定義
入出力定義
算術演算の定義
比較演算の定義
集約の定義
インデックス
パラレルスキャン対応
60
ユーザ定義型の構築順序 (2)
CREATE
FUNCTION
C 言語関数
CREATE TYPE 型の雛形
入出力関数
CREATE TYPE
ユーザ
定義型
C 言語関数
CREATE
FUNCTION
CREATE
FUNCTION
入出力関数
演算関数
比較関数
CREATE
OPERATOR
演算子
To be continued...
61
ユーザ定義型の構築順序 (3)
ユーザ
定義型
C 言語関数
CREATE
FUNCTION
演算関数
CREATE
AGGREGATE
集約関数
C 言語関数
CREATE
FUNCTION
比較関数
CREATE
OPERATOR
CLASS
インデックス
アクセス定義
62
型定義
SQL 定義
CREATE TYPE fraction;
CREATE FUNCTION fraction_in(cstring)
RETURNS fraction
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION fraction_out(fraction)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE TYPE fraction (
INTERNALLENGTH = 16,
INPUT = fraction_in,
OUTPUT = fraction_out,
STORAGE = plain
);
型定義の流れ
①ダミーの型を定義
②入出力関数を定義
③入出力関数を設定し
て、型を再定義
63
入出力定義
型の「外部表現」と「内部表現」
入出力関数で外部表現と内部表現を変換
TEXT 型 int 型 int 型 doible 型
入力関数
出力関数
外部表現 内部表現
‘3/5’ 3 5 0.6
fraction_in
fraction_out
外部表現 内部表現
64
入出力定義(入力定義)
C 言語関数
PG_FUNCTION_INFO_V1(fraction_in);
Datum
fraction_in(PG_FUNCTION_ARGS)
{
char *str = PG_GETARG_CSTRING(0);
int n, d;
Fraction *result;
/* TODO: more smart parse */
if (sscanf(str, "%d/%d", &n, &d) != 2)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("pg_fraction:invalid input syntax: "%s"",
str)));
/* range check */
if (d == 0) {
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("pg_fraction:division by zero: "%s"",
str)));
}
result = (Fraction* ) palloc(sizeof(Fraction));
reduce_fraction(&n, &d);
if ( abs(n) > 99999 || abs(d) > 99999 ) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("pg_fraction:: overflow error (max=99999) "%s"",
str)));
}
result->numerator = n;
result->denominator = d;
result->value = (double) n / (double) d;
PG_RETURN_POINTER(result);
}
SQL 定義
CREATE TYPE fraction;
CREATE FUNCTION fraction_in(cstring)
RETURNS fraction
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION fraction_out(fraction)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE TYPE fraction (
INTERNALLENGTH = 16,
INPUT = fraction_in,
OUTPUT = fraction_out,
STORAGE = plain
);
typedef struct st_fraction {
int numerator;
int denominator;
double value;
} fraction;
C 言語ヘッダ
65
入出力定義(出力定義)
C 言語関数
PG_FUNCTION_INFO_V1(fraction_out);
Datum
fraction_out(PG_FUNCTION_ARGS)
{
Fraction *fraction= (Fraction*) PG_GETARG_POINTER(0);
char *result;
result = psprintf("%d/%d", fraction->numerator, fraction->denominator);
PG_RETURN_CSTRING(result);
}
SQL 定義
CREATE TYPE fraction;
CREATE FUNCTION fraction_in(cstring)
RETURNS fraction
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION fraction_out(fraction)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE TYPE fraction (
INTERNALLENGTH = 16,
INPUT = fraction_in,
OUTPUT = fraction_out,
STORAGE = plain
);
66
算術演算の定義( + 演算子)
CREATE FUNCTION
CREATE OPERATOR
PG_FUNCTION_INFO_V1(fraction_add);
Datum fraction_add(PG_FUNCTION_ARGS);
Datum fraction_add(PG_FUNCTION_ARGS) {
Fraction *f1;
Fraction *f2;
Fraction *result;
int n, d;
f1 = (Fraction*) PG_GETARG_POINTER(0);
f2 = (Fraction*) PG_GETARG_POINTER(1);
add_fraction_internal(
f1->numerator,
f1->denominator,
f2->numerator,
f2->denominator,
&n,
&d);
result = (Fraction*) palloc(sizeof(Fraction));
result->numerator = n;
result->denominator = d;
result->value = (double) n / (double) d;
PG_RETURN_POINTER(result);
}
SQL 定義
--
-- 加算関数を定義する
--
CREATE FUNCTION fraction_add(fraction, fraction)
RETURNS fraction
AS 'MODULE_PATHNAME'
PARALLEL SAFE
LANGUAGE C IMMUTABLE STRICT;
--
-- + 演算子を定義する
--
CREATE OPERATOR + (
leftarg = fraction,
rightarg = fraction,
procedure = fraction_add,
commutator = +
);
C 言語関数
67
比較演算の定義( = 演算子の例)
C 言語関数
PG_FUNCTION_INFO_V1(fraction_eq);
Datum fraction_eq(PG_FUNCTION_ARGS);
Datum
fraction_eq(PG_FUNCTION_ARGS)
{
Fraction* f1 = (Fraction*) PG_GETARG_POINTER(0);
Fraction* f2 = (Fraction*) PG_GETARG_POINTER(1);
double f1_v = f1->value;
double f2_v = f2->value;
PG_RETURN_BOOL(fraction_cmp_internal( f1_v, f2_v) == 0);
}
SQL 定義
--
-- eq 比較関数を定義する
--
CREATE FUNCTION fraction_eq(fraction, fraction)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
--
-- = 演算子を定義する
--
CREATE OPERATOR = (
leftarg = fraction,
rightarg = fraction,
procedure = fraction_eq,
commutator = =,
RESTRICT = eqsel
);
CREATE FUNCTION
CREATE OPERATOR
68
集約の定義( MAX 関数の定義例)
C 言語関数
PG_FUNCTION_INFO_V1(fraction_max);
Datum fraction_max(PG_FUNCTION_ARGS);
Datum fraction_max(PG_FUNCTION_ARGS) {
Fraction* f_l = (Fraction*) PG_GETARG_POINTER(0);
Fraction* f_r = (Fraction*) PG_GETARG_POINTER(1);
if (f_l->value > f_r->value ) {
PG_RETURN_POINTER(f_l);
} else {
PG_RETURN_POINTER(f_r);
}
}
SQL 定義
ーー
-- fraction_max 関数を定義する
--
CREATE FUNCTION fraction_max(fraction, fraction)
RETURNS fraction
AS 'MODULE_PATHNAME'
PARALLEL SAFE
IMMUTABLE
LANGUAGE C STRICT
;
--
-- fraction_max を集約関数 MAX として定義する
--
CREATE AGGREGATE max (fraction)
(
sfunc = fraction_max,
combinefunc = fraction_max,
stype = fraction,
initcond = '-99999/1',
parallel = safe
);
CREATE FUNCTION
CREATE AGGREGATE
69
インデックスを有効にする定義
C 言語関数/*
* 2 値ではなく 3 値を返すのがポイント
*/
static int
fraction_cmp_internal(double a, double b)
{
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
/*
* B-tree インデックス比較用の関数
*/
Datum
fraction_cmp(PG_FUNCTION_ARGS)
{
Fraction* f1 = (Fraction*) PG_GETARG_POINTER(0);
Fraction* f2 = (Fraction*) PG_GETARG_POINTER(1);
double f1_v = f1->value;
double f2_v = f2->value;
PG_RETURN_INT32(fraction_cmp_internal( f1_v, f2_v));
}
SQL 定義
--
-- B-tree index support
--
CREATE FUNCTION fraction_cmp(fraction, fraction)
RETURNS integer
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
-- freaction operator class
CREATE OPERATOR CLASS fraction_ops
DEFAULT FOR TYPE fraction USING btree AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 fraction_cmp(fraction,
fraction);
CREATE FUNCTION
CREATE OPERATOR CLASS
70
ビルド環境 (Linux)
pg_fraction の例
ファイル / フォルダ名 説明
Makefile ビルド、インストール用。
Readme.md 説明用のファイル。 Markdown 形式で書いておく。
calc.c 分数演算用の関数群
calc.h 分数演算用のヘッダファイル
pg_fraction--1.0.sql 分数型用の型定義、 SQL 関数、演算子定義等を行う
SQL ファイル
pg_fraction.c 分数型用の SQL 関数用 C ソース・ファイル
pg_fraction.control 分数型を拡張機能として登録するための制御ファイル
pg_fraction.h 分数型用の SQL 関数用ヘッダファイル
sql/ リグレッションテスト用の SQL ファイル
expected/ 期待結果ファイル。リグレッションテストの比較用
71
ビルド / インストール
Makefile の例
# contrib/ksj/Makefile
MODULE_big = pg_fraction
OBJS = pg_fraction.o calc.o
EXTENSION = pg_fraction
DATA = pg_fraction--1.0.sql
REGRESS = pg_fraction
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/ksj
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
endif
72
ビルド / インストール
ビルド手順の例
$ make USE_PGXS=1 clean
rm -f pg_fraction.so libpg_fraction.a libpg_fraction.pc
rm -f pg_fraction.o calc.o pg_fraction.bc calc.bc
rm -rf results/ regression.diffs regression.out tmp_check/ tmp_check_iso/ log/ output_iso/
$ make USE_PGXS=1
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -
Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-
precision=standard -O2 -fPIC -I. -I./ -I/home/nuko/pgsql/pgsql-11/include/server
-I/home/nuko/pgsql/pgsql-11/include/internal -D_GNU_SOURCE -c -o pg_fraction.o pg_fraction.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -
Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-
precision=standard -O2 -fPIC -I. -I./ -I/home/nuko/pgsql/pgsql-11/include/server
-I/home/nuko/pgsql/pgsql-11/include/internal -D_GNU_SOURCE -c -o calc.o calc.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -
Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-
precision=standard -O2 -fPIC -shared -o pg_fraction.so pg_fraction.o calc.o -L/home/nuko/pgsql/
pgsql-11/lib -Wl,--as-needed -Wl,-rpath,'/home/nuko/pgsql/pgsql-11/lib',--enable-new-dtags
$ make USE_PGXS=1 install
/usr/bin/mkdir -p '/home/nuko/pgsql/pgsql-11/lib'
/usr/bin/mkdir -p '/home/nuko/pgsql/pgsql-11/share/extension'
/usr/bin/mkdir -p '/home/nuko/pgsql/pgsql-11/share/extension'
/usr/bin/install -c -m 755 pg_fraction.so '/home/nuko/pgsql/pgsql-11/lib/pg_fraction.so'
/usr/bin/install -c -m 644 .//pg_fraction.control '/home/nuko/pgsql/pgsql-11/share/extension/'
/usr/bin/install -c -m 644 .//pg_fraction--1.0.sql
'/home/nuko/pgsql/pgsql-11/share/extension/'
$
73
拡張機能のパッケージ化と登録
CREATE EXTENSION 用の設定ファイル
(pg_fraction.control) を作成しておく
# pg_fraction extension
comment = 'fraction data type'
default_version = '1.0'
module_pathname = '$libdir/pg_fraction'
relocatable = true
作成した拡張機能を CREATE EXTENSION コマンドで
データベースに登録する。
test=# CREATE EXTENSION pg_fraction ;
CREATE EXTENSION
test=# dx
List of installed extensions
Name | Version | Schema | Description
-------------+---------+------------+------------------------------
pg_fraction | 1.0 | public | fraction data type
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
74
Part.3
AWS RDS と
拡張機能
75
AWS RDS PostgreSQL には
組み込み済みの拡張機能がある
( ユーザーズガイドか、 psql で
rds.extensions を確認)
postgres_fdw, PostGIS,
pg_hint_plan も
サポートしている!
76
しかし、他の拡張機能や
自作の拡張機能を RDS へ
組み込むことはできない。
どうする?
77
対応策 1
SQL/plpgsql スクリプトを
自分で実行する。
SQL や plpgsql だけで実装し
た関数は、 psql 等から実行し
て組み込みは可能
78
対応策 2
EC2 と組み合わせる
AWS RDS
PostgreSQL
外部テーブル
AWS EC2
PostgreSQL
テーブル
全文検索モジュール
(pg_bigm)
クライアント
たとえば、現在 RDS がサポートしていない
日本語全文検索モジュールを組み込んだ
EC2 インスタンス+ postgres_fdw を使い
79
対応策 3
AWS さんに追加をお願いする
E メールで拡張機能名や用途を記載
rds-postgres-extensions-request@amazon.com
80
おわりに
81
PostgreSQL は
いろんな拡張機能が
気軽に開発できるので
楽しいよ!
という話でした
82
おしまい

20190119 aws-study-pg-extension