オンプレや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