{RDS}DB インスタンス 間での PostgreSQL データベースの移行

-- 1. RDSインスタンスの作成
aws rds describe-db-engine-versions \
--engine postgres \
| jq -c '.DBEngineVersions | [ .Engine, .EngineVersion ]'


aws rds create-db-instance \
--db-instance-identifier postgres01 \
--allocated-storage 20 \
--db-instance-class db.t3.micro \
--engine postgres \
--master-username postgres \
--master-user-password 'password' \
--no-multi-az \
--engine-version 13.3 \
--storage-type gp2 \
--no-publicly-accessible \
--no-enable-performance-insights \
--no-auto-minor-version-upgrade

aws rds create-db-instance \
--db-instance-identifier postgres02 \
--allocated-storage 20 \
--db-instance-class db.t3.micro \
--engine postgres \
--master-username postgres \
--master-user-password 'password' \
--no-multi-az \
--engine-version 13.3 \
--storage-type gp2 \
--no-publicly-accessible \
--no-enable-performance-insights \
--no-auto-minor-version-upgrade


-- 2. PostgreSQL データベースを移行するための設定

各パラメータグループの shared_preload_libraries パラメータに pg_transport を追加します。
shared_preload_libraries パラメータは静的であるため、変更を有効にするには、データベースを再起動する必要があります。

--移行元と移行先で実施

パラメータグループの作成

aws rds create-db-parameter-group \
--db-parameter-group-name pg01 \
--db-parameter-group-family postgres13 \
--description pg01

vim a.json
[
{
"ParameterName": "shared_preload_libraries",
"ParameterValue": "pg_stat_statements,pg_transport",
"ApplyMethod": "pending-reboot"
},
{
"ParameterName": "max_worker_processes",
"ParameterValue": "18",
"ApplyMethod": "pending-reboot"
}
]

aws rds modify-db-parameter-group \
--db-parameter-group-name pg01 \
--parameters file://a.json

 


パラメータグループ変更

aws rds modify-db-instance \
--db-instance-identifier postgres01 \
--db-parameter-group-name pg01 \
--apply-immediately

aws rds modify-db-instance \
--db-instance-identifier postgres02 \
--db-parameter-group-name pg01 \
--apply-immediately

インスタンス再起動

aws rds reboot-db-instance --db-instance-identifier postgres01
aws rds reboot-db-instance --db-instance-identifier postgres02

aws rds describe-db-instances | jq -c '.DBInstances | [ .DBInstanceIdentifier , .DBInstanceStatus ] '

再起動は2回必要

-- 3. pg_transport PostgreSQL 拡張機能をインストール

--移行元と移行先で実施

移行先はpostgresデータベースに接続して実行
移行元はtestデータベースに接続して実行

CREATE EXTENSION pg_transport;

 

-- 4. transport.import_from_server 関数を使った PostgreSQL データベースの移行

移行先 DB インスタンスには、まだ移行される移行元データベースと同じ名前のデータベースを含めることはできません。含めた場合移行は失敗します。
移行中に、移行元 DB インスタンスにインストールできる唯一の拡張機能は pg_transport です。
移行元データベースのアクセス権限および所有権情報は、移行先データベースには移行されません。

--移行先で実施

SELECT transport.import_from_server(
'postgres01.cxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com',
5432,
'postgres',
'password',
'test',
'password',
false);

発生したエラー1
ERROR: pg_transport extension must be installed on source database

発生したエラー2
ERROR: max_worker_processes is too low on the destination cluster (should be at least 18)

 

-- 5. クリーンアップ


-- RDSインスタンス削除
aws rds delete-db-instance \
--db-instance-identifier postgres01 \
--skip-final-snapshot

aws rds delete-db-instance \
--db-instance-identifier postgres02 \
--skip-final-snapshot


パラメータグループの一覧
aws rds describe-db-parameter-groups
aws rds describe-db-parameter-groups | jq -r '.DBParameterGroups[].DBParameterGroupName'


パラメータグループの削除
aws rds delete-db-parameter-group --db-parameter-group-name pg01