オンプレ・IaaSからAzure DB for PostgreSQL Flexible Serverに

オンプレやIaaSで動いてるPostgreSQLを、Azure Database for PostgreSQL Flexible Serverに移行する時に、同程度のサイズ(vCPU数、メモリ、ストレージ)なら、postgresql.confのパラメータも大体同じで良かろうとなるんだけど、全部チェックするのは面倒なのでデフォルトから書き換えた(initdbが書き換えるものも)パラメータだけをFlexible Serverに反映するazコマンドを出力したい、だけのスクリプト。

#!/bin/bash

#PostgreSQLの設定の差分のFlexible Serverへの反映
#RHEL / CentOS系(RPM)

readonly resourceGroup='rioFlexServerRg'
readonly serverName='rioflexserver'

mkdir /tmp/pgsql
cd /tmp/pgsql
pgsql=$(rpm -qa postgresql-server)
dnf download ${pgsql}
rpm2cpio ${pgsql}.rpm | cpio -iv --to-stdout ./usr/share/pgsql/postgresql.conf.sample > ./postgresql.conf
params=$(diff -d ./postgresql.conf /var/lib/pgsql/data/postgresql.conf | grep '^> [^#]' | sed 's/^> //' | sort)
OLDIFS=$IFS
IFS='
'
for p in $params; do
    key=$(echo $p | cut -d= -f1 | sed 's/^ *$//')
    value=$(echo $p | cut -d= -f2 | sed 's/^ *\| *$//' | sed 's/\([^\t]*\)[\t]*#.*/\1/')
    echo "# set ${key} = ${value}"
    if [[ "$value" =~ "MB" ]]; then
        value=$(expr $(echo ${value} | sed 's/\([0-9]*\)[^0-9]*/\1/') "*" 1024)
    fi
    if [[ "$value" =~ "GB" ]]; then
        value=$(expr $(echo ${value} | sed 's/\([0-9]*\)[^0-9]*/\1/') "*" 1024 "*" 1024)
    fi
    echo "az postgres flexible-server parameter set -g ${resourceGroup} -s ${serverName} -n ${key} -v ${value}"
done

IFS=$OLDIFS
cd
rm -rf /tmp/pgsql

実行すると以下のようになるけれど、これら全てがFlexible Serverで利用できる訳では無いので注意。

# set datestyle  = 'iso, ymd'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n datestyle  -v 'iso, ymd'
# set default_text_search_config  = 'pg_catalog.simple'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n default_text_search_config  -v 'pg_catalog.simple'
# set dynamic_shared_memory_type  = posix
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n dynamic_shared_memory_type  -v posix
# set lc_messages  = 'ja_JP.UTF-8'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n lc_messages  -v 'ja_JP.UTF-8'
# set lc_monetary  = 'ja_JP.UTF-8'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n lc_monetary  -v 'ja_JP.UTF-8'
# set lc_numeric  = 'ja_JP.UTF-8'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n lc_numeric  -v 'ja_JP.UTF-8'
# set lc_time  = 'ja_JP.UTF-8'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n lc_time  -v 'ja_JP.UTF-8'
# set listen_addresses  = '*'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n listen_addresses  -v '*'
# set log_timezone  = 'Asia/Tokyo'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n log_timezone  -v 'Asia/Tokyo'
# set max_connections  = 100
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n max_connections  -v 100
# set max_wal_size  = 1GB
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n max_wal_size  -v 1048576
# set min_wal_size  = 80MB
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n min_wal_size  -v 81920
# set shared_buffers  = 128MB
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n shared_buffers  -v 131072
# set timezone  = 'Asia/Tokyo'
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n timezone  -v 'Asia/Tokyo'
# set wal_level  = logical
az postgres flexible-server parameter set -g rioFlexServerRg -s rioflexserver -n wal_level  -v logical