このトピックでは、さまざまなシナリオで mysqldump ツールを使用して PolarDB-X からデータをエクスポートする方法について説明します。
概要
PolarDB-X は、MySQL の公式データエクスポートツールである mysqldump をサポートしています。mysqldump は、テーブルスキーマとデータをエクスポートし、直接インポートできる SQL 文に変換します。
mysqldump は、最大 1,000 万行の小規模データボリュームのオフラインエクスポートに適しています。より大きなデータボリュームを移行したり、リアルタイムのデータ移行タスクを実行したりするには、Data Transmission Service (DTS) を使用します。
構文
次のコマンドを実行して、mysqldump ツールを使用してデータをエクスポートします。
mysqldump -h ip -P port -u user -pPassword --default-character-set=char-set --net_buffer_length=10240 --no-create-db --no-create-info --skip-add-locks --skip-lock-tables --skip-tz-utc --set-charset [--hex-blob] [--no-data] database [table1 table2 table3...] > dump.sqlmysqldump パラメーターの説明を表示するには、mysqldump --help コマンドを実行するか、「MySQL 公式ドキュメント」をご参照ください。次の表に、共通パラメーターを示します。
パラメーター | 説明 |
ip | PolarDB-X インスタンスの IP アドレス。 |
port | PolarDB-X インスタンスのポート。 |
user | PolarDB-X データベースのユーザー名。 |
password | PolarDB-X データベースのパスワード。パスワードは、-p の直後にスペースを入れずに指定する必要があります。 |
char-set | 指定されたエンコーディング。 |
--hex-blob | バイナリ文字列フィールドを 16 進数形式でエクスポートします。バイナリデータがある場合、このオプションは必須です。影響を受けるフィールドタイプには、BINARY、VARBINARY、BLOB があります。 |
--no-data | データをエクスポートしません。 |
table | エクスポートするテーブルを指定します。デフォルトでは、データベース内のすべてのテーブルがエクスポートされます。 |
--no-create-info | テーブル作成情報をエクスポートしません。 |
--net_buffer_length | 転送バッファーのサイズ。これは INSERT 文の長さに影響します。デフォルト値は 1046528 です。 |
例
次のセクションでは、さまざまなシナリオで mysqldump ツールを使用する方法について説明します。
PolarDB-X と MySQL の間でデータを転送する場合、テーブルスキーマをエクスポートしないでください。PolarDB-X はシャーディングをサポートしており、「CREATE TABLE (DRDS モード)」文のシャーディング関数は MySQL と互換性がありません。互換性のないキーワードは次のとおりです。
DBPARTITION BY hash(partition_key)
TBPARTITION BY hash(partition_key)
TBPARTITIONS N
BROADCAST
テーブルスキーマをエクスポートする場合は、エクスポートされた SQL ファイル内のテーブル作成文を変更して、インポートが成功するようにする必要があります。データのみをエクスポートすることをお勧めします。その後、データベースにログインし、手動でテーブルを作成して、データをインポートできます。
シナリオ 1: MySQL から PolarDB-X へのデータのインポート
MySQL から PolarDB-X にデータをインポートするには、次の手順に従います。
MySQL からファイルにデータをエクスポートします。
次のコマンドを実行して、MySQL からテーブルデータをエクスポートします。テーブルスキーマはエクスポートしないことをお勧めします。この例では、出力ファイルの名前が dump.sql であると仮定します。
mysqldump -h ip -P port -u user -pPassword --default-character-set=char-set --net_buffer_length=204800 --no-create-db --no-create-info --skip-add-locks --skip-lock-tables --skip-tz-utc --set-charset --hex-blob database [table1 table2 table3...] > dump.sqlPolarDB-X にログインし、宛先テーブルを手動で作成します。PolarDB-X でのテーブル作成の構文の詳細については、「CREATE TABLE (DRDS モード)」をご参照ください。--no-create-info パラメーターを追加しなかった場合、エクスポートされた dump.sql ファイルには MySQL からのテーブル作成文が含まれます。互換性を確保するために、ファイル内のテーブル作成文を変更する必要があります。
データファイルを PolarDB-X にインポートします。次の 2 つのメソッドのいずれかを使用して、データファイルを PolarDB-X にインポートできます。
mysql -h ip -P port -u user -pPassword --default-character-set=char-setコマンドを実行して宛先の PolarDB-X インスタンスにログインします。次に、source /yourpath/dump.sqlコマンドを実行して、データを宛先の PolarDB-X インスタンスにインポートします。mysql -h ip -P port -u user -pPassword --default-character-set=char-set< /yourpath/dump.sqlコマンドを実行して、データを宛先の PolarDB-X インスタンスに直接インポートします。
説明両方のコマンドで、
default-character-setを実際のデータエンコーディングに設定します。Windows プラットフォームを使用している場合は、source コマンドのファイルパスの区切り文字をエスケープする必要があります。最初のメソッドでは、すべてのステップが画面に表示されます。このメソッドは少し遅いですが、インポートプロシージャを観察できます。
インポート中に、PolarDB-X と MySQL の実装の違いによりエラーが発生することがあります。エラーメッセージは
ERROR 1231 (HY000): [a29ef6461c00000][10.117.207.130:3306][****]Variable @saved_cs_client can't be set to the value of @@character_set_clientに似ています。このタイプのエラーは、インポートされたデータの正確性には影響しません。
シナリオ 2: ある PolarDB-X から別の PolarDB-X へのインポート
たとえば、テスト環境に PolarDB-X インスタンスがあるとします。テスト後、一部のテーブルスキーマとデータを本番の PolarDB-X インスタンスにインポートする必要があります。これを行うには、次の手順に従います。
ソース PolarDB-X インスタンスからテキストファイルにデータをエクスポートします。詳細については、「シナリオ 1」の「ステップ 1」をご参照ください。
データファイルを宛先の PolarDB-X インスタンスにインポートします。詳細については、「シナリオ 1」の「ステップ 3」をご参照ください。
手動で Sequence オブジェクトを作成します。
mysqldump は PolarDB-X から Sequence オブジェクトをエクスポートしません。ソース PolarDB-X インスタンスで Sequence オブジェクトを使用し、宛先の PolarDB-X インスタンスで使用する必要がある場合は、宛先の PolarDB-X インスタンスで同じ名前の Sequence オブジェクトを手動で作成する必要があります。手順は次のとおりです。
ソース PolarDB-X インスタンスで
SHOW SEQUENCESを実行して、現在の PolarDB-X インスタンスの Sequence オブジェクトのステータスを取得します。宛先の PolarDB-X データベースで、
CREATE SEQUENCEコマンドを使用して新しい Sequence オジェクトを作成します。
Sequence コマンドの詳細については、「Sequence」をご参照ください。
シナリオ 3: PolarDB-X から MySQL へのデータのエクスポート
PolarDB-X から MySQL にデータをエクスポートする手順は、PolarDB-X インスタンス間でデータをインポートする手順と似ており、次のステップが含まれます。
ソース PolarDB-X インスタンスからテキストファイルにデータをエクスポートします。詳細については、「シナリオ 1」の「ステップ 1」をご参照ください。
MySQL にログインし、宛先テーブルを手動で作成します。エクスポートされたデータにテーブル作成文が含まれている場合は、エクスポートされたファイルでそれらを変更する必要があります。MySQL と互換性のない PolarDB-X 文からキーワードやその他の情報を削除します。
たとえば、PolarDB-X のシャードテーブルについて考えてみます。
CREATE TABLE `table_name` ( `id` int(11) NOT NULL, `k` int(11) NOT NULL DEFAULT '0', ... ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);MySQL と互換性のないシャーディング関数文を削除し、次のように変更する必要があります。
CREATE TABLE `table_name` ( `id` int(11) NOT NULL, `k` int(11) NOT NULL DEFAULT '0', ... ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;データファイルを PolarDB-X にインポートします。手順については、「シナリオ 1」の「ステップ 3」をご参照ください。
FAQ
問題: mysqldump が
when trying to dump tablespaceエラーを報告します。原因: PolarDB-X は表領域をサポートしていません。
解決策: mysqldump コマンドに
--no-tablespacesパラメーターを追加します。問題: mysqldump が
SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-bucket-specified"') FROM information_schema.COLUMN_STATISTICS ...エラーを報告します。原因: 互換性のない JSON フォーマットが原因で、列の統計情報のクエリ時にエラーが発生します。
解決策: mysqldump コマンドに
--column-statistics=0パラメーターを追加して、統計情報のエクスポートをスキップします。問題: mysqldump が
Couldn't execute 'SHOW TRIGGERS ...'エラーを報告します。原因: PolarDB-X はトリガーをサポートしていません。
解決策: mysqldump コマンドに
--skip-triggersパラメーターを追加します。問題: プライマリキーのないテーブルをインポートすると、
Duplicate entry '0' for key 'PRIMARY'エラーが報告されます。原因: ダンプファイルは
NO_AUTO_VALUE_ON_ZEROsql_mode を設定するため、プライマリキーの競合が発生します。解決策: ダンプファイルの sql_mode 設定から
NO_AUTO_VALUE_ON_ZEROフィールドを削除します。問題: mysqldump でデータをエクスポートするときに中国語の文字化けを防ぐにはどうすればよいですか?
解決策: インスタンスのバージョンが 5.4.19 以降の場合は、特権アカウントを使用して
COMPATIBLE_CHARSET_VARIABLESを true に設定できます。その後、mysqldump エクスポートを実行します。SET GLOBAL COMPATIBLE_CHARSET_VARIABLES=true;