スキップしてコンテンツを表示

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

所要時間2分
0

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. (操作に必要なアクセス許可が欠けています)」

このエラーを解決するには、次の手順を実行します。

  1. DB インスタンスで作成したカスタム DB パラメータグループにおいて、log_bin_trust_function_creators パラメータを True に設定します。
  2. インスタンスにファイルを実行する前に、ダンプファイルからコマンドライン (例: 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 ユーザーの名前を変更する

rootmasteruser に、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 インスタンスからデータをエクスポートする

コメントはありません

関連するコンテンツ