すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:自己管理型PostgreSQL 9.xデータベースのデータをApsaraDB RDS for PostgreSQLインスタンスに移行する

最終更新日:Sep 25, 2024

情報技術の急速な発展に伴い、クラウドコンピューティングは企業や開発者が効率を向上させ、ビジネスを拡大し、ビジネス革新を達成するために不可欠なプラットフォームとなっています。 ApsaraDB RDS for PostgreSQLは、PostgreSQLの堅牢な機能とAlibaba Cloudインフラストラクチャの柔軟性と利便性を活用して、高パフォーマンス、高弾性、使いやすく、安定した、安全なデータベースサービスを提供します。 このトピックでは、Data Transmission Service (DTS) を使用して自己管理型PostgreSQL 9.xデータベースのデータをApsaraDB RDS for PostgreSQLインスタンスに移行し、データベースエンジンのバージョンをアップグレードする方法について説明します。

あなたが始める前に

始める前に、DTSに慣れることをお勧めします。 詳細については、「DTSとは何ですか? 」をご参照ください。

データ移行テクノロジの概要

論理レプリケーションは、PostgreSQL 9.4以降でサポートされています。 PostgreSQLの論理レプリケーションは、パブリッシュおよびサブスクライブモデルに基づいて開発されています。 論理レプリケーションを使用すると、異なるバージョンのPostgreSQLを実行する異なるインスタンス、または同じインスタンス上の異なるデータベースにデータをレプリケートできます。 ストリーミングレプリケーションと比較して、論理レプリケーションはより高いレベルの柔軟性を提供し、よりきめ細かいデータレプリケーションをサポートします。 たとえば、論理レプリケーションを使用して、特定のテーブルまたはテーブルの特定の列をレプリケートできます。 論理レプリケーションは、クロスバージョンデータベースのアップグレード、異種データベースの移行、異種システムのデータ統合などのシナリオで広く使用されています。これは、論理レプリケーションにより、データベースエンジンのバージョン間の互換性が確保され、特定のデータのレプリケーションがサポートされ、柔軟性と使いやすさが向上するためです。 PostgreSQLの論理レプリケーションと論理デコード拡張機能を組み合わせたAlibaba Cloud DTSを使用して、自己管理型PostgreSQL 9.xデータベースのデータをRDSインスタンスに移行できます。

image

データ移行は、スキーマ移行、完全データ移行、および増分データ移行の各フェーズで構成されます。 各フェーズが完了した後、各フェーズに対応するデータ検証ステップが実行される。 増分データ移行フェーズおよびそのフェーズのデータ検証ステップは、データ移行タスクが終了するまで継続的に実行される。

  • スキーマ移行: データを移行する前に、DTSはソースデータベースのメタデータを読み取り、解析し、メタデータに基づいてターゲットデータベースの構文に準拠するDDLステートメントを生成します。 次に、DDL文が宛先データベースで実行され、対応するスキーマオブジェクトが作成されます。

  • 完全データ移行: 完全データ移行中、DTSはソースデータベース内のすべてのデータを分割し、分割したデータを同時にターゲットデータベースに書き込みます。 完全なデータ移行が開始されると、増分データ読み取りモジュールが起動され、論理復号拡張子ali_decodingが使用されて増分データが構文解析され、再フォーマットされたデータがオンプレミスDTSサーバに格納される。

  • 増分データ移行: 完全なデータ移行が完了すると、DTSはオンプレミスDTSサーバーに保存されている増分データを取得し、保存されているデータを再フォーマットして移行先データベースに移行します。 ali_decoding拡張機能は、リアルタイムで生成される増分データを解析して再フォーマットし、増分データをリアルタイムで宛先データベースに書き込むために使用されます。 このプロセスは、ソースデータベース内のすべての進行中のデータ変更がターゲットデータベースに書き込まれるまで続きます。 これにより、ソースデータベースがターゲットデータベースと完全に同期されるようになります。

  • データ検証: 各フェーズが完了すると、DTSはターゲットデータベースに書き込まれた対応するデータを検証します。 これにより、ソースデータベースとターゲットデータベースのデータの一貫性が確保されます。 増分データ検証中、DTSは宛先データベースに書き込まれた増分データをリアルタイムで検証して、宛先データベースに書き込まれたデータがソースデータベースのデータと一致するようにします。

使用上の注意

データ移行を実行する前に、必要な操作を完了する必要があります。 たとえば、自己管理型PostgreSQLデータベースのバージョン、RDSインスタンスのデータベースエンジンのバージョン、および自己管理型PostgreSQLデータベースの制限を確認する必要があります。

  • 自己管理型PostgreSQLデータベースのバージョンの範囲は9.4.8から10.0です。

    select version(); コマンドを実行して、自己管理型PostgreSQLデータベースのPostgreSQLバージョンを照会できます。

  • RDSインスタンスはPostgreSQL 11.0以降を実行する必要があります。

  • 自己管理型PostgreSQLデータベースの制限:

    • 移行するテーブルには、PRIMARY KEYまたはUNIQUE制約が必要であり、すべてのフィールドが一意である必要があります。 そうでない場合、宛先データベースは重複するデータレコードを含み得る。

    • ソースデータベースの名前にハイフン (-) を含めることはできません。 たとえば、dts-testdataは無効です。

    • DTSは、一時テーブル、内部トリガー、特定の関数など、ソースデータベース内の特定のアイテムを移行できません。 関数は、Cプログラミング言語のストアドプロシージャおよび関数、ならびに内部ストアドプロシージャおよび関数を含む。 DTSは、COMPOSITE、ENUM、およびRANGEタイプのカスタムパラメータを移行できます。 DTSは、次のPRIMARY KEY、FOREIGN KEY、UNIQUE、およびCHECK制約のいずれかを含むテーブルを移行できます。

    • 自己管理型PostgreSQLデータベースからデータを移行する場合、プライマリ /セカンダリの切り替えは実行できません。 それ以外の場合、データ移行は失敗します。

    • スキーマ移行中および完全データ移行中は、DDL操作を実行してデータベースまたはテーブルのスキーマを変更しないでください。 それ以外の場合、データ移行は失敗します。

詳細については、「使用状況のメモ」をご参照ください。

移行プロセス

次の図は、自己管理型PostgreSQL 9.xデータベースのデータをRDSインスタンスに移行する方法を示しています。

image

準備

アカウントの作成

  1. 自己管理型PostgreSQLデータベースのスーパーユーザーアカウントを作成し、そのアカウントを使用してデータ移行を実行します。 この例では、migrate_testアカウントが使用されています。

    CREATE USER migrate_test WITH superuser password 'your_password';
  2. アカウントが作成されているかどうかを確認します。

    \du+
                                                List of roles
      Role name   |                         Attributes                         | Member of | Description
    --------------+------------------------------------------------------------+-----------+-------------
     migrate_test | Superuser                                                  | {}        |
     postgres     | Superuser, Create role, Create DB, Replication, Bypass RLS | {}        |

パラメーターの変更

パラメーター設定がデータ移行要件を満たしているかどうかを確認します。 パラメーター設定がデータ移行要件を満たしていない場合は、次のセクションを参照してパラメーター設定を変更します。

  1. wal_levelパラメーターがlogicalに設定されているかどうかを確認します。

    SHOW wal_level;
     wal_level
    -----------
     minimal
    (1 row)

    wal_levelパラメーターがlogicalに設定されていない場合は、次のステートメントを実行して、wal_levelパラメーターの値をlogicalに変更します。

    ALTER SYSTEM SET wal_level='logical';
  2. max_wal_sendersパラメーターが0に設定されているかどうかを確認します。

    SHOW max_wal_senders;
     max_wal_senders
    -----------------
     0
    (1 row)

    max_wal_sendersパラメーターが0に設定されていない場合、パラメーターを0より大きい値に設定する必要があります。 値は64以上であることを推奨します。

    ALTER SYSTEM SET max_wal_senders=64;
  3. max_replication_slotsパラメーターが0に設定されているかどうかを確認します。

    SHOW max_replication_slots;
     max_replication_slots
    -----------------------
     0
    (1 row)

    max_replication_slotsパラメーターが0に設定されていない場合、パラメーターを0より大きい値に設定する必要があります。 値は64以上であることを推奨します。

    ALTER SYSTEM SET max_replication_slots=64;
  4. 設定を有効にするには、PostgreSQLサービスを再起動します。

DTSからのアクセスを許可する

  1. DTSが自己管理型PostgreSQLデータベースにアクセスできるように、pg_hba.confファイルに次のルールを追加します。

    host all all 100.104.0.0/16 md5
    host replication all 100.104.0.0/16 md5
  2. 設定が完了したら、データベースにログインし、次のステートメントを実行して設定を有効にします。

    SELECT pg_reload_conf();
     pg_reload_conf
    ----------------
     t
    (1 row)

データ移行に必要な拡張機能をコンパイルしてインストールします。

DTSが提供するali_decoding拡張機能をダウンロードし、自己管理型PostgreSQLデータベースをホストするサーバーに拡張機能をコンパイルしてインストールします。

  1. 自己管理型PostgreSQLデータベースのバージョンを照会します。

    この例では、PostgreSQL 9.4.14が使用されます。 PostgreSQL 9.4.14を実際のデータベースエンジンのバージョンに置き換える必要があります。

    SELECT version();
  2. PostgreSQL公式Webサイトから自己管理型PostgreSQLデータベースのバージョンのソースコードpackageforをダウンロードし、自己管理型PostgreSQLデータベースをホストするサーバーにパッケージをアップロードします。

    たとえば、サーバーがCentOS 7.9を実行している場合、PostgreSQL 9.4.14のソースコードパッケージpostgresql-9.4.14.tar.gzをダウンロードできます。

    wget https://ftp.postgresql.org/pub/source/v9.4.14/postgresql-9.4.14.tar.gz
  3. ソースコードパッケージを解凍し、ソースコードをコンパイルしてインストールします。

    1. ディレクトリを作成し、ソースコードパッケージをディレクトリに移動します。 この例では、postgresという名前のディレクトリが作成されます。

      mkdir postgres
      mv ~/postgresql-9.4.14.tar.gz postgres
    2. postgresディレクトリに移動し、ソースコードパッケージを解凍します。

      cd postgres/
      tar -zxvf postgresql-9.4.14.tar.gz
    3. ソースコードが格納されているディレクトリに移動し、インストールディレクトリを作成します。

      cd postgresql-9.4.14/
      mkdir -p /usr/local/pgsql94
    4. ソースコードを設定、コンパイル、インストールします。

      1. ソースコードを設定します。

        sudo ./configure --prefix=/usr/local/pgsql94

        を実行します。Run theエコー $? コマンドを実行して、設定結果を確認します。 値0が返された場合、設定は成功し、次のステップに進むことができます。 ゼロ以外の値が返された場合、設定は失敗しました。 問題をトラブルシューティングして、もう一度お試しください。

        重要
        • prefixパラメーターの値は、自己管理型PostgreSQLデータベースのインストールパスとは異なる必要があります。

        • ソースコードをコンパイルしてPostgreSQLをインストールする場合、PostgreSQLのオペレーティングシステムバージョンはGNUコンパイラコレクション (GCC) バージョンと一致している必要があります。

        • を実行したときにエラーが発生した場合、スド /configureコマンドを変更すると、エラーメッセージに基づいてコマンドを変更できます。 たとえば、エラーメッセージがreadlineライブラリが見つかりません。 -- without-readlineを使用して、readlineサポートを無効にします。に変更することができます。スド /configure -- without-readline.

      2. ソースコードをコンパイルします。

        sudo make

        を実行します。Run theエコー $? コマンドを実行して、設定結果を確認します。 値0が返された場合、設定は成功し、次のステップに進むことができます。 ゼロ以外の値が返された場合、設定は失敗しました。 問題をトラブルシューティングして、もう一度お試しください。

      3. ソースコードをインストールします。

        sudo make install

        を実行します。Run theエコー $? コマンドを実行して、設定結果を確認します。 値0が返された場合、設定は成功し、次のステップに進むことができます。 ゼロ以外の値が返された場合、設定は失敗しました。 問題をトラブルシューティングして、もう一度お試しください。

  4. ali_decoding拡張機能をダウンロードし、自己管理型PostgreSQLデータベースをホストするサーバーにアップロードします。

    この例では、Linuxが使用されます。 次のコマンドを実行して、拡張機能をダウンロードしてインストールできます。

    重要

    ali_decoding拡張のブランチバージョンは、ali_decoding_94である必要があります。

    sudo wget https://github.com/YeFuner/rds_dbsync/archive/refs/heads/ali_decoding_94.zip
    unzip ali_decoding_94.zip
  5. 解凍後に生成されたrds_dbsync-ali_decoding_94ディレクトリにアクセスし、コンパイルおよびインストールされているPostgreSQLのcontribディレクトリにali_decodingディレクトリをコピーします。

    cd rds_dbsync-ali_decoding_94/
    cp -r ali_decoding/ /home/postgres/postgresql-9.4.14/contrib/
    cd /home/postgres/postgresql-9.4.14/contrib/ali_decoding/
    説明

    上記のコマンドの /home/postgres/postgresql-9.4.14/contrib /ディレクトリを、ソースコードが格納されているディレクトリに置き換える必要があります。

  6. ali_decodingディレクトリにアクセスし、Makefileファイルの内容を次の情報に置き換えます。

    # contrib/ali_decoding/Makefile
    MODULE_big = ali_decoding
    MODULES = ali_decoding
    OBJS    = ali_decoding.o
    
    DATA = ali_decoding--0.0.1.sql ali_decoding--unpackaged--0.0.1.sql
    
    EXTENSION = ali_decoding
    
    NAME = ali_decoding
    
    #subdir = contrib/ali_decoding
    #top_builddir = ../..
    #include $(top_builddir)/src/Makefile.global
    #include $(top_srcdir)/contrib/contrib-global.mk
    
    #PG_CONFIG = /usr/pgsql-9.6/bin/pg_config
    #pgsql_lib_dir := $(shell $(PG_CONFIG) --libdir)
    #PGXS := $(shell $(PG_CONFIG) --pgxs)
    #include $(PGXS)
    
    # Run the following commands to install the source code:
    ifdef USE_PGXS
    PG_CONFIG = pg_config
    PGXS := $(shell $(PG_CONFIG) --pgxs)
    include $(PGXS)
    else
    subdir = contrib/ali_decoding
    top_builddir = ../..
    include $(top_builddir)/src/Makefile.global
    include $(top_srcdir)/contrib/contrib-global.mk
    endif
  7. ali_decoding拡張子をコンパイルしてインストールし、ali_decoding拡張子のインストールに必要なファイルを生成します。

    1. 拡張機能をコンパイルします。

      sudo make

      を実行します。Run theエコー $? コマンドを実行して、設定結果を確認します。 値0が返された場合、設定は成功し、次のステップに進むことができます。 ゼロ以外の値が返された場合、設定は失敗しました。 問題をトラブルシューティングして、もう一度お試しください。

    2. 拡張機能をインストールします。

      sudo make install

      を実行します。Run theエコー $? コマンドを実行して、設定結果を確認します。 値0が返された場合、設定は成功し、次のステップに進むことができます。 ゼロ以外の値が返された場合、設定は失敗しました。 問題をトラブルシューティングして、もう一度お試しください。

  8. 生成されたali_decodingファイルを、自己管理型PostgreSQLデータベースの指定されたディレクトリにコピーします。

    1. pg_configツールを使用して、現在の自己管理型PostgreSQLデータベースのカーネルで使用されているlibディレクトリを見つけ、コンパイル後に取得したali_decoding.soをlibディレクトリにインストールします。

      /usr/local/pgsql94/bin/pg_config --pkglibdir
      The following information is returned:
      /usr/local/pgsql94/lib
      
      /usr/bin/install -c -m 755 ali_decoding.so '/usr/local/pgsql94/lib/ali_decoding.so'
      /usr/bin/install -c -m 755 ali_decoding.so '/usr/local/pgsql94/lib/'
    2. pg_configツールを使用して、現在の自己管理型PostgreSQLデータベースのカーネルで使用されている共有ディレクトリを見つけ、コンパイル後に取得されたali_decoding.control、ali_decoding_0.0.1. sql、およびali_decoding_unpackaged_0.0.1. sqlをインストールします。

      /usr/local/pgsql94/bin/pg_config --sharedir
      The following information is returned:
      /usr/local/pgsql94/share
      
      /usr/bin/install -c -m 644 ali_decoding.control '/usr/local/pgsql94/share/extension/'
      /usr/bin/install -c -m 644 ali_decoding--0.0.1.sql ali_decoding--unpackaged--0.0.1.sql '/usr/local/pgsql94/share/extension/'

RDSインスタンスを作成します。

RDSインスタンスを作成し、RDSインスタンスに特権アカウントを作成します。 特権アカウントは、データ移行を実行するために使用されます。 データを移行するデータベースの情報に基づいて、RDSインスタンスにデータベースを作成します。

  • RDSインスタンス上のデータベースの名前は、自己管理型PostgreSQLデータベースと同じである必要があります。

  • RDSインスタンスのデータベースの所有者は、データ移行に使用される特権アカウントである必要があります。

手順

  1. RDSインスタンスを作成します。 詳細については、「ApsaraDB RDS for PostgreSQL インスタンスの作成」をご参照ください。

  2. 特権アカウントを作成します。 詳細については、「アカウントの作成」をご参照ください。

  3. RDSインスタンスにデータベースを作成します。 詳細については、「データベースの作成」をご参照ください。

RDSインスタンスに必要な拡張機能を作成する

\dxコマンドを実行して、自己管理型PostgreSQLデータベースに使用されている拡張機能を照会し、RDSインスタンスのターゲットデータベースに同じ拡張機能を作成します。

PostGIS拡張機能が使用されており、ソースデータベースとターゲットデータベースに使用されているPostGIS拡張機能のバージョンが異なる場合は、ターゲットデータベースに対して次のSQL文を実行して、ソースデータベースと同じバージョンの拡張機能を作成します。

CREATE EXTENSION IF NOT EXISTS postgis_raster;

DTSを使用したデータの移行

DTS移行タスクの設定方法の詳細については、「手順」をご参照ください。

完全なcutover

  1. DTS移行タスクが完了したら、移行先RDSインスタンスで完全バックアップを実行し、バックアップセットを複製して、移行先RDSインスタンスと同じデータベースエンジンバージョンとデータを持つ別のRDSインスタンスを生成します。 クローン化されたRDSインスタンスは、テスト環境での包括的な検証に使用されます。 すべての互換性の問題が解決したら、ワークロードの切り替えを開始できます。 RDSインスタンスのクローンを作成する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのデータの復元」をご参照ください。

  2. DTSタスクが増分データ移行フェーズに入り、データ同期レイテンシがカットオーバーしきい値に達したら (レイテンシが1秒未満) 、アプリケーションを停止し、ソースデータベースへのデータの書き込みを停止します。

    1. pg_hba.confファイルを設定し、次のルールに最優先順位を指定して、サービスアカウントを使用したソースデータベースへの接続を禁止します。 この例では、サービスアカウントはtest_acc1です。

      host all test_acc1 0.0.0.0/0 reject
      host replication test_acc1 0.0.0.0/0 reject

      設定が完了したら、ソースデータベースにログインし、SELECT pg_reload_conf(); ステートメントを実行して設定を有効にします。

    2. 次のSQL文を実行して、既存のすべての接続を終了します。

      SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND usename NOT IN ('migrate_test');
    3. サービスアカウントを使用して、ソースデータベースに接続します。 次のエラーが返された場合、設定は有効になります。

      FATAL:  pg_hba.conf rejects connection for host "127.0.0.1", user "test_acc1", database "postgres"
  3. ワークロードをターゲットデータベースに切り替えた後、ターゲットデータベースに新しく書き込まれたシーケンスパラメーターの値は、ソースデータベースのシーケンスパラメーターの最大値に基づいて増加しません。 この問題を解決するには、システムが自己管理型PostgreSQLデータベースへのデータの書き込みを停止した後、次の操作を実行します。ソースデータベースのシーケンスパラメーターの最大値を照会し、ターゲットデータベースのシーケンスパラメーターの初期値をソースデータベースのシーケンスパラメーターの最大値に変更します。

    次のSQL文を実行して、自己管理型PostgreSQLデータベースのsequenceパラメーターの値を照会します。 返されたSQL文をターゲットRDSインスタンスで実行します。

    DO LANGUAGE plpgsql $$
    DECLARE
      nsp name;
      rel name;
      val int8;
    BEGIN
      FOR nsp,rel IN SELECT nspname,relname FROM pg_class t2 , pg_namespace t3 WHERE t2.relnamespace=t3.oid AND t2.relkind='S'
      LOOP
        EXECUTE format($_$SELECT last_value FROM %I.%I$_$, nsp, rel) INTO val;
        raise notice '%',
        format($_$SELECT setval('%I.%I'::regclass, %s);$_$, nsp, rel, val+1);
      END LOOP;
    END;
    $$;

    次の情報は、返されるSQL文の例を示しています。

    NOTICE:  select setval('public.my_sequence'::regclass, 2);
  4. DTSコンソールで、データ逆流タスクまたはデータ同期タスクを設定して、RDSインスタンスから自己管理型PostgreSQLデータベースに増分データを送信します。 詳細については、「手順」をご参照ください。

    重要
    • この操作は、アプリケーションを起動する前に実行する必要があります。

    • データ同期タスクのソースデータベースはRDSインスタンス上のデータベースであり、ターゲットデータベースは自己管理型PostgreSQLデータベースです。

    • データ同期タスクのタイプが増分データ移行のみの場合、スキーマ同期および完全データ同期オプションを選択する必要はありません。

  5. すべてのアプリケーションの接続アドレスを宛先RDSインスタンスのエンドポイントに変更し、アプリケーションを起動します。 RDSインスタンスのエンドポイントを取得する方法の詳細については、「エンドポイントとポート番号の表示と変更」をご参照ください。

  6. アプリケーションを監視し、期待どおりに実行されることを確認します。