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 ドキュメントを参照してください。
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: db への接続 XXXXXX の中断: 'db_name' ユーザー: 'master_user' ホスト: 'XXXXXXX' (通信パケットの書き込みタイムアウト)」
このエラーの原因と解決方法の詳細については、Amazon RDS MySQL DB インスタンスに接続するときに「MySQL サーバーが消える」エラーを解決するにはどうすればよいですか? を参照してください。
関連情報
mysqldump に関する MySQL ドキュメント
Amazon RDS MySQL DB インスタンスで関数、プロシージャ、トリガーを有効にする方法を教えてください。