このリリースは 10.3 からの修正リリース(2018/5/10リリース)です。
10.x からのアップデートではダンプ、リストアは不要です。
また、10.3 より前のバージョンからアップデートを行う場合は 10.3 に関する技術情報を参照してください。
このリリースは 10.3 からの修正リリース(2018/5/10リリース)です。
10.x からのアップデートではダンプ、リストアは不要です。
また、10.3 より前のバージョンからアップデートを行う場合は 10.3 に関する技術情報を参照してください。
このリリースは 10.2 からの修正リリース(2018/3/1リリース)です。
10.x からのアップデートではダンプ、リストアは不要です。
しかしながら、下記 1 番、2 番の項目を確認して、必要に応じて対応を行うことを推奨します。
また、10.1 より前のバージョンからアップデートを行う場合は 10.2 に関する技術情報を参照してください。
このリリースは 10.1 からの修正リリース(2018/2/8リリース)です。
10.x からのアップデートではダンプ、リストアは不要です。
また、10.1 より前のバージョンからアップデートを行う場合は 10.1 に関する技術情報を参照してください。
このリリースは 10 からの修正リリース(リリース日 2017/11/9)です。
10 からのアップデートではダンプ、リストアは不要です。
ただし、項目4番に該当する場合は追加の対処が必要です。
最終更新:2018/2/27
2017年10月5日にリリースされた PostgreSQL 10 の主要な新機能について実際に動作検証を行った結果について報告します。
PostgreSQL 10 は、ロジカルレプリケーション、宣言的パーティショニング、パラレルクエリの強化、ハッシュインデックスの WAL 対応、同期レプリケーションの設定構文の拡張、pg_stat_activity の拡張、拡張統計(CREATE STATISTICS)、Transition Table、postgres_fdw の改善、libpq の拡張、ほか多くの機能追加や性能改善が行われています。
本内容は、バージョン 10 時点での機能実装です。
詳しくは、「PostgreSQL 10 検証レポート」(PDF形式/507KB/42ページ
) をご覧ください。
本検証レポートの他にも多数の改善がなされており、それらは PostgreSQL 10 ドキュメントの リリースノート に記載されています。
また、本サイト「PostgreSQL 10 に関する技術情報」ページも参照ください。
このページでは PostgreSQL 10(2017/10/5リリース) に関する技術情報をお届けします。
本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。
最終更新:2021/10/26
バージョン10での主な拡張箇所は以下の通りです。
Hashインデックスの改良のために必要な措置です。
pg_upgrade コマンドはこの作業を補助するスクリプトを自動生成します。
PostgreSQL利用者はしばしばこれらディレクトリ内のファイルを不要ファイルと考えて手動削除しようとする場合がありました。
これは、復元不可能なデータ損失を招きます。
このディレクトリ名称変更によって、そのような失敗の回避を試みます。
たとえば、pg_switch_xlog() は pg_switch_wal() に、pg_receivexlog は pg_receivewal になり、--xlogdir オプションは --waldir オプションに変わります。
これは、pg_xlog ディレクトリ名が変更されることを受けての変更です。xlog というワードはユーザが利用する場面では使われなくなりました。
これまで 2つの用語が混在していました。
集合を返す関数は、LATERALのFROM句の項目に置かれたかのように、SELECTリスト内のスカラ式を評価する前に評価されるようになりました。
これにより、複数の集合を返す関数が存在する場合に、より穏当なセマンティクスが可能になります。
関数が行数の異なる結果を返す場合、行数が少ないほうの結果は、NULL を追加することによって最も行数の多い結果に一致するように拡張されます。
これまでは、すべての関数が同時に終了するまで結果を繰り返し、関数の周期の最小公倍数に等しい行数を生成していました。
さらに、CASE およびCOALESCE 内で集合を返す関数が使用できなくなりました。
(9.6 以前の動作例) =# SELECT generate_series(1, 2), generate_series(1, 3); generate_series | generate_series -----------------+----------------- 1 | 1 2 | 2 1 | 3 2 | 1 1 | 2 2 | 3 (6 rows) (10 の動作例) =# SELECT generate_series(1, 2), generate_series(1, 3); generate_series | generate_series -----------------+----------------- 1 | 1 2 | 2 | 3 (3 rows)
=# CREATE TABLE p (c int); CREATE TABLE =# CREATE TABLE t () INHERITS (p); CREATE TABLE =# ALTER TABLE p ADD PRIMARY KEY (c); ALTER TABLE (9.6 以前の動作例) =# \d t Table "public.t" Column | Type | Modifiers --------+---------+----------- c | integer | Inherits: p (10 の動作例) =# \d t Table "public.t" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- c | integer | | not null | Inherits: p
外側の文、あるいは他の書き込み可能CTEにより更新された同テーブルを更新する書き込み可能CTEを伴う場合、BEFORE STATEMENT または AFTER STATEMENT トリガが 2 回以上起動されます。
また、外部キー強制動作 (ON DELETE CASCADE など) の影響を受けるテーブルに文単位トリガがあった場合、トリガが外部 SQL 文ごとに起動される可能性があります。
これは SQL 標準に反するため、変更されました。
シーケンスのリレーションでは、lastvalue、log_cnt、および is_calledという nextval() によって編集可能なフィールドのみが格納されるようになりました。
開始値や増加量などのほかのシーケンスプロパティは、pg_sequence カタログの対応する行に保持されます。
ALTER SEQUENCE の更新は完全にトランザクション処理され、コミットするまでシーケンスがロックされます。
nextval() と setval() 関数はトランザクション扱いされないままです。
この変更によってもたらされた主な非互換性は、シーケンスのリレーションから選択すると、上記の 3 つのフィールドのみが返されるようになったことです。
シーケンスのほかのプロパティを取得するには、アプリケーションが pg_sequence を調べなければなりません。新しいシステムビューpg_sequences もこの目的のために使用でき、既存のコードとより互換性のある列名が提供されます。
シーケンスの psql の \d コマンドの出力も再設計されています。
(9.6 以前の動作例) =# CREATE SEQUENCE s; CREATE SEQUENCE =# SELECT * FROM s; sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- s | 1 | 1 | 1 | 9223372036854775807 | 1 | 1 | 0 | f | f (1 row) (10 の動作例) =# CREATE SEQUENCE s; CREATE SEQUENCE =# SELECT * FROM s; last_value | log_cnt | is_called ------------+---------+----------- 1 | 0 | f (1 row) =# SELECT * FROM pg_sequence WHERE seqrelid = 's'::regclass; seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle ----------+----------+----------+--------------+---------------------+--------+----------+---------- 16405 | 20 | 1 | 1 | 9223372036854775807 | 1 | 1 | f (1 row) =# SELECT * FROM pg_sequences WHERE sequencename = 's'; schemaname | sequencename | sequenceowner | data_type | start_value | min_value | max_value | increment_by | cycle | cache_size | last_value ------------+--------------+---------------+-----------+-------------+-----------+---------------------+--------------+-------+------------+------------ public | s | postgres | bigint | 1 | 1 | 9223372036854775807 | 1 | f | 1 | (1 row)
これにより、pg_basebackup の -X/--xlog-method のデフォルトが stream に変更されました。以前の動作を再現するために、オプション値 none が追加されました。pg_basebackup のオプション -x が削除されました (代わりに、-X
fetch を使用します)。
これまで、論理レプリケーション接続は pg_hba.conf の database カラムに replicationキーワードを指定していました。
今回のリリースで replication キーワードは物理レプリケーションのみで指定され、論理レプリケーションはデータベース名や all等のキーワードを指定できるようになりました。
この変更はサードパーティー製の論理レプリケーションプラグインを使っているユーザにのみ影響します。
以前はいくつかの pg_ctl の動作は完了を待たず、-w を使用する必要がありました。
これは、ハードコードされた、文書化されていないファイル名 dh1024.pem を置き換えます。dh1024.pem はデフォルトでは検査されません。
カスタムDHパラメータを使用する場合は、このオプションを設定する必要があります。
コンパイルされた DH パラメータのサイズが 1024 から 2048 ビットに増やされ、DH鍵共有がブルートフォース攻撃に対してより強くなりました。しかし、いくつかの古い SSL実装、とくに Java Runtime Environment バージョン 6 のいくつかのリビジョンでは、1024ビットより長い DHパラメータを受けつけないため、
SSL経由で接続することができません。このような古いクライアントをサポートする必要がある場合は、コンパイルされたデフォルトの代わりにカスタムの 1024ビットDHパラメータを使用してください。
password_encryption サーバパラメータは、off または plain をサポートしなくなりました。CREATE / ALTER USER ... PASSWORD では、UNENCRYPTED オプションがサポートされなくなりました。同様に、createuser から --unencrypted オプションが削除されました。
以前のバージョンから移行された暗号化されていないパスワードは、このリリースでは暗号化されて格納されます。
password_encryption のデフォルト設定はまだ md5 です。
これらは min_parallel_relation_size を置き換えます。これは、あまりにも一般的であることが判明したためです。
これらの設定は実際にはファイル名のリストですが、以前は異なる構文解析ルールをもつSQL識別子のリストとして扱われていました。
この設定をデフォルト値から変更すると、親テーブルを参照する問い合わせで子テーブルが含まれなくなりました。ただし、SQL 標準ではそれらを含む必要があります。これは PostgreSQL 7.1 以降のデフォルトです。
この機能では、PL/Python で複合型の配列の処理に後方互換性のない変更が必要となります。以前は、[[col1, col2], [col1, col2]] などの書式で複合値の配列を返すことができました。
これは 2 次元配列として解釈されます。
あいまいさを解決するために、配列の複合型をリストではなく Python タプルとして記述する必要があります。
つまり、代わりに [(col1, col2), (col1, col2)] と記述します。
この機能は、新しいサーバパラメータ pltcl_start_proc と pltclu_start_proc に置き換えられます。これは、使いやすく、ほかの PL で利用できる機能と同じにするためです。
8.0 より前のサーバからダンプする必要があるユーザは、PostgreSQL 9.6 以前のダンププログラムを使用する必要があります。
結果の出力は引き続き新しいサーバで正常に読み込めます。
これによってコンパイルオプションの --disable-integer-datetimes が取り除かれました。浮動小数点 timestamp は殆ど利点がなく、PostgreSQL 8.3 以来デフォルトで無効でした。
このモジュールは、PostgreSQL 8.3 以前のリリースで用意された全文検索との互換性を提供していました。
これらは PostgreSQL 9.1 から非推奨となっていました。
これらのコマンドの代わりに CREATE EXTENSION および DROP EXTENSION 文を使ってください。
C 言語関数を提供する拡張機能は Version-1 呼び出し規約に準拠しなければならなくなりました。Version-0 は 2001 年から非推奨となっています。
この変更でB-treeインデックスページを各パラレルワーカから検索できるようになりました。
これにより一つのインデックススキャンを各パラレルワーカにヒープの異なる部分を担当するように割り当てできるようになりました。
並列問い合わせ以外にワーカプロセスを確保するために、このパラメータをmax_worker_processesよりも小さく設定する使い方ができます。
これはハッシュインデックスをクラッシュセーフかつレプリケーション可能にします。
これまでのこれらの使用に関する(クラッシュセーフではなく、レプリケーションできない、という)警告は取り除かれました。
新たな CREATE INDEX のオプションは新たなページ範囲が作られたときに以前の BRINページ範囲の自動要約を可能にします。
新たなSQL関数 brin_summarize_range()は指定された範囲の BRINインデックス要約を更新し、brin_desummarize_range()はそれを削除します。
これは UPDATE と DELETE のために今やより小さくなった範囲の要約を更新するのに役立ちます。
従来はBRIN使用コストを過剰に楽観的に見積もっていました。
例えば、テーブルの effective_io_concurrency設定の変更がより軽量なロックで可能になりました。
ロック昇格が二つの新たなサーバパラメータmax_pred_locks_per_relation、max_pred_locks_per_page を通して制御できるようになります。
そのために新たなコマンド CREATE STATISTICS、ALTER STATISTICS、DROP STATISTICS が追加されました。この機能は問い合わせのメモリ使用を見積りするのと、別々の列の統計を結びつけるときに役立ちます。
オプティマイザはRLSフィルタ条件を置けるところでより多くの知識をもつようになり、RLS条件を強制しても安全で場合により良いプラン生成が可能になりました。
SUM()、AVG()、およびSTDDEV()のいくつかの別形が含まれます。
これは特に多数の行を処理する問い合わせに役立ちます。
デフォルトではプラン作成と実行の時間は EXPLAIN ANALYZE では表示され、他の場合には表示されません。新たな EXPLAIN オプションの SUMMARY はこれについて明示的な制御ができます。
「SUMMARY off」指定で末尾に「Planning time:」と「Execution time:」を出さなくした例:
db1=# EXPLAIN (ANALYZE, SUMMARY off) SELECT * FROM tbl; QUERY PLAN -------------------------------------------------------------------------------------------------- Seq Scan on tbl (cost=0.00..22.70 rows=1270 width=36) (actual time=0.017..0.020 rows=3 loops=1) (1 row)
新たなロール pg_monitor、pg_read_all_settings、pg_read_all_stats、および、pg_stat_scan_tablesがあらかじめ用意されています。
これらロールはpsqlで「\du」としても出力されず、「\duS」の一覧にあらわれます。
これまではリフレッシュしたときに統計コレクタに報告されないケースがありました。バグ修正ですがバックポートしにくい箇所が含まれていました。
以前のデフォルトは空でした。
新たな関数 pg_ls_logdir() および pg_ls_waldir() は適切な権限があれば非スーパーユーザでも実行できます。
また、待ち受けソケットのバインド失敗がログ出力されるとき、バインドを試みた特定アドレスがログに含まれるようになります。
起動メッセージ例: 2017-10-24 14:35:02.468 JST [6984] LOG: listening on IPv4 address "127.0.0.1", port 5432 2017-10-24 14:35:02.533 JST [6984] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432" 2017-10-24 14:35:02.630 JST [6984] LOG: redirecting log output to logging collector process 2017-10-24 14:35:02.630 JST [6984] HINT: Future log output will appear in directory "log". 起動失敗メッセージ例: 2017-10-24 14:39:47.346 JST [7147] LOG: could not bind IPv4 address "10.10.10.72": Address already in use 2017-10-24 14:39:47.346 JST [7147] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry. 2017-10-24 14:39:47.346 JST [7147] WARNING: could not create listen socket for "10.10.10.72" 2017-10-24 14:39:47.346 JST [7147] FATAL: could not create any TCP/IP sockets
「autovacuum launcher started」や「logical replication launcher shutting down」はDEBUG1レベルのメッセージとなります。
また、client_min_messages のデバッグレベルにおいても冗長度を変更しました。
この変更で多数の低レベル待機状態の報告が可能になりました。この中にはラッチ待機、ファイルの読み/書き/同期、クライアントの読み/書き、および、同期レプリケーションが含まれます。
待機状態を表示させた例:
=# SELECT pid, wait_event_type, wait_event, state FROM pg_stat_activity ; pid | wait_event_type | wait_event | state ------+-----------------+---------------------+--------------------- 7316 | Activity | AutoVacuumMain | 7318 | Activity | LogicalLauncherMain | 7474 | | | idle in transaction 7354 | Client | ClientRead | idle 7357 | | | active 7475 | Lock | transactionid | active 7476 | | | idle in transaction 7519 | LWLock | lock_manager | active 7314 | Activity | BgWriterHibernate | 7313 | Activity | CheckpointerMain | 7315 | Activity | WalWriterMain | (10 rows)
これは監視を容易にします。新たな列 backend_type がプロセスタイプを識別します。
pg_stat_activity.backend_type の出力例:
db1=# SELECT pid, backend_type FROM pg_stat_activity ; pid | backend_type ------+--------------------- 7316 | autovacuum launcher 7318 | background worker 7320 | client backend 7354 | client backend 7357 | client backend 7314 | background writer 7313 | checkpointer 7315 | walwriter (8 rows)
これは監視を容易にします。新たな列 backend_type がプロセスタイプを識別します。
pg_stat_activity.backend_type の出力例:
db1=# SELECT pid, backend_type FROM pg_stat_activity ; pid | backend_type ------+--------------------- 7316 | autovacuum launcher 7318 | background worker 7320 | client backend 7354 | client backend 7357 | client backend 7314 | background writer 7313 | checkpointer 7315 | walwriter (8 rows)
これは出力をより一貫したものにします。
これは既存の md5 によるネゴシエーションと格納の方式よりも良いセキュリティを提供します。
これは追加的なパスワードハッシュオプションに対応するのに必要でした。これからは md5 か plain かを指定するようになります。
現在有効な設定状態ではなくファイル内容を表示します。
しかしながら、SSL設定のリロードは、サーバのSSLキーがパスフレーズを必要とする場合、パスフレーズのプロンプトを再度出す手段が無いので、動作しません。この場合、PostgreSQLを再起動しない限り、元の設定が適用されます。
これは電源障害後のデータ損失のリスクを削減します。
これはスタンバイサーバでWALの正常性チェックを可能にします。あらゆる正常性チェック失敗はスタンバイ上で致命的エラーをひき起こします。
より大きいWALセグメントサイズで、より少ない archive_command の起動とより少ない WALファイル制御を実現できます。
論理レプリケーションは、異なる PostgreSQLメジャーバージョン間でのレプリケーションや選択的レプリケーションを含め、物理レプリケーションよりも柔軟に構成できます。
これまではサーバは常に synchronous_standby_names の先頭に現れるアクティブなスタンバイを待機しました。新たな synchronous_standby_namesキーワード「ANY」は、順序にかかわりなく任意の数のスタンバイを待つことを可能にします。
これはクォーラムコミットとして知られています。
これまではpg_hba.confのレプリケーション接続の行はデフォルトではコメントアウトされていました。
新たな列はwrite_lag、flush_lag、および、replay_lagです。
これまでは停止点はタイムスタンプかXIDでしか指定できませんでした。
pg_stop_backup()のオプションの第2引数でこの振る舞いを制御します。
一時スロットはセッション終了またはエラーで自動的に削除されます。
row_constructorはキーワードROWで始めることができるようになりました。これまでは省略する必要がありました。また、row_constructor内に table_name.* が生じた場合は、他での row_constructor の使用のように、複数列に展開されるようになります。
(9.6.x以前のバージョンでは以下の書き方がエラーになりました) db1=# UPDATE t61 SET (c1, c2) = ROW (2, 2) WHERE id = 1; ERROR: syntax error at or near "ROW" (10では以下のような書き方もできます) db1=# UPDATE t61 SET (id, c1, c2) = ROW (t61a.*) FROM t61a WHERE t61.id = t61a.id; UPDATE 1
これまでは、このような文字は [[:alpha:]] などのロケール依存文字クラスに属するものとして認識されませんでした。
この構文は範囲パーティショニングとリストパーティショニングに対応します。
遷移テーブルはサーバサイド言語で書かれたトリガからアクセスできます。
これまでは全てのセキュリティポリシーは許容的で、マッチする任意のポリシーはアクセスを許すことを意味しました。制限的ポリシーでは許可されたアクセスにマッチしなければなりません。これらのポリシータイプを組み合わせることもできます。
これまでは参照するテーブルのREFERENCES権限も必要でした。これはSQL標準の誤読から生じました。外部キー(あるいは何らか他のタイプの)制約を作るには、制約されるテーブルに所有権が必要で、加えてREFERENCES権限が必要というのはあまり意味がありません。
これは ALTER DEFAULT PRIVILEGES コマンドを使って行われます。あるロールでスキーマを作ったときの、作られたスキーマのデフォルト権限を設定できます。
これは基となる列の値の範囲に一致するシーケンスの作成を簡単にします。
(以下のように使用します) db1=# CREATE SEQUENCE seq68 AS smallint; CREATE SEQUENCE db1=# SELECT * FROM pg_sequence WHERE seqrelid = 'seq68'::regclass; seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle ----------+----------+----------+--------------+--------+--------+----------+---------- 16450 | 21 | 1 | 1 | 32767 | 1 | 1 | f (1 row)
このトリガには COPYで読み取られたデータ行が与えられます。
その名前をもつ関数が一つだけしかないなら、以下例のように引数なしで関数名だけの DROP FUNCTION 等が可能です。この振る舞いはSQL標準で必要とされているものです。
(例) db1=# CREATE FUNCTION my_function_70(int, text, timestamptz) RETURNS boolean LANGUAGE sql AS $$ SELECT true; $$; CREATE FUNCTION db1=# ALTER FUNCTION my_function_70 IMMUTABLE; ALTER FUNCTION db1=# DROP FUNCTION my_function_70; DROP FUNCTION
(以下の書き方ができるようになります) db1=# DROP FUNCTION my_function_71a, my_function_71b, my_function_71c; DROP FUNCTION
この情報は log_autovacuum_min_duration 設定に基づくログ出力にも含まれるようになります。
関数ts_headline()とto_tsvector()がこれらのデータ型に対して使用できるようになりました。
これは既存の EUI-48形式の MACアドレスの対応(macaddr型)を補完します。
これはSERIAL列と似ていますが、こちらの方がSQL標準準拠です。
(以下のように使用できます) db1=# CREATE TABLE t77 (id int GENERATED ALWAYS AS IDENTITY, v text); CREATE TABLE db1=# INSERT INTO t77 (v) VALUES ('AA'), ('BB'), ('CC'); INSERT 0 3 db1=# SELECT * FROM t77; id | v ----+---- 1 | AA 2 | BB 3 | CC (3 rows)
ALTER TYPE ... RENAME VALUE ... で以下のように改名できます。
db1=# CREATE TYPE enum78 AS ENUM ('X', 'Y', 'Z'); db1=# CREATE TABLE t78 (c enum78); db1=# INSERT INTO t78 VALUES ('X'),('Y'),('Z'); db1=# ALTER TYPE enum78 RENAME VALUE 'Z' TO 'ZZ'; db1=# SELECT * FROM t78; c ---- X Y ZZ (3 rows)
これまでは anyarray として宣言された列(特に pg_statsビューの内のもの)が配列でなく JSON文字列に変換されていました。
これまではこのような場合、結果として int8型の値が float8型に変換されて、money型とfloat8型の演算子が使われていました。新たな振る舞いは起こりうる精度損失を回避します。しかし、money型の int8型での除算は、他の整数除算の場合のように商を切り捨てするようになったことに注意してください。一方、従来の振る舞いでは丸めていました。
これは regexp_matches() と似ていますが、最初のマッチからの結果だけを返すので集合を返す必要がなく、単純な場合により簡単に使えます。
この変更で、あて先のSQL型の配列型フィールドが適切にJSON配列から変換され、複合型フィールドは適切にJSONオブジェクトから変換されます。これまでこのような場合は、JSON値のテキスト表現が array_in() または record_in() に与えられて、その構文が入力関数の期待と一致しないために、失敗していました。
(10で以下のような処理が可能になりました) db1=# CREATE TYPE typ84 AS (k1 int, v1 int); db1=# CREATE TABLE t84 (id int, v typ84); db1=# SELECT * from json_populate_record(null::t84, '{"id":1, "v":{"k1":1, "v1": 10}}'); id | v ----+-------- 1 | (1,10) (1 row) db1=# SELECT (v).v1 from json_populate_record(null::t84, '{"id":1, "v":{"k1":1, "v1":10}}'); v1 ---- 10 (1 row)
txid_current()とは異なり、トランザクションIDが割り当てされていないときにトランザクションIDを新たに割り当てようとしないため、本関数はスタンバイサーバでも実行できます。
これは突発切断後において、前トランザクションがコミット済で応答を受け取れなかっただけなのか、コミットもされていないのかを検査するのに有益です。
例えば、これまでは to_date('2009-06-40','YYYY-MM-DD') は受け入れられて 2009-07-10 を返しました。これからはエラーが生じます。
よりオブジェクト指向プログラミング的なスタイルが可能になります。
これまでは、構文上の制限であて先の変数を配列要素にすることが妨げられていました。
これにより PL/Tclの問い合わせが関数全体の中断なしに失敗できるようになります。
PL/Tcl開始に際して初期化関数が呼ばれるようにできます。
libpqはリスト中の最初の応答するサーバに接続します。
(以下のように複数サーバを記述できます) $ psql 'host=dbhost1,dbhost2 port=5432,5432 dbname=db1 user=user1'
libpqの接続パラメータ target_session_attrs で、'any' でなく 'read-write' を指定すると、読み書き可能な接続に限定されます。
ホットスタンバイサーバでなくマスタサーバでなければならないという指定に応用できます。なお、ALTER ROLE ... SET default_transaction_read_only TO on; としてあるロールで接続を試みた場合も、接続に失敗するようになります。
以下例では、5432ポートの PostgreSQLに接続すると readonlyになる場合には、2番目の 5433ポートの PostgreSQL に接続されます。
$ psql 'host=127.0.0.1,127.0.0.1 port=5432,5433 dbname=db1 user=u1 target_session_attrs=read-write'
これまでは環境変数を通してのみ指定できました。
これまでは MD5で暗号化されたパスワードのみが PQencryptPassword() を使って作成できました。新たな関数は SCRAM-SHA-256 で暗号化されたパスワードも作成できます。
今後は ecpgバージョンが PostgreSQL配布バージョン番号と一致します。
この機能は psql にメタコマンド \if、\elif、\else、\endif を加えます。主としてスクリプト作成に役立ちます。
これは拡張モード(\x)で問い合わせを実行(\g)します。
これは特に新たな psql の条件分岐コマンドにおいて役立ちます。
(psqlスクリプトでの使用例) \set param 123 \echo `judge is:` \echo `/opt/bin/judge.sh :param` \if `/opt/bin/judge.sh :param` \i special_proc.sql \endif
特例として真偽値を持つ特別変数に対する空または省略された新たな値での \set は、依然として値を on に設定した効果を持ちます。ただし、この場合でも特別変数に空文字が保持されることはなくなります。
(以下は9.6.x以前バージョンではエラーが出ませんでした) db1=# \set FETCH_COUNT xxx invalid value "xxx" for "FETCH_COUNT": integer expected (以下は9.6.x以前のバージョンですと変数値が空文字列になっていました) db1=# \set AUTOCOMMIT db1=# \echo :AUTOCOMMIT on
また、特別変数に対する \unset は、これからは明示的に値をそのデフォルト値に設定します。
変数 VERSION_NUM、VERSION_NAME、SERVER_VERSION_NUM、SERVER_VERSION_NAME が利用できます。
これまではこれらは一つの Modifiers 列の中に示されていました。
これからは全てのメッセージを stdout でなく stderr に出力するようになり、メッセージの文言もより一貫性をもったものになります。
行末にバックスラッシュを書いて次行に継続できるようになります。
以前は -M はベンチマークスクリプトを規定するオプション(-f や -b) より先に現れる必要がありました。
これまでは --startpos オプションだけが在りました。
従来のオプション綴りにも未だ対応しています。
新たに -N / --exclude-schema オプションが追加されます。
これはラージオブジェクトをダンプから除外します。
これにより非スーパーユーザからの pg_dumpall が可能になります。本オプションが無いとパスワードが読めないためにエラーになります。
これにより pg_dump の -j オプションをスタンバイサーバに対しても使用できるようになります。
プログラム終了前に出力が安全にディスク上に格納されるという、より良い安全性を提供します。この動作は新たな --no-sync オプションで無効にできます。
このとき WAL はベースバックアップとは別の tar ファイルに格納されます。
pg_basebackup がデフォルトオプションでWALストリーミングを使うとき、一時レプリケーションスロットはデフォルトで使われます。
潜在的な OSダウン時のデータ損失の可能性を減らす意図の改修です。
-w で昇格完了を待つことができるようになります。
postmaster はその接続受付状態を postmaster.pid に報告するように変更されました。そして、pg_ctl はそのファイルを調べて起動が完了したかを検出します。これは従来の方法よりも効率的で信頼でき、起動当初の pg_ctl による接続試行がログに記録されずに済みます。
pg_ctl は postmaster の状態変更を待つときに、これからは1秒に1回ではなく、1秒に10回検査します。
start、promote 操作は、このような場合に終了ステータスに 0 でなく 1 を返すようになりました。stop操作は以前から常にそのようになっていました。
リリース番号はこれからは三要素(例えば 9.6.3)でなく二要素になります(例えば、10.1)。メジャーバージョンは一番目の数だけが増え、マイナーリリースは二番目に数だけが増えます。リリースブランチは単一の数で参照されます(例えば 9.6 でなく 10)。これまでは最初の二つの数がメジャーリリース、最後の数がマイナーリリースでした。
FreeBSDプロジェクトによる最近の改良に基づく pg_bsd_indent の新バージョンに切り替えられました。これはおかしなCコード整形の判断をする多数の小さなバグを修正します。最も特記すべきは、たとえ結果としてコードが右端を超えて延びても、(複数行の関数呼び出しのような)括弧内の複数行が開き丸括弧でインデントが揃えられるようになったことです。
ICUライブラリはバージョン間での照合順序の変更がわかるバージョン付けをしています。これはconfigureオプション --with-icu で有効にできます。デフォルトでは未だオペレーティングシステム固有の照合順序ライブラリを使います。
yum.postgresql.org サイトでの配布物では --with-icu オプションが使われています。
サードパーティコードで extern関数宣言を使っている場合、DLLEXPORTマーカーをそれらの宣言に加える必要があります。
これら関数の機能はこれからは自動的に行われます。外部モジュールが直ちにアップデートを必要としないように、これら関数はその名前の何もしないマクロとなりますが、最終的にはこれらも取り除かれるはずです。
本変更の副作用は、SPI_palloc() と付随する関数がこれからはアクティブなSPI接続を必要とすることです。接続が無い場合、これからは単純な palloc() に縮退しません。従来の振る舞いは必ずしも便利ではなく予期せぬメモリリークの危険性が生じました。
これにより、プラットフォームで SysVセマフォ使用量の上限に注意したり、調整したりする必要がなくなります。
clock_gettime() が使えないときには gettimeofday が依然として使われます。
強い乱数生成器が見つからないと、configure は --disable-strong-random が指定されていない限り、失敗します。しかしながら、このオプション付きですと強いランダム生成器を必要とする pgcrypto関数は使用できません。
多数派の呼び出し元は複合型OIDについて考慮しませんが、結果タプルが複合Datumとして使われる場合、正しいIDがその中に挿入されるのを確かめる手順となります。
これまでは Jade、DSSSLおよびJadeTexが使われていました。
これはリモートサーバから渡されなければならないデータ量を減らし、集約計算の負担を要求元サーバから取り除きます。
これまではOID列は常にゼロを返しました。
これにより enum が排他制約に使用できます。
データベース管理者がこれらの関数を非スーパーユーザで実行可能にできるようになります。
SELECT文で表示される列名の変更があった関数は下記の通りです。
関数名 | PostgreSQL 9.6.x での出力列名 -------------------+------------------------------- current_date | date current_time | timetz current_timestamp | now localtime | time localtimestamp | timestamp current_role | current_user user | current_user current_catalog | current_database