データベースの移行は、サービスまたはツールを使用して、1つ以上のソースデータベースから1つ以上のターゲットデータベースにデータを移行するプロセスです。移行にはさまざまな種類があります。テクノロジーから別のテクノロジー、別のデータセンター、クラウドに移行したり、同じ場所で同じテクノロジーを別のマシンに移行したりすることもできます。 PostgreSQLの移行に最適なツールは、移行の種類と可用性やダウンタイムの許容範囲などの要件によって異なり、作業を行うのに最適なツールを見つけるのが難しい場合があります。
このブログでは、PostgreSQL移行用のいくつかのオープンソースツールについて、各オプションの概要とともに説明します。
これは、データ移行を実行するための最も簡単な方法ですが、目標復旧時間(RTO)の観点からも最も時間がかかります。この方法を使用すると、現在のデータベースからバックアップを作成することになります。別のバージョンまたはインフラストラクチャでデータベースを復元し、ダンプをコピーして、新しいサーバーで復元する場合は、おそらく論理バックアップです。データの量によっては、かなりの時間がかかる場合がありますが、これがデータベースを移行するための基本的な方法です。このためのいくつかのツールを見てみましょう。
pgdump / pgdumpall
pg_dumpは、単一のPostgreSQLデータベースをバックアップするためのユーティリティです。他のユーザーをブロックしないため、データベースが同時に使用されている場合でも、一貫したバックアップを作成します。クラスタ全体をバックアップする場合、またはクラスタ内のすべてのデータベースに共通するグローバルオブジェクト(ロールやテーブルスペースなど)をバックアップする場合は、代わりにpg_dumpallを使用する必要があります。
ダンプは、スクリプトまたはアーカイブファイル形式で出力できます。スクリプトダンプは、データベースを保存時の状態に再構築するために必要なSQLコマンドを含むプレーンテキストファイルです。他のマシン、他のアーキテクチャ、または他のSQLデータベース製品でデータベースを再構築するために使用できます。
pg_basebackup
pg_basebackupは、実行中のPostgreSQLデータベースクラスターのベースバックアップを作成するために使用されます。バックアップは他のデータベースクライアントに影響を与えることなく作成され、PITR(Point-In-Time-Recovery)とストリーミングレプリケーションスタンバイサーバーの開始点の両方に使用できます。サーバーがバックアップモードに自動的に出入りすることを確認しながら、データベースクラスターのファイルの正確なコピーを作成します。バックアップは常にデータベースクラスター全体で行われます。個々のデータベースまたはデータベースオブジェクトをバックアップすることはできません。
pgBackRest
pgBackRestは、従来のpg_basebackupツールと比較していくつかの改善を加えた物理バックアップを作成するオープンソースのバックアップツールです。 pgBackRestを使用して、既存のバックアップを使用してストリーミングレプリケーションの初期データベースコピーを実行するか、デルタオプションを使用して古いスタンバイサーバーを再構築できます。
- 完全、増分、および差分バックアップ
PostgreSQL移行ツール
バックアップツールを使用する代わりに、さまざまな方法でこの移行をより高速に実行するためのさまざまなユーティリティがあります。 ETLアプローチを使用することも、抽出-変換-読み込みに関する同じ概念を使用して異なるデータベーステクノロジ間のレプリケーションを構成することもできます。これらのツールのいくつかを見てみましょう。
pg_chameleon
pg_chameleonは、MySQLからPostgreSQLへのレプリカシステムです。 MySQLレプリケーションプロトコルに接続して、PostgreSQLでデータ変更をレプリケートできます。ユーザーがMySQLとPostgreSQLの間に永続的なレプリカを設定する必要がある場合でも、エンジンの移行を実行する必要がある場合でも、pg_chameleonはこのタスクに適したオプションです。
- 複数のMySQLスキーマから読み取り、それらをターゲットPostgreSQLデータベースに復元します
- MySQLスレーブとして機能するようにPostgreSQLをセットアップします
- 基本的なDDLサポート(CREATE / DROP / ALTER TABLE、DROP PRIMARY KEY / TRUNCATE、RENAME)
- 2つの別々のサブプロセスを持つデーモン化されたレプリカプロセス。1つは読み取り用、もう1つは再生用です
pgloader
pgloaderは、さまざまなソースからPostgreSQLにデータをロードします。読み取ったデータをその場で変換し、ロードの前後に生のSQLを送信できます。 COPY PostgreSQLプロトコルを使用してデータをサーバーにストリーミングし、reject.datファイルとreject.logファイルのペアを入力することでエラーを管理します。
データベースソースから直接データをロードできるため、pgloaderは他の製品からPostgreSQLへの移行もサポートしています。この操作モードでは、pgloaderは、単一の無人コマンドで移行のスキーマ部分とデータ部分の両方を処理し、継続的な移行を実装できるようにします。
- CSV、db3、IBMIXFファイルなどの多くのソース形式がサポートされています
- 圧縮ファイル(zip、tar、gzip)からの読み取り
- HTTP(S)サポート
- SQLコマンドの前後
- 1つのコマンドによる移行
- マテリアライズド・ビュー、またはオンザフライでのスキーマの書き換え
Ora2Pg
Ora2Pgは、OracleまたはMySQLデータベースをPostgreSQL互換スキーマに移行するために使用される無料のツールです。現在のデータベースを接続してスキャンし、その構造またはデータを抽出してから、PostgreSQLデータベースにロードできるSQLスクリプトを生成します。
- データベーススキーマ(テーブル、ビュー、シーケンス、インデックス)全体を、一意のプライマリキーと外部キーおよびチェック制約を使用してエクスポートします
- テーブル選択をエクスポートします(テーブル名を指定します)。
- 事前定義された関数、トリガー、プロシージャ、パッケージ、およびパッケージ本体をエクスポートします
- 完全なデータをエクスポートするか、WHERE句に従います
- PGBYTEAとしてのOracleBLOBオブジェクトの完全サポート
- OracleビューをPGテーブルとしてエクスポート
- Oracleユーザー定義型のエクスポート
- PLSQLコードからPLPGSQLへの基本的な自動変換を提供します
- Oracleテーブルを外部データラッパーテーブルとしてエクスポート
- Oracleデータベースのコンテンツの詳細なレポートを表示する
- Oracleデータベースの移行コスト評価
- Oracleデータベースの移行の難易度の評価
- Penthalo Data Integrator(Kettle)で使用するXMLktrファイルを生成します
- Oracleロケーターと空間ジオメトリをPostGisにエクスポート
- DBLINKをOracleFDWとしてエクスポート
- DIRECTORYをexternal_file拡張子の外部テーブルまたはディレクトリとしてエクスポートします
- Oracleデータベースと同じように完全なMySQLエクスポート
PentahoやTalenなど、利用可能なETLオプションは他にもありますが、それらは移行よりもデータ統合またはデータ管理を対象としているため、広範なブログ投稿を避けるために、ここではそれらについて説明しません。詳細については、こちらをご覧ください。
論理レプリケーションは、レプリケーションID(通常は主キー)に基づいて、データオブジェクトとその変更をレプリケートする方法です。これは、1つ以上のサブスクライバーがパブリッシャーノード上の1つ以上のパブリケーションをサブスクライブするパブリッシュアンドサブスクライブモードに基づいています。
パブリケーションは、テーブルまたはテーブルのグループから生成された一連の変更です(レプリケーションセットとも呼ばれます)。パブリケーションが定義されているノードは、パブリッシャーと呼ばれます。サブスクリプションは、論理レプリケーションのダウンストリーム側です。サブスクリプションが定義されているノードはサブスクライバーと呼ばれ、サブスクライブする別のデータベースおよび一連のパブリケーション(1つ以上)への接続を定義します。購読者は、購読している出版物からデータを取得します。
このメソッドは、PostgreSQLデータベースの移行またはアップグレードに使用できます。
詳細については、ダウンタイムなしでPostgreSQLをアップグレードすることに関する対応するブログ投稿を参照してください。
1つ(または複数)のソースからターゲット(または複数)にデータを移動または変換するため、移行は困難でリスクの高いタスクです。ターゲットが別のエンジン。したがって、詳細な手順を含む適切な計画と、もちろん、移行のすべての段階をテストするためのテスト環境が必要になります。このブログでは、このタスクに役立ついくつかのツールについて説明しました。最適な選択は、システムの可用性に関する要件によって異なります。