Azure Database for PostgreSQLにてサーバーパラメータのタイムゾーンが反映されない問題を調べた

2022.03.31

いわさです。

AzureのフルマネージドなPostgreSQLサービスに、Azure Datasbase for PostgreSQLがあります。

Azure Database for PostgreSQLではAzureポータルからサーバー設定を行う、サーバーパラメータ画面があります。
タイムゾーンもそちらから設定が可能です。

Asia/Tokyoに変更すると、データベース上のタイムゾーンに反映されます。

サーバーパラメータにはタイプがあり、動的なタイムゾーンパラメータは変更すると、即反映されます。

postgres=> show timezone;
 TimeZone 
----------
 UTC
(1 row)

postgres=> show timezone;
  TimeZone  
------------
 Asia/Tokyo
(1 row)

反映されないデータベースがあった

しかし、今回サーバーパラメータが反映されないデータベースがありました。

サーバーパラメータは変更したのですが、PostgreSQLクライアントで確認するとAsia/Tokyoのまま。

postgres=> show timezone;
  TimeZone  
------------
 Asia/Tokyo
(1 row)

よくわからなくて困っていたのですが、色々調べたところどうやらPostgreSQLの場合は、データベース毎に個別でタイムゾーンを設定出来るみたいです。
PostgreSQLユーザーであれば当然なのかもしれないのですが、普段使いをしない私は意外にハマりました。

例えば、以下のように設定すると、サーバーパラメータがUTCでも対象データベースではAsia/Tokyoになります。
設定後はセッションの再接続をしないと有効になりません。

postgres=> show timezone;
  TimeZone  
------------
 UTC
(1 row)

postgres=> ALTER DATABASE postgres SET timezone TO 'Asia/Tokyo';
ALTER DATABASE
postgres=> show timezone;
  TimeZone  
------------
 UTC
(1 row)

postgres=> quit
$ psql -h hoge-postgresql.postgres.database.azure.com -h hoge-postgresql.postgres.database.azure.com -U hoge@hoge-postgresql -d postgres
Password for user postgre@iwasa0331west-postgresql: 
psql (14.1, server 11.12)

postgres=> show timezone;
 TimeZone 
----------
 Asia/Tokyo
(1 row)

サーバーパラメータを優先したい

個別に設定せずにサーバーパラメータを優先できたらなぁと思っていました。
個別に設定するとサーバーパラメータが無視されてしまうので、設定を無効化してやれば良いはず。

対象データベースに設定したタイムゾーン設定をリセットしてやります。

postgres=> ALTER DATABASE postgres RESET timezone;
ALTER DATABASE

そうするとリセット後は、サーバーパラメータのタイムゾーンがすぐに反映されるようになりました。

postgres=> show timezone;
 TimeZone 
----------
 UTC
(1 row)

postgres=> show timezone;
  TimeZone  
------------
 Asia/Tokyo
(1 row)

さいごに

本日はAzure Database for PostgreSQLにてサーバーパラメータのタイムゾーンが反映されない問題を調べました。

PostgreSQLを使う方であれば基本事項だと思うのですが、Azureポータルのサーバーパラメータの概念をあまり理解していなかったり、ところどころクライアントからの再接続をしないと反映されなかったり、少しはまったので、備忘録として残しておきます。

同じように困った方の参考になると良いなと思います。