MySQL または MariaDB を実行している Amazon Relational Database Service (Amazon RDS) DB インスタンスを使用しています。mysqldump を使用してデータをインポートまたはエクスポートしていますが、エラーが表示されます。このエラーをトラブルシューティングして解決するにはどうすればよいですか?
簡単な説明
mysqldump を使用すると、次のエラーが表示されることがあります:
- 「FLUSH TABLES WITH READ LOCK」を実行できませんでしたというエラー
- Max_allowed_packet エラー
- SUPER 権限 と DEFINER エラー
- 接続の切断または中断エラー
解決策
「FLUSH TABLES WITH READ LOCK」を実行できませんでしたというエラー
mysqldump で --master-data オプションを使用してデータをエクスポートすると、次のようなエラーが表示される場合があります:
「mysqldump: 'FLUSH TABLES WITH READ LOCK' を実行できませんでした: 'user'@'%' のアクセスが拒否されました (パスワード使用: はい) (1045)」
--master-data オプションは FLUSH TABLES WITH READ LOCK を取得します。これには Amazon RDS マスターユーザーにはない SUPER 権限が必要であり、Amazon RDS は GLOBAL READ LOCK をサポートしていません。MySQL が **CHANGE MASTER TO ** ステートメントを実行してログ情報を取得すると、バイナリログファイルの名前と位置 (座標) が mysqldump ファイルに記録されます。詳細については、ER_ACCESS_DENIED_ERROR に関する MySQL ドキュメントを参照してください。
このエラーを解決するには、--master-data オプションを削除します。このオプションを削除すると、mysqldump の正確なログ位置を得ることができません。この問題を回避するには、アプリケーションが停止しているときに mysqldump を取得するか、Amazon RDS リードレプリカから mysqldump を取得します。これにより、SHOW SLAVE STATUS を実行して正確なログ位置を取得できます。レプリカを停止すると、バイナリログの位置が変更されないことが確認されるためです。以下の手順に従って、この RDS DB インスタンスの Amazon RDS MySQL リードレプリカから mysqldump を作成します。
1. バイナリログ保有期間の値を設定します。
2. リードレプリカで次のコマンドを実行してレプリケーションを停止します:
CALL mysql.rds_stop_replication;
3. リードレプリカから --master-data=2 を指定せずに mysqldump を取得します。
4. レプリカで SHOW SLAVE STATUS を実行し、Master_Log_File と Exec_Master_Log_Pos を取得します。
5. アプリケーションにレプリカを使用している場合は、次のストアドプロシージャを使用してレプリケーションを再開します:
CALL mysql.rds_start_replication;
アプリケーションにレプリカを使用していない場合は、削除できます。
Max_allowed_packet エラー
mysqldump を使用してデータをエクスポートすると、次のようなエラーが表示される場合があります:
「エラー 2020: XX 行のテーブル tb_name
のダンプ中に 'max_allowed_packet' バイトより大きいパケットを取得しました 」
このエラーは、mysqldump コマンドが RDS DB インスタンスに設定されている max_allowed_packet パラメータの値よりも大きいパケットを要求した場合に発生します。詳細については、MySQL ドキュメントの「Packet too large」を参照してください。
max_allowed_packet エラーを解決するには、max_allowed_packet のグローバル値を増やすか、mysqldump でそのセッションの max_allowed_packet を (データベース全体でグローバルに設定するのではなく) 設定します。たとえば、以下のようにコマンドを変更できます:
$ mysqldump --max_allowed_packet=1G ......
SUPER 権限 と DEFINER エラー
mysqldump を使用して MySQL または MariaDB を実行している RDS DB インスタンスにデータをインポートすると、次のようなエラーが表示されることがあります:
「エラー 1227 (42000) XX 行: アクセスが拒否されました; この操作には (少なくとも 1 つ以上の) SUPER 権限が必要です」
このエラーは、次の問題のうちの 1 つ以上を示しています:
接続の切断または中断エラー
mysqldump を使用してデータをインポートすると、次のようなエラーが表示される場合があります:
「mysqldump: エラー 2013: テーブルをダンプしてクエリを実行しているときに mysql サーバーへの接続が切断されました」
または
「mysqldump: mysqldump: db への接続 XXXXXX の中断: 'db_name' ユーザー: 'master_user' ホスト: 'XXXXXXX' (通信パケットの書き込みタイムアウト)」
このエラーの原因と解決方法の詳細については、「Amazon RDS MySQL DB インスタンスへの接続時に発生する「MySQL server has gone away」エラーの解決方法を教えてください。」を参照してください。
関連情報
mysqldumpのためのMySQLドキュメンテーション
Amazon RDS for MySQL DB インスタンスの関数、プロシージャ、トリガーを有効にするにはどうすればよいですか?