mysqldump エラー 1449: DEFINER が存在しないユーザーを参照している場合の対処法
mysqldump でデータベースをダンプしようとしたら、こんなエラーが出て止まった経験はないでしょうか。 mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES これは MySQL の DEFINER という仕組みに起因するエラーです。ビューやストアドプロシージャの作成時に記録された「定義者(DEFINER)」ユーザーが、現在のサーバー上に存在しない場合に発生します。 なぜ起きるのか MySQL のビュー、ストアドプロシージャ、トリガー、イベントには DEFINER 属性があります。これはそのオブジェクトを作成した MySQL ユーザーを記録したもので、SQL SECURITY DEFINER(デフォルト)の場合、オブジェクトの実行は DEFINER ユーザーの権限 で行われます。 mysqldump は LOCK TABLES を実行する際、ダンプ対象のビューなどの DEFINER ユーザーを参照します。このとき、DEFINER に設定されたユーザー(例: 'root'@'%')がサーバー上に存在しなければ、エラー 1449 で処理が中断されます。 よくあるシナリオ: 本番環境から別環境にデータベースをコピーした際、元の環境にいた root@'%' が移行先に存在しない MySQL のユーザーを整理した際、ビューの DEFINER を更新し忘れた root@'localhost' しか存在しないのに、ビューが root@'%' で作成されていた DEFINER が問題のオブジェクトを特定する まず、どのオブジェクトが問題の原因かを information_schema で確認します。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 -- ビュー SELECT DEFINER, TABLE_SCHEMA, TABLE_NAME FROM information_schema.VIEWS WHERE DEFINER LIKE '%root@%'; -- ストアドプロシージャ / ファンクション SELECT DEFINER, ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE FROM information_schema.ROUTINES WHERE DEFINER LIKE '%root@%'; -- イベント SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER FROM information_schema.EVENTS WHERE DEFINER LIKE '%root@%'; -- トリガー SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER FROM information_schema.TRIGGERS WHERE DEFINER LIKE '%root@%'; 多くの場合、ビューが原因です。該当するオブジェクトが見つかったら、その定義を確認しましょう。 ...