PostgreSQL からの移行 (cockroachlabs.com)
から引用したものを和訳してみた。
PostgreSQL からの移行
このページでは、PostgreSQLからCockroachDBにデータを移行するための基本的な考慮事項と基本的な例を示します。このページの情報は、データベースを CockroachDB に移行するための大まかなフェーズと考慮事項について説明している「移行の概要」を読んでいることを前提としています。
このページの PostgreSQL 移行の例では、MOLT ツールを使用して PostgreSQL スキーマを更新し、データの初期読み込みを実行し、データを検証する方法を示します。これらの手順は、完全な移行の準備をするときに不可欠です。
先端:
CockroachDBへの移行についてサポートが必要な場合は、営業チームにお問い合わせください。
構文の違い
CockroachDBはPostgreSQLのワイヤプロトコルをサポートしており、PostgreSQLの構文とほぼ互換性があります。
構文の違いについては、PostgreSQLと異なる機能を参照してください。
サポートされていない機能
以下のPostgreSQL機能は、CockroachDBにはまだ存在しません。
トリガー。これらは、アプリケーション ロジックに実装する必要があります。
イベント。
主キーを削除します。
手記:
各テーブルには、主キーが関連付けられている必要があります。主キー制約は、1 つのトランザクション内で削除および追加できます。
XML 関数。
列レベルの権限。
XA 構文。
テンプレートからデータベースを作成する。
テーブルから 1 つのパーティションを削除する。
外部データラッパー。
アドバイザリ ロック関数 (ただし、一部の関数は no-op 実装で定義されています)。
PostgreSQL データの読み込み
次のいずれかの方法を使用して、PostgreSQL データを CockroachDB に移行できます。
IMPORT INTO を使用して、ユーザーファイルまたはクラウドストレージを介して保存された CSV、TSV、または Avro データを CockroachDB 上の既存のテーブルに移行します。このオプションでは、最高のスループットが得られますが、インポート速度を達成するにはテーブルをオフラインにする必要があります。
先端:
CockroachDB でのインポートパフォーマンスを最適化するためのベストプラクティスについては、「インポートパフォーマンスのベストプラクティス」を参照してください。
サードパーティのデータ移行ツール(AWS DMS、Qlik、Striimなど)を使用してデータをロードします。
PostgreSQL から移行する場合、COPY FROM を使用して、CSV またはタブ区切りのデータを CockroachDB テーブルにコピーできます。このオプションを使用すると、テーブルをオンラインのままにしてアクセス可能にすることができます。ただし、IMPORT INTOを使用するよりも遅くなります。
次の例では、を使用して初期データ・ロードを実行します。IMPORT INTO
例: CockroachDB への移行frenchtowns
次の手順では、移行中のスキーマの変換、データの初期読み込みの実行、およびデータの整合性の検証を示します。
完全移行のコンテキストでは、これらの手順により、PostgreSQL データを CockroachDB に適切に移行し、クラスターに対してアプリケーション クエリをテストできます。詳細については、「移行の概要」を参照してください。
始める前に
この例では、PostgreSQL データセットの変更バージョンを使用し、スキーマとデータをサーバーレスクラスターに移行する方法を示します。次の手順に従うには、次の手順を実行します。french-towns-communes-francais
データセットをダウンロードします。frenchtowns
curl -O https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/frenchtowns.sql
PostgreSQL インスタンスにデータベースを作成します。frenchtowns
createdb frenchtowns
ダウンロードしたファイルのパスを指定して、データをPostgreSQLにロードします。frenchtowns
psql frenchtowns -a -f frenchtowns.sql
スキーマ変換ツールへのアクセスとサーバーレスクラスターの作成に使用する無料のクラウドアカウントを作成します。
先端:
CockroachDB セルフホストデータベースに移行する場合は、変換されたスキーマをスキーマ変換ツールからエクスポートし、Cockroach SQL でステートメントを実行するか、Alembic、Flyway、Liquibase などのサードパーティのスキーマ移行ツールを使用できます。
ステップ1。PostgreSQL スキーマの変換
スキーマ変換ツールを使用して、CockroachDB との互換性のためにスキーマを変換します。スキーマには、frenchtownsregionsdepartmentstowns
次の pg_dump コマンドで PostgreSQL スキーマをダンプします。frenchtowns
pg_dump --schema-only frenchtowns > frenchtowns_schema.sql
Cloud Console でスキーマ変換ツールを開き、新しい PostgreSQL スキーマを追加します。
変換が完了したら、結果を確認します。要約レポートには、「必要な修正」の下にエラーがあることが示されます。スキーマを CockroachDB に移行するには、これらを解決する必要があります。
先端:
また、PostgreSQL データベースの資格情報を追加して、スキーマ変換ツールが PostgreSQL データベースから直接スキーマを取得するようにすることもできます。
Missing user: postgreserrors は、SQL ユーザーが CockroachDB に存在しないことを示します。「ユーザーの追加」をクリックして、ユーザーを作成します。postgres
Miscellaneous Errorsには、安全に削除できるステートメントが含まれています。「削除」をクリックして、スキーマからステートメントを削除します。SELECT pg_catalog.set_config('search_path', '', false)
[提案] の下に一覧表示されているステートメントを確認します。Cockroach Labs では、シーケンスを使用して主キー列を定義することはお勧めしません。詳細については、「一意の ID のベスト プラクティス」を参照してください。CREATE SEQUENCE
この例では、これ以上変更を加えずに提案を承認します。実際には、CockroachDB への完全な移行を実行した後、一意の非連続主キーを使用するように CockroachDB スキーマを変更します。
[移行の再試行] をクリックします。概要レポートに、エラーがないことが表示されます。これは、スキーマを CockroachDB に移行する準備ができていることを意味します。
この例では、サーバーレスクラスターに直接移行します。 CockroachDB セルフホストデータベースに移行する場合は、変換されたスキーマをスキーマ変換ツールからエクスポートし、Cockroach SQL でステートメントを実行するか、Alembic、Flyway、Liquibase などのサードパーティのスキーマ移行ツールを使用できます。
[Migrate Schema] をクリックして、変換されたスキーマで新しいサーバーレスクラスターを作成します。データベースに という名前を付けます。frenchtowns
このデータベースは、Cloud Console の [データベース] ページで確認できます。
ステップ2。PostgreSQL データの読み込み
CSV形式のデータでIMPORT INTOを使用して、データをCockroachDBにロードします。IMPORT INTO では、次の属性を持つテーブルごとに 1 つのファイルをエクスポートする必要があります。frenchtowns
ファイルは、有効な CSV (カンマ区切り値) または TSV (タブ区切り値) 形式である必要があります。
区切り文字は 1 文字でなければなりません。区切り文字オプションを使用して、コンマ以外の文字 (TSV 形式のタブなど) を設定します。
ファイルは UTF-8 でエンコードする必要があります。
フィールドに次の文字のいずれかが含まれている場合は、フィールドを二重引用符で囲む必要があります。
区切り文字 (デフォルト)。,
二重引用符 () です。フィールドは二重引用符で囲まれるため、フィールド内の二重引用符の前に別の二重引用符を付けてエスケープします。例えば:。""aaa","b""bb","ccc"
改行 () です。\n
キャリッジリターン()。\r
カラムがバイト型の場合、有効な UTF-8 文字列、または で始まる 16 進数エンコードされたバイト リテラルのいずれかになります。たとえば、値がバイト であるフィールドは、 と記述されます。\x12\x0102
手記:
デフォルトでは、IMPORT INTO はターゲット表のすべての外部キー制約を無効にします。
PostgreSQLデータベースの各テーブルをCSV形式のファイルにダンプします。frenchtowns
psql frenchtowns -c "COPY regions TO stdout DELIMITER ',' CSV;" > regions.csv
psql frenchtowns -c "COPY departments TO stdout DELIMITER ',' CSV;" > departments.csv
psql frenchtowns -c "COPY towns TO stdout DELIMITER ',' CSV;" > towns.csv
CockroachDB クラスターがアクセスできる場所でファイルをホストします。
CockroachDB クラスター内の各ノードは、インポートされるファイルにアクセスできる必要があります。クラスターがデータにアクセスする方法はいくつかあります。IMPORT INTO がプルできるストレージのタイプの詳細については、以下を参照してください。
クラウドストレージを使用する
ローカル・ファイル・サーバーの使用
Amazon S3 や Google Cloud などのクラウドストレージは、インポートするデータファイルをホストすることを強くお勧めします。
前のステップで生成されたダンプファイルは、この例用に作成されたパブリック S3 バケットですでにホストされています。
CockroachDB クラスターへの SQL シェルを開きます。コマンドを見つけるには、Cloud Console で [接続] ダイアログを開き、データベースと [CockroachDB クライアント] オプションを選択します。次のようになります。frenchtownsfrenchtowns
cockroach sql --url "postgresql://{username}@{hostname}:{port}/frenchtowns?sslmode=verify-full"
IMPORT INTO を使用して、各 PostgreSQL ダンプ ファイルをデータベース内の対応するテーブルにインポートします。frenchtowns
次のコマンドは、この例でデータダンプファイルがホストされているパブリック S3 バケットを指しています。frenchtowns
先端:
インポートする行数を指定するオプションを追加できます。たとえば、テーブルの最初の 10 行をインポートします。このオプションは、時間とリソースを消費するインポートを実行する前に、エラーをすばやく検出するのに役立ちます。row_limitrow_limit = '10'
IMPORT INTO regions
CSV DATA (
'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/regions.csv'
);
job_id | status | fraction_completed | rows | index_entries | bytes
---------------------+-----------+--------------------+------+---------------+--------
893753132185026561 | succeeded | 1 | 26 | 52 | 2338
IMPORT INTO departments
CSV DATA (
'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/departments.csv'
);
job_id | status | fraction_completed | rows | index_entries | bytes
---------------------+-----------+--------------------+------+---------------+--------
893753147892465665 | succeeded | 1 | 100 | 300 | 11166
IMPORT INTO towns
CSV DATA (
'https://cockroachdb-migration-examples.s3.us-east-1.amazonaws.com/postgresql/frenchtowns/towns.csv'
);
job_id | status | fraction_completed | rows | index_entries | bytes
---------------------+-----------+--------------------+-------+---------------+----------
893753162225680385 | succeeded | 1 | 36684 | 36684 | 2485007
ターゲット表のすべての外部キー制約が無効になることを思い出してください。と に定義されている制約を表示します。IMPORT INTOdepartmentstowns
SHOW CONSTRAINTS FROM departments;
table_name | constraint_name | constraint_type | details | validated
--------------+-------------------------+-----------------+---------------------------------------------------------+------------
departments | departments_capital_key | UNIQUE | UNIQUE (capital ASC) | t
departments | departments_code_key | UNIQUE | UNIQUE (code ASC) | t
departments | departments_name_key | UNIQUE | UNIQUE (name ASC) | t
departments | departments_pkey | PRIMARY KEY | PRIMARY KEY (id ASC) | t
departments | departments_region_fkey | FOREIGN KEY | FOREIGN KEY (region) REFERENCES regions(code) NOT VALID | f
SHOW CONSTRAINTS FROM towns;
table_name | constraint_name | constraint_type | details | validated
-------------+---------------------------+-----------------+-----------------------------------------------------------------+------------
towns | towns_code_department_key | UNIQUE | UNIQUE (code ASC, department ASC) | t
towns | towns_department_fkey | FOREIGN KEY | FOREIGN KEY (department) REFERENCES departments(code) NOT VALID | f
towns | towns_pkey | PRIMARY KEY | PRIMARY KEY (id ASC) | t
外部キーを検証するには、ALTER TABLE ...VALIDATE CONSTRAINT ステートメントを使用します。
ALTER TABLE departments VALIDATE CONSTRAINT departments_region_fkey;
ALTER TABLE towns VALIDATE CONSTRAINT towns_department_fkey;
ステップ3。移行されたデータを検証する
MOLT Verifyを使用して、PostgreSQLとCockroachDBのデータが一致していることを確認します。
MOLT Verifyをインストールします。
MOLT Verifyをインストールしたディレクトリで、次のコマンドを使用して2つのデータベースを比較し、PostgreSQL接続文字列を に、CockroachDB接続文字列を に指定します。--source--target
先端:
CockroachDB 接続文字列を見つけるには、Cloud Console で [接続] ダイアログを開き、データベースと [全般] 接続文字列オプションを選択します。frenchtowns
./molt verify --source 'postgresql://{username}:{password}@{host}:{port}/frenchtowns' --target 'postgresql://{user}:{password}@{host}:{port}/frenchtowns?sslmode=verify-full'
初期出力が表示されます。
<nil> INF verification in progress
次の出力は、MOLT Verify が検証を完了したことを示しています。
<nil> INF finished row verification on public.regions (shard 1/1): truth rows seen: 26, success: 26, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
<nil> INF finished row verification on public.departments (shard 1/1): truth rows seen: 100, success: 100, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
<nil> INF progress on public.towns (shard 1/1): truth rows seen: 10000, success: 10000, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
<nil> INF progress on public.towns (shard 1/1): truth rows seen: 20000, success: 20000, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
<nil> INF progress on public.towns (shard 1/1): truth rows seen: 30000, success: 30000, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
<nil> INF finished row verification on public.towns (shard 1/1): truth rows seen: 36684, success: 36684, missing: 0, mismatch: 0, extraneous: 0, live_retry: 0
<nil> INF verification complete
スキーマを移行し、初期データ読み込みを検証したら、実際の移行の次の手順は、完全な移行を実行する前に、必要なアプリケーションの変更を行ったことを確認し、アプリケーション クエリを検証し、ドライ ランを実行することです。
詳細については、「移行の概要」を参照してください。
MySQLだけじゃなくてPostgreSQLもCockroachDBへの移行ツールが無いらしいようだ。
もしかしたらOracleDBもCockroachDBへの移行ツールがないかもしれん。