ApsaraDB RDS for MySQL では、一般ユーザに対して権限制限が適用されており、標準の mysqldump オプションの一部は動作が異なり、または使用できません。本ページでは、正しく設定する必要があるオプション、期待通りに動作するオプション、およびブロックされるオプション(およびその場合に表示されるエラーメッセージ)について説明します。
GTID オプション
グローバルトランザクション識別子 (GTID) のサポートは MySQL 5.6 で導入され、mysqldump ユーティリティには --set-gtid-purged オプションが追加されました。
| オプション | デフォルト値 | 値 | 説明 |
|---|---|---|---|
--set-gtid-purged | AUTO | ON | OFF | AUTO | SET @@GLOBAL.GTID_PURGED 文をダンプ出力に含めるかどうかを制御します。 |
値の説明:
ON— 常にSET @@GLOBAL.GTID_PURGED文を含めます。OFF— 文を一切含めません。AUTO(デフォルト) — GTID が有効化されたインスタンスの場合にのみ文を含め、起動していないインスタンスや GTID をサポートしないインスタンスについては GTID 情報を生成しません。
RDS MySQL 5.5 インスタンスへエクスポートする場合は、必ず --set-gtid-purged=OFF を指定してください。MySQL 5.5 は GTID をサポートしないため、このフラグを指定せずに MySQL 5.6 以降の mysqldump クライアントを使用すると、以下のエラーが発生します:
エラー:サーバーで GTID が無効化されています。または
mysqldump:'SELECT @@GTID_MODE' を実行できませんでした:不明なシステム変数 'GTID_MODE'(エラー番号 1193)テーブルロック関連オプション
デフォルトでは、mysqldump は --lock-tables を有効化し、ダンプ前にすべてのテーブルをロックして、ダンプ中に DML 操作をブロックします。ApsaraDB RDS for MySQL でサポートされるストレージエンジン(InnoDB および TokuDB)はトランザクションをサポートしているため、トランザクションベースのダンプの方が安全性と速度の両面で優れています。
InnoDB または TokuDB テーブルをテーブルロックを取得せずにダンプするには、--single-transaction を使用します。
| オプション | デフォルト値 | 有効な値 | 説明 |
|---|---|---|---|
--lock-all-tables | FALSE | TRUE | FALSE | ダンプ全体に対してグローバルな読み取りロックを取得し、すべてのデータベース内のすべてのテーブルを読み取り専用にします。--lock-tables および --single-transaction を自動的に無効化します。ApsaraDB RDS for MySQL ではサポートされていません — 詳細については、「サポートされていないオプション」をご参照ください。 |
--lock-tables | TRUE | TRUE | FALSE | ダンプ前にテーブルをロックします。--skip-lock-tables を使用して無効化できます。--single-transaction を使用する場合は、このオプションは自動的に無効化されます。 |
--single-transaction | FALSE | TRUE | FALSE | ダンプ前にトランザクションを開始し、テーブルロックを回避します。--lock-tables を自動的に無効化します。InnoDB および TokuDB テーブルへの推奨オプションです。 |
推奨コマンド
以下は、ApsaraDB RDS for MySQL インスタンスからデータをエクスポートする際に推奨されるオプションを用いたコマンド例です:
mysqldump --no-defaults \
-u <username> -p<password> \
-h <instance_endpoint> -P 3306 \
--set-gtid-purged=OFF \
--single-transaction \
--hex-blob \
--databases <database_name>--no-defaults—.mylogin.cnfのみを読み込み、他のオプションファイルによる設定の上書きを防ぎます。--set-gtid-purged=OFF— ターゲットインスタンスが GTID をサポートしない場合(例:RDS MySQL 5.5)に必須です。--single-transaction— InnoDB および TokuDB テーブルを一貫性のある状態で、テーブルロックなしでダンプします。--hex-blob— MySQL のバージョン間移行時にエンコーディング問題を回避するため、バイナリ列を 16 進数表記でエクスポートします。
文字セット
文字セットが明示的に指定されていない場合、mysqldump は UTF-8 をデフォルトとして使用します。
| オプション | デフォルト値 | 値 | 説明 |
|---|---|---|---|
--default-character-set | utf8 | ApsaraDB RDS for MySQL でサポートされる任意の文字セット | ダンプ出力の文字セットを設定します。 |
その他のオプション
| オプション | デフォルト値 | 値 | 説明 |
|---|---|---|---|
--no-defaults | — | — | .mylogin.cnf のみを読み込み、他のすべてのオプションファイルを無視します。 |
--defaults-file=file_name | — | — | 指定したファイルからのみオプションを読み込みます。 |
--add-drop-database | FALSE | TRUE | FALSE | ダンプ出力において、各 CREATE DATABASE 文の前に DROP DATABASE 文を追加します。 |
--add-drop-table | TRUE | TRUE | FALSE | 各 CREATE TABLE 文の前に DROP TABLE 文を追加します。--skip-add-drop-table を使用して無効化できます。 |
--add-locks | TRUE | TRUE | FALSE | 各テーブルのダンプを LOCK TABLES ... WRITE および UNLOCK TABLES で囲み、ダンプを再読み込みする際の挿入処理を高速化します。 |
--compatible=name | — | ansi | postgresql | oracle | mssql | 指定されたデータベース種別と互換性のある出力を生成します。 |
--compact | FALSE | TRUE | FALSE | --skip-add-drop-table、--skip-add-locks、--skip-comments、--skip-disable-keys、および --skip-set-charset を有効化します。 |
--databases | TRUE | TRUE | FALSE | すべての引数をデータベース名として扱い、出力に CREATE DATABASE 文および USE 文を含めます。このオプションを指定しない場合、最初の引数はデータベース名として扱われ、その後の引数はテーブル名として扱われます。 |
--disable-keys | TRUE | TRUE | FALSE | INSERT 文を ALTER TABLE ... DISABLE KEYS および ALTER TABLE ... ENABLE KEYS で囲み、ロード処理を高速化します。MyISAM テーブルの非一意インデックスでのみ有効です。 |
--events | FALSE | TRUE | FALSE | スケジュールされたイベントをダンプに含めます。 |
--extended-insert | TRUE | TRUE | FALSE | 複数の単一行 INSERT 文を、1 つの複数行 INSERT 文に結合します。 |
--hex-blob | FALSE | TRUE | FALSE | BINARY、VARBINARY、および BLOB 列を 16 進数表記でエクスポートします。異なる MySQL バージョン間でのデータ移行時にエンコーディング問題を回避するために、このオプションを追加してください。 |
--ignore-table=db.tab | TRUE | TRUE | FALSE | 指定されたテーブルまたはビューをダンプ対象から除外します。書式: database_name.table_name。複数のテーブルを除外する場合は、このオプションを繰り返し指定します。 |
--max-allowed-packet | 24 MB | 24 MB–1 GB | mysqldump と ApsaraDB RDS for MySQL インスタンス間の通信における最大バッファーサイズです。 |
--no-create-db | FALSE | TRUE | FALSE | ダンプ出力から CREATE DATABASE 文を省略します。 |
--no-create-info | FALSE | TRUE | FALSE | ダンプ出力から CREATE TABLE 文を省略します。 |
--no-data | FALSE | TRUE | FALSE | テーブルデータを含まないスキーマのみをダンプします。 |
--opt | TRUE | TRUE | FALSE | --add-drop-table、--add-locks、--create-options、--disable-keys、--extended-insert、--lock-tables、--quick、および --set-charset を有効化するショートカットです。--skip-opt を使用して無効化できます。 |
--dump-date | TRUE | TRUE | FALSE | --comments(デフォルトで有効)が有効な場合、出力にダンプ日時を付加します。 |
--routines | FALSE | TRUE | FALSE | ストアドプロシージャおよび関数をダンプに含めます。 |
--result-file | TRUE | TRUE | FALSE | 出力を指定されたファイルにリダイレクトします。 |
--set-charset | TRUE | TRUE | FALSE | ダンプ出力に SET NAMES default_character_set を追加します。 |
--triggers | TRUE | TRUE | FALSE | ダンプ対象の各テーブルのトリガーを含めます。 |
サポートされていないオプション
以下のオプションは、権限制限により ApsaraDB RDS for MySQL の一般ユーザが使用できません。
| オプション | 理由 |
|---|---|
--all-databases | 一般ユーザは mysql データベース内の特定のテーブル(例:slow_log)に対する権限を持たないため、完全なデータベースダンプは失敗します。すべてのユーザデータベースをエクスポートするには、--databases を使用し、各データベースを明示的に指定してください。 |
--flush-logs | RELOAD 特権が必要ですが、一般ユーザには付与されていません。 |
--flush-privileges | 該当しません — ApsaraDB RDS for MySQL では mysql データベースのエクスポートは許可されていません。 |
--lock-all-tables | RELOAD 特権が必要ですが、一般ユーザには付与されていません。 |
--tab=dir_name | mysqldump と RDS インスタンスが同一の物理マシン上で実行される必要がありますが、マネージド環境ではこれは成立しません。 |
エラーメッセージ
--all-databases または --lock-all-tables を使用した場合:
mysqldump:'show create table slow_log' を実行できませんでした:ユーザー 'xxx'@'xx.xx.xx.xx' に対するテーブル 'slow_log' の SHOW コマンドが拒否されました(エラー番号 1142)--flush-logs または --lock-all-tables を使用した場合:
mysqldump:'FLUSH TABLES' を実行できませんでした:アクセスが拒否されました。この操作には、少なくとも 1 つの RELOAD 特権が必要です(エラー番号 1227)--tab と --no-data の併用
--tab=dir_name は完全なデータダンプには使用できませんが、--no-data と組み合わせることで、各テーブルの CREATE TABLE 文を個別の .sql ファイルとしてエクスポートできます:
# CREATE TABLE 文のみをエクスポート(データなし)
mysqldump --no-defaults \
-u <username> -p<password> \
-h <instance_endpoint> -P 3306 \
--set-gtid-purged=OFF \
--single-transaction \
--tab=/tmp \
--no-data \
<database_name>--tab を --no-data なしで使用すると、以下のエラーが返されます:
mysqldump:エラー 1045:ユーザー 'xxx'@'%' に対するアクセスが拒否されました(パスワード使用:YES) — 'SELECT INTO OUTFILE' の実行時