このトピックでは、pg_dumpおよびpg_restoreを使用して、データベースを自己管理型PostgreSQLインスタンスからApsaraDB RDS for PostgreSQLインスタンスに移行する方法について説明します。 これは、pg_dumpとpg_restoreに精通しており、Data Transmission Service (DTS) やApsaraDB RDS for PostgreSQLのクラウド移行機能など、Alibaba Cloudが提供する移行サービスと機能を使用しない場合に適用されます。
前提条件
自己管理型PostgreSQLインスタンスと同じバージョンのPostgreSQLを実行するRDSインスタンスが作成されます。 詳細については、「ApsaraDB RDS for PostgreSQL インスタンスの作成」をご参照ください。
説明pg_dumpとpg_restoreを使用して、PostgreSQLバージョン間でデータベースを移行できます。 互換性の問題を回避するために、セルフマネージドPostgreSQLインスタンスとRDSインスタンスに同じPostgreSQLバージョンを使用することを推奨します。
セルフマネージドPostgreSQLインスタンスがデプロイされているサーバーで
psql -- versionコマンドを実行して、インスタンスのPostgreSQLバージョンを照会できます。移行完了後、RDSインスタンスのメジャーエンジンバージョンをアップグレードできます。 詳細については、「メジャーエンジンのバージョンのアップグレード」をご参照ください。
自己管理型PostgreSQLインスタンスがElastic Compute Service (ECS) インスタンスにデプロイされている場合、ECSインスタンスと同じリージョンおよび仮想プライベートクラウド (VPC) にRDSインスタンスを作成することを推奨します。 このようにして、データは内部ネットワークを介して移行され、より高速で安全です。
自己管理型PostgreSQLインスタンスがデプロイされているサーバーからのアクセスを許可するように、RDSインスタンスのホワイトリストが設定されています。 詳細については、「IPアドレスホワイトリストの設定」をご参照ください。
RDSインスタンス用に特権アカウントが作成されます。 詳細については、「アカウントの作成」をご参照ください。
RDSインスタンスのエンドポイントとポート番号が取得されます。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのエンドポイントとポート番号の表示と変更」をご参照ください。
説明自己管理型PostgreSQLインスタンスがRDSインスタンスと同じリージョンおよびVPCにあるECSインスタンスにデプロイされている場合、RDSインスタンスの内部エンドポイントとポート番号を取得する必要があります。 それ以外の場合は、RDSインスタンスのパブリックエンドポイントとポート番号を取得する必要があります。
スーパーユーザーロールを引き受ける管理者アカウントが、自己管理型PostgreSQLインスタンス用に作成されます。
pg_dumpとpg_restoreは、自己管理型PostgreSQLインスタンスがデプロイされているサーバーにインストールされます。
説明自己管理型PostgreSQLインスタンスをオンプレミスマシンにインストールすると、pg_dumpとpg_restoreが自動的にインストールされます。 詳細を照会するには、
pg_dump -- versionコマンドとpg_restore -- versionコマンドを実行します。
手順
このトピックで説明する移行ソリューションは、単一のデータベースの移行に適しています。 複数のデータベースまたは自己管理型PostgreSQLインスタンス全体をRDSインスタンスに移行する場合は、次のソリューションを参照してください。
自己管理型PostgreSQLインスタンス上の複数のデータベースを一度に移行するには、DTSを使用することを推奨します。 詳細については、「DTSを使用したセルフマネージドPostgreSQLデータベースからApsaraDB RDS For PostgreSQLインスタンスへのデータの移行」をご参照ください。
セルフマネージド型PostgreSQLインスタンス全体を移行するには、ApsaraDB RDS for PostgreSQLのクラウド移行機能を使用することを推奨します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのクラウド移行機能の使用」をご参照ください。
手順1: 移行するデータベースに関する情報を確認する
自己管理型PostgreSQLインスタンスに接続します。 psqlコマンドラインで、\lコマンドを実行してデータベースに関する情報を照会し、移行するデータベースのOwner、Encoding、Collate、およびCtypeの値を確認します。
この例では、testdbという名前のデータベースが移行されます。 データベースの情報が返されます。所有者はtestuser、EncodingはUTF8、Collateはen_US.UTF-8、Ctypeはen_US.UTF-8です。
List of databases
Name | Owner | Encoding | Collate | Ctype | ICU Locale | Locale Provider | Access privileges
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =Tc/postgres +
| | | | | | | postgres=CTc/postgres
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
| | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
| | | | | | | postgres=CTc/postgres
testdb | testuser | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
(4 rows)ステップ2: ユーザーの移行
自己管理型PostgreSQLインスタンスがデプロイされているサーバーに接続し、次のコマンドを実行して、移行するデータベースの所有者
testuserをエクスポートします。pg_dumpall -g -h 127.0.0.1 -p 5432 -U testuserサンプル出力:
説明コマンド出力の [ロール] セクションでは、
testuserユーザーの権限に関連するステートメントを取得できます。-- -- PostgreSQL database cluster dump -- SET default_transaction_read_only = off; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; -- -- Roles -- CREATE ROLE postgres; ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS; CREATE ROLE testuser; ALTER ROLE testuser WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U='; -- -- User Configurations -- -- -- PostgreSQL database cluster dump complete --特権アカウントを使用してRDSインスタンスに接続します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスへの接続」をご参照ください。
取得したSQL文で、
testuserユーザーの権限に関連するSUPERUSERをrds_SUPERUSERに変更します。 RDSインスタンスで、自己管理型PostgreSQLインスタンスのtestuserユーザーと同じ権限を持つアカウントを作成します。CREATE ROLE testuser; ALTER ROLE testuser WITH rds_SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U=';
手順3: RDSインスタンスでのターゲットデータベースの作成
特権アカウントを使用してRDSインスタンスに接続します。
ターゲットデータベースを作成します。 ターゲットデータベースが、自己管理型PostgreSQLインスタンスのソースデータベースと同じ文字セット、同じCollate、およびCtype設定であることを確認します。 たとえば、ターゲットデータベースには、手順1で取得したソースデータベースと同じ設定が必要です。Encodingは
UTF8、Collateはen_US.UTF-8、Ctypeはen_US.UTF-8です。CREATE DATABASE <Name of the destination database> WITH OWNER <Database owner> TEMPLATE template0 ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8';説明ターゲットデータベースの名前は、自己管理型PostgreSQLインスタンスのソースデータベースの名前とは異なる場合があります。
ターゲットデータベースの所有者は、自己管理型PostgreSQLインスタンスのソースデータベースの所有者と同じである必要があります。
ステップ4: データの移行
次のいずれかの方法を使用して、データを移行できます。
自己管理型PostgreSQLインスタンスがデプロイされているサーバーがRDSインスタンスに接続できる場合は、オンライン移行を使用することを推奨します。
セルフマネージドPostgreSQLインスタンスがデプロイされているサーバーがRDSインスタンスに接続できない場合は、オフライン移行を使用することを推奨します。 具体的には、pg_dumpを使用してデータをファイルにエクスポートし、RDSインスタンスが接続するホストにファイルをコピーしてから、pg_restoreを使用してファイルをRDSインスタンスにインポートします。
オンライン移行
パスワードファイルを設定します。 詳細については、「パスワードファイル」をご参照ください。
自己管理型PostgreSQLインスタンスがデプロイされているサーバーで次のコマンドを実行し、パスワードを保存するpgpassファイル:
vi ~/.pgpassiを押して挿入モードに入り、パスワード関連の内容を入力します。説明パスワードファイルの内容は、
host:port:dbname:username:password形式です。デフォルトでは、PostgreSQLデータベースのメタデータは小文字で格納されます。 したがって、dbnameおよびusernameパラメーターの値は小文字である必要があります。 指定したデータベース名とユーザー名が大文字で、二重引用符 (") で囲まれている場合、上記の条件は適用されません。
Endpoint of the RDS instance:5432:Name of the destination database:Username of the owner of the destination database:Password 127.0.0.1:5432:Name of the source database on the self-managed PostgreSQL instance:Username of the superuser:Password[Esc]を押して:wqと入力し、挿入モードを終了します。のアクセス許可を変更する
. pgpassファイルを作成します。chmod 700 ~/.pgpass
自己管理型PostgreSQLインスタンスがデプロイされているサーバーで次のコマンドを実行し、データを移行します。
nohup pg_dump -F p -h 127.0.0.1 -p 5432 -U <Superuser of the self-managed instance> -d <Name of the database that you want to migrate> --no-tablespaces | time psql -h <Endpoint of the RDS instance> -p 5432 -U <Username of the owner of the destination database> --single-transaction <Name of the destination database> > ./pg.dump.log 2>&1 &説明pg.dump.logファイルを照会して、エラーログが存在するかどうかを確認できます。 ファイルが空の場合、移行は成功です。 この場合、RDSインスタンスにログインして、移行されたデータを表示できます。
-- single-transactionオプションは、上記のコマンドで指定されています。 データのインポート中、すべての操作は1つのトランザクションにカプセル化され、すべての操作がすべて成功またはすべて失敗するようになります。 すべての操作が失敗した場合は、問題を解決してデータを再度直接インポートできます。
オフライン移行
自己管理型PostgreSQLインスタンスがデプロイされているサーバーで次のコマンドを実行し、pg.dumpファイルをエクスポートします。
nohup pg_dump -F c -h 127.0.0.1 -p 5432 -U <Superuser of the self-managed instance> -d <Name of the database that you want to migrate> --no-tablespaces -f ./pg.dump > ./pg.dump.log 2>&1 &説明エクスポートが完了するのを待ちます。 次に、pg.dump.logファイルにエラーログが存在しないことを確認します。
RDSインスタンスが接続できるホストに
pg.dumpファイルをコピーします。 次に、ファイルをインポートします。説明この方法を使用する場合、RDSインスタンスのホワイトリストを設定して、ホストがインスタンスにアクセスできるようにする必要があります。 詳細については、「IPアドレスホワイトリストの設定」をご参照ください。
単一スレッドのインポート
pg_restore -h <Endpoint of the RDS instance> -p 5432 -U <Username of the owner of the destination database> -d <Name of the destination database> --no-tablespaces --single-transaction pg.dump >./pg.restore.log説明インポートが完了するまで待ちます。
pg.restore.logファイルを照会して、エラーログが存在するかどうかを確認できます。 ファイルが空の場合、移行は成功です。 この場合、RDSインスタンスにログインして、移行されたデータを表示できます。-- single-transactionオプションは、上記のコマンドで指定されています。 データのインポート中、すべての操作は1つのトランザクションにカプセル化され、すべての操作がすべて成功またはすべて失敗するようになります。 すべての操作が失敗した場合は、問題を解決してデータを再度直接インポートできます。
マルチスレッド並列インポート
pg_restore -h <Endpoint of the RDS instance> -p 5432 -U <Username of the owner of the destination database> -d <Name of the destination database> --no-tablespaces -j <Number of parallel threads> pg.dump >./pg.restore.log 2>&1 &説明並列処理を有効にするために使用される
-- single-transactionオプションと-jオプションを同時に使用することはできません。-jオプションの値は正の整数です。 オプションの最大値は、システムのCPUコア数の2倍または4倍にすることを推奨します。 これにより、システムリソースが完全に利用され、多数の並列タスクによって引き起こされるリソースの競合およびパフォーマンスの低下が防止されます。このメソッドは、トランザクションをカプセル化するために
-- single-transactionオプションを使用しません。 データのインポート中にエラーが報告された場合は、問題を解決し、RDSインスタンスのターゲットデータベース内のすべてのテーブルをクリアしてから、データを再度インポートする必要があります。 これにより、データの一貫性を確保できます。
関連ドキュメント
ビジネス要件に基づいて、このトピックのコマンドのパラメーターをさらに設定できます。 詳しくは、以下のドキュメントをご参照ください。
このトピックで説明する移行ソリューションは、単一のデータベースの移行に適しています。 複数のデータベースまたは自己管理型PostgreSQLインスタンス全体をRDSインスタンスに移行する場合は、次のソリューションを参照してください。
自己管理型PostgreSQLインスタンス上の複数のデータベースを一度に移行するには、DTSを使用することを推奨します。 詳細については、「DTSを使用したセルフマネージドPostgreSQLデータベースからApsaraDB RDS For PostgreSQLインスタンスへのデータの移行」をご参照ください。
セルフマネージド型PostgreSQLインスタンス全体を移行するには、ApsaraDB RDS for PostgreSQLのクラウド移行機能を使用することを推奨します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのクラウド移行機能の使用」をご参照ください。