mysqldump を使用して Amazon Relational Database Service (Amazon RDS) for MySQL DB インスタンスにデータをインポートする際、1227 エラーまたは definer エラーが発生します。
解決策
データベースのイベントと変更を確認するには、バイナリログを参照してください。詳細については、MySQL のウェブサイトで「バイナリログ」を参照してください。
エラー 1227
バイナリロギングを有効化する際、mysqldump ファイルにトリガー、ビュー、関数、イベントなどのストアドオブジェクトが含まれている場合は、次のエラーが発生する可能性があります。
「Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation. (操作に必要なアクセス許可が欠けています)」
このエラーを解決するには、次の手順を実行します。
- DB インスタンスで作成したカスタム DB パラメータグループにおいて、log_bin_trust_function_creators パラメータを True に設定します。
- インスタンスにファイルを実行する前に、ダンプファイルからコマンドライン (例: SET @ @SESSION .SQL_LOG_BIN= 0;) を削除します。
Definer エラー
Definer エラーは、MySQL がターゲットデータベースに存在しないデータベースユーザーとしてオブジェクトを作成しようとした場合に発生します。Amazon RDS には superuser 権限が付与されていないため、MySQL が localhost にユーザーを作成しようとした場合にも Definer エラーが発生します。次の例のいずれかに類似したエラーが発生する可能性があります。
エラーメッセージ「Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW」
このエラーを解決するには、次の操作を行います。
DEFINER 行を削除する
DEFINER 行を見つけて削除します。
/*!50017 DEFINER=`root`@`localhost`*/
出力例:
/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
DEFINER ユーザーの名前を変更する
root を masteruser に、localhost を %host に変更します。
/*!50017 DEFINER=`masteruser`@`%host`*/
出力例:
/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW
注: % はすべてのホストのワイルドカードとして使用できます。
** DEFINER オプションを削除し、ダンプファイルを作成または再作成する**
MySQL ダンプユーティリティには、DEFINER を削除するオプションは含まれていません。一部の MySQL クライアントユーティリティでは、論理バックアップの作成時に DEFINER を無視するオプションを使用できます。ただし、この機能はデフォルトでは使用できません。DEFINER を無視するオプションを使用できるかどうかを判断するには、使用する MySQL クライアントのドキュメントを確認してください。MySQL コマンドラインクライアントでは、DEFINER を除外できません。ただし、このクライアントをサードパーティ製ツールと併用すると、DEFINER の削除やユーザー名とホストの検索置換が可能です。
Linux、macOS、または Windows Subsystem for Linux (WSL) で DEFINER 行を検索して削除するには、次のコマンドを実行します。
sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql
Linux、macOS、または WSL でユーザー名とホストを検索して置き換えるには、次のコマンドを実行します。
sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql
注: masteruser を Amazon RDS のプライマリユーザー名に置き換えてください。
関連情報
Amazon RDS for MySQL
レプリケーションを使用して MySQL DB インスタンスからデータをエクスポートする