pgLoaderを使用してMySQLデータベースをPostgreSQLに移行する方法

前書き

「Postgres」とも呼ばれるPostgreSQLは、オープンソースのリレーショナルデータベース管理システム(RDBMS)です。 近年、drastic growth in popularityが見られ、多くの開発者や企業が他のデータベースソリューションからPostgresにデータを移行しています。

特に、あるデータベース管理システムから別のデータベース管理システムに移行する場合、データベースを移行することは困難です。 pgLoaderは、PostgreSQLへの移行プロセスを簡素化することを目的としたオープンソースのデータベース移行ツールです。 いくつかのファイルタイプとRBDMS(MySQLSQLiteを含む)からPostgreSQLへの移行をサポートします。

このチュートリアルでは、pgLoaderをインストールし、それを使用して、リモートMySQLデータベースをSSL接続経由でPostgreSQLに移行する方法について説明します。 チュートリアルの終わり近くで、pgLoaderが役立ついくつかの異なる移行シナリオについても簡単に触れます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • それぞれがUbuntu18.04を実行しているtwoサーバーへのアクセス。 両方のサーバーにファイアウォールとsudo特権が設定された非rootユーザーが必要です。 これらを設定するには、Initial Server Setup guide for Ubuntu 18.04をたどることができます。

  • MySQLがone of the serversにインストールされています。 これを設定するには、How To Install MySQL on Ubuntu 18.04に関するガイドのSteps 1, 2, and 3に従ってください。 ここにリンクされているすべての前提条件のチュートリアルを完了するには、MySQLインストールガイドのStep 3で説明されているように、パスワードで認証するようにrootMySQLユーザーを構成する必要があることに注意してください。

  • PostgreSQLがthe other serverにインストールされています。 これを設定するには、ガイドHow To Install and Use PostgreSQL on Ubuntu 18.04Step 1を完了します。

  • MySQL serverも、暗号化された接続を受け入れるように構成する必要があります。 これを設定するには、オプションのStep 6を含め、How To Configure SSL/TLS for MySQL on Ubuntu 18.04に関するチュートリアルのすべてのステップを完了します。 このガイドに従うときは、pgLoaderを使用してデータを移行するために、PostgresマシンからMySQLサーバーに接続できる必要があるため、必ずPostgreSQL serverをMySQLクライアントマシンとして使用してください。

このガイド全体を通して、MySQLをインストールしたサーバーは「MySQL server」と呼ばれ、このマシンで実行する必要のあるコマンドは、次のように青い背景で表示されることに注意してください。

同様に、このガイドでは他のサーバーを「PostgreSQL」または「Postgres” server」と呼び、そのマシンで実行する必要のあるコマンドはすべて赤い背景で表示されます。

混乱を避けるために、このチュートリアルに従うときはこれらを念頭に置いてください。

[[step-1 -—- optional-creating-a-sample-database-and-table-in-mysql]] ==ステップ1—(オプション)MySQLでサンプルデータベースとテーブルを作成する

この手順では、テストデータベースを作成し、ダミーデータを入力するプロセスについて説明します。 このテストケースでpgLoaderの使用を練習することをお勧めしますが、移行するデータベースがすでにある場合は、next stepに進むことができます。

MySQLサーバーでMySQLプロンプトを開くことから始めます。

mysql -u root -p

root MySQLユーザーのパスワードを入力すると、MySQLプロンプトが表示されます。

そこから、次のコマンドを実行して新しいデータベースを作成します。 データベースには任意の名前を付けることができますが、このガイドではsource_dbという名前を付けます。

CREATE DATABASE source_db;

次に、USEコマンドを使用してこのデータベースに切り替えます。

USE source_db;
OutputDatabase changed

このデータベース内で、次のコマンドを使用してサンプルテーブルを作成します。 ここでは、このテーブルにsample_tableという名前を付けますが、別の名前を付けてもかまいません。

CREATE TABLE sample_table (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    start_date DATE,
    salary VARCHAR(50)
);

次に、次のコマンドを使用して、このテーブルに従業員のサンプルデータを入力します。

INSERT INTO sample_table (employee_id, first_name, last_name, start_date, salary)
VALUES (1, 'Elizabeth', 'Cotten', '2007-11-11', '$105433.18'),
(2, 'Yanka', 'Dyagileva', '2017-10-30', '$107540.67'),
(3, 'Lee', 'Dorsey', '2013-06-04', '$118024.04'),
(4, 'Kasey', 'Chambers', '2010-08-18', '$116456.98'),
(5, 'Bram', 'Tchaikovsky', '2018-09-16', '$61989.50');

これに続いて、MySQLプロンプトを閉じることができます。

exit

ダミーデータがロードされたサンプルデータベースができたので、PostgreSQLサーバーにpgLoaderをインストールする次のステップに進むことができます。

[[step-2 -—- installing-pgloader]] ==ステップ2—pgLoaderのインストール

pgLoaderは、さまざまなソースからPostgreSQLデータベースにデータをロードできるプログラムです。 PostgreSQL’s COPY commandを使用して、ソースデータベースまたはファイル(comma-separated values (CSV)ファイルなど)からターゲットPostgreSQLデータベースにデータをコピーします。

pgLoaderはデフォルトのUbuntuAPTリポジトリから入手でき、aptコマンドを使用してインストールできます。 ただし、このガイドでは、SSL接続を介したMySQLからの移行を可能にする機能であるpgLoaderのuseSSLオプションを利用します。 この機能は最新バージョンのpgLoaderでのみ使用できます。このバージョンの執筆時点では、GitHubリポジトリのソースコードを使用してのみインストールできます。

pgLoaderをインストールする前に、その依存関係をインストールする必要があります。 最近行っていない場合は、your Postgres server’sパッケージインデックスを更新します。

sudo apt update

次に、次のパッケージをインストールします。

  • sbclCommon Lispコンパイラ

  • unzip.zipファイルのデアーカイバ

  • libsqlite3-dev:SQLite3の開発ファイルのコレクション

  • gawk:パターンスキャンおよび処理言語である「GNUawk」の略

  • curl:URLからデータを転送するためのコマンドラインツール

  • make:パッケージのコンパイルを管理するためのユーティリティ

  • freetds-dev:MSSQLおよびSybaseデータベース用のクライアントライブラリ

  • libzip-dev:zipアーカイブを読み取り、作成、および変更するためのライブラリ

次のコマンドを使用して、これらの依存関係をインストールします。

sudo apt install sbcl unzip libsqlite3-dev gawk curl make freetds-dev libzip-dev

プロンプトが表示されたら、ENTERを押して、これらのパッケージをインストールすることを確認します。

次に、pgLoader GitHubプロジェクトのReleases pageに移動して、最新のリリースを見つけます。 このガイドでは、この記事の執筆時点で最新のリリースであるversion 3.6.1を使用します。 Assetsメニューまで下にスクロールし、Source codeというラベルの付いたtar.gzファイルのリンクをコピーします。 次に、リンクを次のwgetコマンドに貼り付けます。 これにより、tarballがサーバーにダウンロードされます。

wget https://github.com/dimitri/pgloader/archive/v3.6.1.tar.gz

tarballを抽出します。

tar xvf v3.6.1.tar.gz

これにより、サーバー上にいくつかの新しいディレクトリとファイルが作成されます。 新しいpgLoader親ディレクトリに移動します。

cd pgloader-3.6.1/

次に、makeユーティリティを使用してpgloaderバイナリをコンパイルします。

make pgloader

このコマンドは、pgloaderバイナリをビルドするのに少し時間がかかります。

バイナリファイルを、Ubuntuが実行可能ファイルを探す場所である/usr/local/binディレクトリに移動します。

sudo mv ./build/bin/pgloader /usr/local/bin/

以下のように、バージョンを確認することにより、pgLoaderが正しくインストールされたことをテストできます。

pgloader --version
Outputpgloader version "3.6.1"
compiled with SBCL 1.4.5.debian

pgLoaderがインストールされましたが、移行を開始する前に、PostgreSQLインスタンスとMySQLインスタンスの両方にいくつかの設定変更を行う必要があります。 まず、PostgreSQLサーバーに焦点を当てます。

[[step-3 -—- creating-a-postgresql-role-and-database]] ==ステップ3—PostgreSQLロールとデータベースの作成

pgloaderコマンドは、ファイルから、またはデータベースから直接ソースデータをコピーし、それをPostgreSQLデータベースに挿入することで機能します。 このため、PostgresデータベースにアクセスできるLinuxユーザーとしてpgLoaderを実行するか、loadコマンドで適切な権限を持つPostgreSQLロールを指定する必要があります。

PostgreSQLは、rolesを使用してデータベースアクセスを管理します。 ロールの構成方法に応じて、データベースユーザーまたはデータベースユーザーのグループとして考えることができます。 ほとんどのRDBMSでは、CREATE USERSQLコマンドを使用してユーザーを作成します。 ただし、Postgresにはcreateuserという便利なスクリプトがインストールされています。 このスクリプトは、コマンドラインから直接実行できるCREATE USERSQLコマンドのラッパーとして機能します。

[。注意]##

Note: PostgreSQLでは、パスワードではなく、デフォルトでIdentification Protocolまたはidentの認証方法を使用してデータベースユーザーとして認証します。 これには、PostgreSQLがクライアントのUbuntuユーザー名を取得し、許可されたPostgresデータベースユーザー名として使用することが含まれます。 これにより、多くの場合、セキュリティが強化されますが、外部プログラムがデータベースの1つに接続したい場合にも問題が発生する可能性があります。

pgLoaderは、pgloaderコマンドを発行するLinuxユーザープロファイルと同じ名前を共有している限り、identメソッドで認証するロールを介してPostgresデータベースにデータをロードできます。 ただし、このプロセスをできるだけ明確にするために、このチュートリアルでは、identメソッドではなくパスワードで認証する別のPostgreSQLロールの設定について説明します。

Postgresサーバーで次のコマンドを実行して、新しいロールを作成します。 新しい役割のパスワードの入力を求めるプロンプトをcreateuserに指示する-Pフラグに注意してください。

sudo -u postgres createuser --interactive -P

最初に、sudoパスワードの入力を求められる場合があります。 スクリプトは、新しいロールの名前を入力するように求めます。 このガイドでは、この役割をpgloader_pgと呼びます。

OutputEnter name of role to add: pgloader_pg

その後、createuserにより、このロールのパスワードを入力して確認するように求められます。 手順5で移行を実行するために必要になるため、このパスワードを必ずメモしてください。

OutputEnter password for new role:
Enter it again:

最後に、スクリプトは、新しい役割をスーパーユーザーとして分類する必要があるかどうかを尋ねます。 PostgreSQLでは、スーパーユーザーロールを使用してデータベースに接続すると、ログインする権利を除き、データベースのすべての権限チェックを回避できます。 このため、スーパーユーザー特権を軽視しないでください。データベースの大部分を実行するPostgreSQL documentation recommendsは、非スーパーユーザーの役割として機能します。 ただし、pgLoaderはデータにアクセスしてテーブルにロードするための幅広い特権を必要とするため、この新しい役割にスーパーユーザー特権を安全に付与できます。 これを行うには、yと入力し、ENTERを押します。

Output. . .
Shall the new role be a superuser? (y/n) y

PostgreSQLには、コマンドラインからデータベースを作成できる別の便利なスクリプトが付属しています。 pgLoaderにはソースデータをロードできるターゲットデータベースも必要なので、次のコマンドを実行して作成します。 このデータベースにnew_dbという名前を付けますが、必要に応じて自由に変更してください。

sudo -u postgres createdb new_db

エラーがない場合、このコマンドは出力なしで完了します。

専用のPostgreSQLユーザーと、MySQLデータをロードできる空のデータベースが用意できたので、移行を実行する前に必要な変更がいくつかあります。 ソースデータベースにアクセスできる専用のMySQLユーザーを作成し、クライアント側の証明書をUbuntuの信頼できる証明書ストアに追加する必要があります。

[[step-4 -—- creating-a-dedicated-user-in-mysql-and-managing-certificates]] ==ステップ4—MySQLでの専用ユーザーの作成と証明書の管理

スヌーパーからデータを保護することは、データベース管理者の仕事の中で最も重要な部分の1つです。 あるマシンから別のマシンにデータを移行すると、暗号化されていない場合、悪意のある攻撃者がネットワーク接続を通過するパケットをsniffする機会が開かれます。 このステップでは、pgLoaderがSSL接続を介して移行を実行するために使用する専用のMySQLユーザーを作成します。

MySQLプロンプトを開くことから始めます。

mysql -u root -p

MySQLプロンプトから、次のCREATE USERコマンドを使用して新しいMySQLユーザーを作成します。 このユーザーにpgloader_myという名前を付けます。 このユーザーはPostgreSQLサーバーからのみMySQLにアクセスするため、必ずyour_postgres_server_ipをPostgreSQLサーバーのパブリックIPアドレスに置き換えてください。 さらに、passwordを安全なパスワードまたはパスフレーズに置き換えます。

CREATE USER 'pgloader_my'@'your_postgres_server_ip' IDENTIFIED BY 'password' REQUIRE SSL;

このコマンドの最後にあるREQUIRE SSL句に注意してください。 これにより、pgloader_myユーザーが安全なSSL接続を介してのみデータベースにアクセスするように制限されます。

次に、pgloader_myユーザーにターゲットデータベースとそのすべてのテーブルへのアクセスを許可します。 ここでは、オプションの手順1で作成したデータベースを指定しますが、移行する独自のデータベースがある場合は、source_dbの代わりにその名前を使用します。

GRANT ALL ON source_db.* TO 'pgloader_my'@'your_postgresql_server_ip';

次に、FLUSH PRIVILEGESコマンドを実行して許可テーブルを再ロードし、特権の変更を有効にします。

FLUSH PRIVILEGES;

この後、MySQLプロンプトを閉じることができます。

exit

次に、Postgresサーバーターミナルに戻り、新しいpgloader_myユーザーとしてMySQLサーバーにログインしてみます。 configuring SSL/TLS for MySQLの前提条件ガイドに従っている場合は、PostgreSQLサーバーにmysql-clientが既にインストールされており、次のコマンドで接続できるはずです。

mysql -u pgloader_my -p -h your_mysql_server_ip

コマンドが成功すると、MySQLプロンプトが表示されます。

pgloader_myユーザーが正常に接続できることを確認したら、先に進んでプロンプトを閉じます。

exit

この時点で、Postgresマシンからソースデータベースにアクセスできる専用のMySQLユーザーがいます。 ただし、SSLを使用してMySQLデータベースを移行しようとすると、失敗します。

これは、pgLoaderがMySQLの構成ファイルを読み取ることができないため、前提条件のSSL/TLS configuration guideでPostgreSQLサーバーにコピーしたCA証明書またはクライアント証明書を探す場所がわからないためです。 ただし、SSL要件を無視するのではなく、MySQLへの接続にSSLが必要な場合、pgLoaderでは信頼できる証明書を使用する必要があります。 したがって、ca.pemファイルとclient-cert.pemファイルをUbuntu’s trusted certificate storeに追加することで、この問題を解決できます。

これを行うには、ca.pemファイルとclient-cert.pemファイルを/usr/local/share/ca-certificates/ディレクトリにコピーします。 これらのファイルの名前も変更して、.crtファイル拡張子を付ける必要があることに注意してください。 名前を変更しないと、システムはこれらの新しい証明書を追加したことを認識できません。

sudo cp ~/client-ssl/ca.pem /usr/local/share/ca-certificates/ca.pem.crt
sudo cp ~/client-ssl/client-cert.pem /usr/local/share/ca-certificates/client-cert.pem.crt

これに続いて、update-ca-certificatesコマンドを実行します。 このプログラムは、/usr/local/share/ca-certificates内の証明書を検索し、新しい証明書を/etc/ssl/certs/ディレクトリに追加し、/etc/ssl/certs/の内容に基づいて信頼できるSSL証明書のリスト(ca-certificates.crt)を生成します。 sディレクトリ:

sudo update-ca-certificates
OutputUpdating certificates in /etc/ssl/certs...
2 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

これで、MySQLデータベースをPostgreSQLに移行する準備が整いました。

[[step-5 --- migrating-the-data]] ==ステップ5—データの移行

PostgreSQLサーバーからMySQLサーバーへのリモートアクセスを設定したので、移行を開始する準備が整いました。

[。注意]##

Note:データの整合性に影響を与える可能性のあるアクションを実行する前に、データベースをバックアップすることが重要です。 ただし、pgLoaderで移行を実行する場合、データを削除または変換しないため、これは必要ありません。コピーするだけです。

とはいえ、慎重に感じていて、移行する前にデータをバックアップしたい場合は、mysqldumpユーティリティを使用して行うことができます。 詳細については、the official MySQL documentationを参照してください。

pgLoaderを使用すると、ユーザーは1つのコマンドでデータベース全体を移行できます。 MySQLデータベースから別のサーバー上のPostgreSQLデータベースに移行する場合、コマンドの構文は次のとおりです。

pgloader mysql://mysql_username:[email protected]_server_ip_/source_database_name?option_1=value&option_n=value postgresql://postgresql_role_name:[email protected]_server_ip/target_database_name?option_1=value&option_n=value

これには、pgloaderコマンドと2つのconnection stringsが含まれます。1つ目はソースデータベース用で、2つ目はターゲットデータベース用です。 これらの接続文字列は両方とも、接続文字列が指すDBMSのタイプを宣言することから始まり、データベースにアクセスできるユーザー名とパスワード(コロンで区切る)、データベースがインストールされているサーバーのホストアドレス、 pgLoaderが対象とするデータベースの名前、およびpgLoaderの動作に影響を与えるvarious options

このチュートリアルの前半で定義したパラメーターを使用して、次の構造のコマンドを使用してMySQLデータベースを移行できます。 強調表示されている値を置き換えて、独自のセットアップに合わせてください。

pgloader mysql://pgloader_my:[email protected]_server_ip/source_db?useSSL=true postgresql://pgloader_pg:[email protected]/new_db

このコマンドでは、MySQL接続文字列にuseSSLオプションが含まれていることに注意してください。 このオプションをtrueに設定すると、pgLoaderはSSLを介してMySQLに接続します。 セキュアな接続のみを受け入れるようにMySQLサーバーを設定したため、これが必要です。

このコマンドが成功すると、移行の進行状況を説明する出力テーブルが表示されます。

Output             table name     errors       rows      bytes      total time
-----------------------  ---------  ---------  ---------  --------------
        fetch meta data          0          2                     0.111s
         Create Schemas          0          0                     0.001s
       Create SQL Types          0          0                     0.005s
          Create tables          0          2                     0.017s
         Set Table OIDs          0          1                     0.010s
-----------------------  ---------  ---------  ---------  --------------
 source_db.sample_table          0          5     0.2 kB          0.048s
-----------------------  ---------  ---------  ---------  --------------
COPY Threads Completion          0          4                     0.052s
 Index Build Completion          0          1                     0.011s
         Create Indexes          0          1                     0.006s
        Reset Sequences          0          0                     0.014s
           Primary Keys          0          1                     0.001s
    Create Foreign Keys          0          0                     0.000s
        Create Triggers          0          0                     0.000s
       Install Comments          0          0                     0.000s
-----------------------  ---------  ---------  ---------  --------------
      Total import time          ✓          5     0.2 kB          0.084s

データが正しく移行されたことを確認するには、PostgreSQLプロンプトを開きます。

sudo -i -u postgres psql

そこから、データをロードしたデータベースに接続します。

\c new_db

次に、次のクエリを実行して、移行したデータがPostgreSQLデータベースに保存されているかどうかをテストします。

SELECT * FROM source_db.sample_table;

[。注意]##

Note:このクエリのFROM句で、source_dbschema内に保持されているsample_tableを指定していることに注意してください。

. . . FROM source_db.sample_table;

これはqualified nameと呼ばれます。 さらに進んで、データベースの名前とスキーマおよびテーブルの名前を含めることにより、fully qualified nameを指定できます。

. . . FROM new_db.source_db.sample_table;

PostgreSQLデータベースでクエリを実行する場合、テーブルがデフォルトのpublicスキーマ内に保持されている場合は、これを特定する必要はありません。 ここでそうしなければならない理由は、pgLoaderがPostgresにデータをロードするときに、元のデータベース(この場合はsource_db)にちなんで名付けられた新しいスキーマを作成してターゲットにするためです。 これは、MySQLからPostgreSQLへの移行に対するpgLoaderのデフォルトの動作です。 ただし、ロードファイルを使用して、データのロードが完了したら、テーブルのスキーマを「パブリック」に変更するようにpgLoaderに指示できます。 これを行う方法の例については、次のステップを参照してください。

データが実際に正しくロードされた場合、クエリの出力に次の表が表示されます。

Output employee_id | first_name |  last_name  | start_date |   salary
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)

Postgresプロンプトを閉じるには、次のコマンドを実行します。

\q

MySQLデータベースをネットワーク経由で移行してPostgreSQLデータベースにロードする方法を検討したので、pgLoaderが役立つ可能性のある他の一般的な移行シナリオをいくつか見ていきます。

[[step-6 -—- exploring-other-migration-options]] ==ステップ6—他の移行オプションの探索

pgLoaderは、さまざまな状況で役立つ柔軟性の高いツールです。 ここでは、pgLoaderを使用してMySQLデータベースをPostgreSQLに移行できる他のいくつかの方法について簡単に説明します。

pgLoaderロードファイルを使用した移行

pgLoaderのコンテキストでは、load fileまたはcommand fileは、pgLoaderに移行の実行方法を指示するファイルです。 このファイルには、pgLoaderの動作に影響するコマンドとオプションを含めることができます。これにより、PostgreSQLへのデータのロード方法をより細かく制御でき、複雑な移行を実行できます。

pgLoader’s documentationは、これらのファイルを使用および拡張して多数の移行タイプをサポートする方法に関する包括的な手順を提供するため、ここでは比較的基本的な例を紹介します。 手順5で実行したのと同じ移行を実行しますが、ALTER SCHEMAコマンドを含めてnew_dbデータベースのスキーマをsource_dbからpublicに変更します。

開始するには、好みのテキストエディタを使用してPostgresサーバーに新しいロードファイルを作成します。

nano pgload_test.load

次に、以下のコンテンツを追加し、強調表示された値を更新して、独自の構成に合わせます。

pgload_test.load

LOAD DATABASE
     FROM      mysql://pgloader_my:[email protected]_server_ip/source_db?useSSL=true
     INTO pgsql://pgloader_pg:[email protected]/new_db

 WITH include drop, create tables

ALTER SCHEMA 'source_db' RENAME TO 'public'
;

これらの各句の機能は次のとおりです。

  • LOAD DATABASE:この行は、ファイルやデータアーカイブではなく、別のデータベースからデータをロードするようにpgLoaderに指示します。

  • FROM:この句はソースデータベースを指定します。 この場合、Step 1で作成したMySQLデータベースの接続文字列を指します。

  • INTO:同様に、この行は、pgLoaderがデータをロードする必要があるPostgreSQLデータベースを指定します。

  • WITH:この句を使用すると、pgLoaderの特定の動作を定義できます。 MySQL移行hereと互換性のあるWITHオプションの完全なリストを見つけることができます。 この例では、2つのオプションのみを含めます。

    • include drop:このオプションを使用すると、pgLoaderは、ソースMySQLデータベースにも表示されるターゲットPostgreSQLデータベース内のすべてのテーブルを削除します。 データを既存のPostgreSQLデータベースに移行するときにこのオプションを使用する場合は、データが失われないようにデータベース全体をバックアップする必要があります。

    • create tables:このオプションは、MySQLデータベースに保持されているメタデータに基づいてターゲットPostgreSQLデータベースに新しいテーブルを作成するようにpgLoaderに指示します。 反対のオプションであるcreate no tablesを使用する場合は、移行前にターゲットテーブルがターゲットPostgresデータベースにすでに存在している必要があります。

  • ALTER SCHEMAWITH句に続いて、このような特定のSQLコマンドを追加して、pgLoaderに追加のアクションを実行するように指示できます。 ここでは、pgLoaderに新しいPostgresデータベースのスキーマをsource_dbからpublicに変更するように指示しますが、これはスキーマが作成された後でのみです。 このようなコマンドを他の句(BEFORE LOAD DOなど)内にネストして、移行プロセスの特定のポイントでこれらのコマンドを実行するようにpgLoaderに指示することもできます。

これは、pgLoaderの動作を変更するためにロードファイルに含めることができるものの実例です。 ロードファイルに追加できる句の完全なリストとその機能は、the official pgLoader documentationにあります。

このコンテンツの追加が完了したら、ロードファイルを保存して閉じます。 これを使用するには、pgloaderコマンドの引数としてファイルの名前を含めます。

pgloader pgload_test.load

移行が成功したことをテストするには、Postgresプロンプトを開きます。

sudo -u postgres psql

次に、データベースに接続します。

\c new_db

そして、次のクエリを実行します。

SELECT * FROM sample_table;
Output employee_id | first_name |  last_name  | start_date |   salary
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)

この出力は、pgLoaderがデータを正常に移行したこと、および表示するためにクエリでsource_dbスキーマを指定する必要がなかったため、ロードファイルに追加したALTER SCHEMAコマンドが期待どおりに機能したことを確認します。データ。

ロードファイルを使用して、あるデータベースに保持されているデータを別のマシンにある別のマシンに移行する場合、移行を成功させるために関連するネットワークおよびファイアウォールルールを調整する必要があります。

MySQLデータベースのPostgreSQLへのローカル移行

pgLoaderを使用して、MySQLデータベースを同じマシンに格納されているPostgreSQLデータベースに移行できます。 必要なのは、rootMySQLユーザーにアクセスできるLinuxユーザープロファイルから移行コマンドを実行することだけです。

pgloader mysql://[email protected]/source_db pgsql://sammy:[email protected]/target_db

このようなローカル移行を実行すると、MySQLのデフォルトのネットワーク設定やシステムのファイアウォールルールを変更する必要がなくなります。

CSVファイルからの移行

CSVファイルのデータを使用してPostgreSQLデータベースをロードすることもできます。

load.csvという名前のデータのCSVファイルがあるとすると、それをPostgresデータベースにロードするコマンドは次のようになります。

pgloader load.csv pgsql://sammy:[email protected]/target_db

CSV形式は完全に標準化されていないため、この方法でCSVファイルから直接データを読み込むと問題が発生する可能性があります。 幸い、pgLoader’s command line optionsにさまざまなオプションを含めるか、ロードファイルでそれらを指定することにより、不規則性を修正できます。 詳細については、件名のthe pgLoader documentationを参照してください。

管理されたPostgreSQLデータベースへの移行

自己管理データベースから管理されたPostgreSQLデータベースへの移行を実行することもできます。 この種の移行がどのように見えるかを示すために、MySQLサーバーとDigitalOcean Managed PostgreSQL Databaseを使用します。 Step 1で作成したサンプルデータベースも使用しますが、その手順をスキップして、移行する独自のデータベースがある場合は、代わりにそのデータベースを指定できます。

[.note]#Note: DigitalOceanマネージドデータベースの設定方法については、Managed Database Quickstartガイドを参照してください。

この移行では、pgLoaderのuseSSLオプションはリモートMySQLデータベースでのみ機能し、ローカルMySQLデータベースからこの移行を実行するため、必要ありません。 ただし、DigitalOceanマネージドPostgreSQLデータベースをロードして接続するときにsslmode=requireオプションを使用します。これにより、データが確実に保護されます。

今回はuseSSLを使用していないため、aptを使用してpostgresql-clientパッケージと一緒にpgLoaderをインストールできます。これにより、MySQLからマネージドPostgreSQLデータベースにアクセスできます。サーバ:

sudo apt install pgloader postgresql-client

その後、pgloaderコマンドを実行してデータベースを移行できます。 これを行うには、管理対象データベースの接続文字列が必要です。

DigitalOcean Managed Databasesの場合、クラウドコントロールパネルから接続文字列をコピーできます。 まず、左側のサイドバーメニューでDatabasesをクリックし、データの移行先のデータベースを選択します。 次に、Connection Detailsセクションまで下にスクロールします。 ドロップダウンメニューをクリックして、Connection stringを選択します。 次に、Copyボタンをクリックして文字列をクリップボードにコピーし、次の移行コマンドに貼り付けて、ここに示すPostgreSQL接続文字列の例を置き換えます。 これにより、MySQLデータベースがdoadmin PostgreSQLロールとしてdefaultdbPostgreSQLデータベースに移行されます。

pgloader mysql://root:[email protected]/source_db postgres://doadmin:[email protected]_host/defaultdb?sslmode=require

これに続いて、psqlへの引数として同じ接続文字列を使用して、マネージドPostgreSQLデータベースおよびhttps:// http://www.digitalocean.com/community/tutorials/how-to-migrate-に接続できます。 mysql-database-to-postgres-using-pgloader#step-1-%E2%80%94-(オプション)-creating-a-sample-database-and-table-in-mysql [www.digitalocean.com/community / tutorials / how-to-migrate-mysql-database-to-postgres-using-pgloader#step-1-%E2%80%94-(オプション)-creating-a-sample-database-and-table-in- mysql]移行が成功したことを確認します。

psql postgres://doadmin:[email protected]_host/defaultdb?sslmode=require

次に、次のクエリを実行して、pgLoaderがデータを正しく移行したことを確認します。

SELECT * FROM source_db.sample_table;
Output employee_id | first_name |  last_name  | start_date |   salary
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)

これにより、pgLoaderがMySQLデータベースを管理対象のPostgreSQLインスタンスに正常に移行したことが確認されます。

結論

pgLoaderは、単一のコマンドでデータベースの移行を実行できる柔軟なツールです。 いくつかの設定の調整により、安全なSSL / TLS接続を使用して、ある物理マシンから別の物理マシンにデータベース全体を移行できます。 このチュートリアルに従うことで、pgLoaderの機能と潜在的なユースケースをより明確に理解することができます。

データをPostgreSQLに移行した後、次のチュートリアルが役立つ場合があります。

Related