事象
mysqldumpでビューやトリガーを含むダンプを取得した。
その後、別インスタンスにロードした。
すると、ビューが動かなくなった。
ビューの定義を確認すると以下の様な定義に置き換わっていた。
CREATE ALGORITHM=UNDEFINED DEFINER=`userhoge`@`%` SQL SECURITY DEFINER VIEW `dbhoge`.`view_hoge` AS select 1
なお、ダンプ、ロードに使用したユーザーは移行元、移行先のどちらにも存在している。
原因
移行先にユーザーは存在しなかったため。
正確には、微妙に違うかった。
誤) `userhoge`@`%`
正) `userhoge`@`localhost`
結果、違うユーザーと認識されてしまったようである。
対応方法
取得したダンプを直接編集して、`userhoge`@`localhost` に変更する。
なお、移行元はユーザーが上記2つそれぞれ存在し、移行先はユーザーが1つのみというのも敗因である。
但し、セキュリティと利便性の関係上これは致し方無なので、都度変更する整理とした。
(%のユーザーを作成していると、localhostで接続しても%側が勝つという仕様を読んだ様な…[自信無いし未調査])
補記事項
定義内容とdefinerの確認方法
- VIEW
select * from information_schema.VIEWS where TABLE_SCHEMA = 'dbhoge';
- procedure
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'dbhoge';