mysqldump を使用して Amazon RDS for MySQL DB インスタンスにデータをインポートする際に発生する definer エラーを解決する方法を教えてください。

最終更新日: 2020 年 5 月 29 日

mysqldump を使用して Amazon Relational Database Service (Amazon RDS) for MySQL DB インスタンスにデータをインポートしようとすると、次のようなエラーが表示されます。

Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

簡単な説明

MySQL が、送り先のデータベースに存在しないデータベースユーザーの下にオブジェクトを作成しようとすると、definer エラーが発生します。MySQL が localhost でユーザーを作成しようとした場合も、同様のエラーが表示されることがあります。この処理は Amazon RDS では許可されていません。Amazon RDS にはスーパーユーザー権限がないためです。

解決方法

Definer エラーの対処にはいくつか方法があります。

1.    以下の definer の行を削除します。

/*!50017 DEFINER=`root`@`localhost`*/

行は次のようになります。

/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

2.    definer ユーザーの rootlocalhost を、それぞれ masteruser%host に名前変更します。

/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

注: % は、すべてのホストに対するワイルドカードとして使用できます。

3.    definer のオプションなしでダンプファイルを作成または再作成します。

MySQL のダンプユーティリティには DEFINER を削除するオプションはありません。論理バックアップを作成するときに definer を無視するオプションを提供する MySQL クライアントもありますが、このオプションはデフォルトでは起こりません。使用している MySQL クライアントのドキュメントを調べて、DEFINER を無視するオプションがあるかどうかを確認してください。MySQL コマンドラインクライアントは definer を除外できません。ただし、クライアントがサードパーティ製ツールを使用して DEFINER を削除したり、ユーザー名とホストを検索し置き換えることは可能です。

次の例に、Linux、macOS、あるいは Windows Subsystem for Linux (WSL) で DEFINER を削除する方法を示します。

削除

sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql

検索と置換

sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql

注: masteruser の値を Amazon RDS マスターユーザーの名前に置き換えます。