Database Support Blog

  • PostgreSQL
  • EDB
2017.12.20

PostgreSQL10へのアップグレード前に押さえておきたい3つの注意点

PostgreSQL10へのアップグレード前に押さえておきたい3つの注意点

これは PostgreSQL Advent Calendar 2017 の20日目の記事です。

2017年10月5日に様々な機能が追加・改良されたPostgreSQL10がリリースされました。一つ前のメジャーバージョンはPostgreSQL9.6ですので、従来通りであればPostgreSQL9.7と命名されるはずでした。しかし、今回のメジャーバージョンアップでは、パーティションニング構文や論理レプリケーションなどの大幅な機能追加・改良が加えられていることよりPostgreSQL10と命名されています。また、これに合わせてバージョン表記もx.y.zの3桁表記からx.yの2桁表記に変更され、メジャーバージョンは上位2桁から1桁のみで示すようになりました。

今後、PostgreSQL9.6以前のバージョンからPostgreSQL10へのアップグレードを検討される方が増えることが予想されますので、本記事ではPostgreSQL10へのアップグレードを行う前に押さえておきたい3つの注意点についてご紹介します。


1. 各ディレクトリ名や関数名などの変更に伴うシェルスクリプトや監視ツールの修正

PostgreSQL10ではいくつかのディレクトリ名や関数名などが変更されています。メンテナンス系のシェルスクリプトや監視ツールで下記ディレクトリ名や関数名などをハードコードされている場合は、PostgreSQL10以降の名称に修正する必要があります。

* ログファイル出力先のディレクトリ名がpg_logからlogへ変更
* WALに関連するディレクトリ/関数/コマンドなどでxlogwallocationlsnに変更
* コミットログの出力先ディレクトリ名がpg_clogからpg_xactへ変更

▼PostgreSQL10以降で変更されたディレクトリ/関数名などの例
PostgreSQL9.6以前の名称 PostgreSQL10以降の名称
pg_log log
pg_xlog pg_wal
pg_clog pg_xact
pg_current_xlog_location pg_current_wal_lsn
pg_xlogdump pg_waldump
pg_receivexlog pg_receivewal

なお、locationという文字列を含む関数にpg_tablespace_locationがありますが、この関数はWALとは関連がないため、PostgreSQL10でも名称は変更されていません。locationという文字列を含む全てのオブジェクトがlsnに変更されているわけではない点も注意が必要です。


2. pg_upgradeコマンドでアップグレードした場合はHash Indexの再作成が必要

Hash Indexが使用されている環境をpg_upgradeコマンドでPostgreSQL10にアップグレードした場合、 以下の警告メッセージが出力されます。 これはHash Indexの内部的なフォーマットが変更されたたためであり再作成するまでHash Indexは使用されません。

▼Hash Indexが含まれる環境をpg_upgradeコマンドでアップグレードする際の出力

 Checking for hash indexes                                   warning
 Your installation contains hash indexes. These indexes have different  internal formats between your old and new clusters, so they must be  reindexed with the REINDEX command. The file   reindex_hash.sql  when executed by psql by the database superuser will recreate all invalid  indexes; until then, none of these indexes will be used. #再作成しなければ、Hash Indexは使用されない。

pg_upgradeコマンドを実行したカレントディレクトリに、再作成用のスクリプト reindex_hash.sql が 出力されているので、このスクリプトを実行してHash Indexを再作成してください。

▼reindex_hash.sqlを使用してHash Indexを再作成する例

$ psql -f reindex_hash.sql
You are now connected to database "postgres" as user "p100".
REINDEX


3. to_timestamp関数とto_date関数には正しい日付を設定

to_timestamp関数とto_date関数で入力値のチェックが厳格になり、日付として正しくない値を入力した際にエラーが返るようになりました。 例えば、PostgreSQL9.6以前でselect to_date('2017-02-29','YYYY-MM-DD');の結果には'2017-03-01'が返されましたが、PostgreSQL10ではエラーが発生します。 なお、うるう年には対応しているのでselect to_date('2020-02-29','YYYY-MM-DD');は正しく結果を返します。

▼各バージョンでselect to_date('2017-02-29','YYYY-MM-DD');を実行した結果

--PostgreSQL9.6以前
postgres=# select to_date('2017-02-29','YYYY-MM-DD'); to_date ------------ 2017-03-01 (1 row)   --PostgreSQL10以降
postgres=# select to_date('2017-02-29','YYYY-MM-DD'); ERROR: date/time field value out of range: "2017-02-29" #PostgreSQL10以降ではエラーが発生する。

まとめ

今回は、PostgreSQL10へのアップグレード前に押さえておきたい3つの注意点をご紹介しました。この記事で紹介した以外にも リリースノート にPostgreSQL10にアップグレードする方法や注意点などがまとめられています。未然に問題を防ぐために、PostgreSQL10へのアップグレード前にはリリースノートもご一読ください。

PostgreSQL Advent Calendar 2017 21日目の担当は kaigai さんです。


執筆者情報

家島 拓也

サービス事業部 サポートセンター

2007年にアシストに入社して以来、ORACLE製品やPostgreSQL・EDB Postgres製品のサポートに従事してきました。このブログではサポート対応で得た知識を元に、お客様がお困りになることが多い問題や各製品の新機能に関する検証結果などを紹介します。

アシスト データベース ウェビナー


■商標に関して
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。

関連している記事

  • EDB
  • PostgreSQL
2021.09.09

WordPress のデータベースをPostgreSQLに変更する方法

WordPressはデータベース管理システムとしてMySQLを使用していますが、PostgreSQLを好むユーザーからは「MySQLではなくPostgreSQLでWordPressを使用する方法はありませんか?」といった声をよく聞きます。そこで今回はPostgreSQLでWordPress をデプロイする方法をご紹介いたします。

  • EDB
2021.08.26

EDBのDBMS_SCHEDULERでセキュアなジョブをスケジューリングする方法

EDBのDBMS_SCHEDULERを使うことでDBのネイティブな機能だけでセキュアにジョブをスケジュールすることができます。今回はスーパーユーザーでのスケジュール方法と非スーパーユーザでジョブをスケジュールするセキュアな方法をご紹介いたします。

  • EDB
2021.07.02

PostgreSQL/EPAS13新機能:パラレルVacuumは高速に処理できるのか?

PostgreSQL管理者を悩ませる「肥大化」は可能な限り迅速にバキューム処理で対応する必要があります。PostgreSQL13では、単一テーブルに作成された複数のインデックスのバキューム並列を実行可能にする Parallel Vacuum機能が導入されました。本記事では検証結果をご紹介します。

ページの先頭へ戻る