MysqlでVIEWのDEFINERを変更するにはどうすればよいですか?


35

mysqldumpを実行すると、エラーが発生します。

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

foobarもはや存在しないレガシーマシンであるため、これは理にかなっています。

すべてのテーブルの定義者を「root」@「localhost」に変更するにはどうすればよいですか?


4
ビューはありますか?テーブルには定義者がいないはずです... dba.stackexchange.com/q/4129/630
gbn

1
@gbn +1あなたは正しかった-彼らはビューでした-リンクのthxですが、私はそれを完全に正しく動作させることができませんでした。しかし、ダンプを実行できるように、SQLyogのビューを変更できました。
kfmfe04

それは私のために働く。{{すべてをに付与します。付与オプション付きの「パスワード」で識別される「ルート」@「%」}}
ムハンマドアゼム

回答:


33

ダンプしようとしているデータベースには、root @ 'foobar'としてログインしている間にユーザーが定義したプロシージャ/メソッドが含まれていると思います。

今の解決策は、そのプロシージャ/メソッドの定義者を置き換える必要があることです

その後、エラーなしでダンプを生成できます。

次のようにできます。

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

これにより、すべてのデータベースのすべての定義者が変更されるため、注意してください。

それを試してみてください....!

2012年2月9日に更新

私が@gbnによって与えられたリンクを見たように、これはケースでもあり得る@Rolandoによって与えられた答えです。リンクをご覧ください

@RolandoMySQLDBA 2011-12-16 11:20 EDTによる編集

危険ですが、この答えは良いです。明確にするために、次のようにクエリでデータベースを指定できます。

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

1
上記のリンクは、ALTERステートメントを使用してそれを行う方法を示しています。これはリスクが低い可能性があります...また、UPDATEの定義者の更新を確認してください
gbn

UPDATEテーブルを変更しましたが、表示されmysqldumpません:mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES。再起動しmysqlた後でも。走っているmysql-5.5.31
x-yuri 14

私の悪い。定義者が間違っているビューもありました。update mysql.procアプローチは実際に動作します。
x-yuri 14

動作しませんでした....
カオナシ14

3
この回答は、プロシージャと関数の定義者を変更する場合に有効ですが、ビューの定義者は変更しません。
アンソニーG-モニカの正義

35

使いやすい--single-transactionスイッチ:

mysqldump --single-transaction -u username -p db > db.sql

1
申し訳ありませんが、これは元の質問で説明された問題にどのように対処しますか?あなたのように見えますが...間違って質問に答え
dezso

6
--single-transactionはデータベース名の前にある必要があるため、答えの構造は間違っていますが、答えは実際には正しいです。このオプションを指定すると、mysqldumpのロック動作を変更することで問題が回避されるため、元の質問のエラーは発生しなくなります。
マイケル-sqlbot

私は同じ問題に直面しました。働いた-シングルトランザクション。

それが何をするのかはわかりませんが、うまくいきました!ありがとう
スリハルシャカパラ

17

最も迅速な解決策は、既存のユーザーとの競合が発生しない限り、存在するように定義者を再作成することです。

CREATE USER 'root'@'foobar';


ユーザーが 'root' @ '%'だった場合はどうなりますか?私たちが責任を負っているサーバーでは、そのようなことを単に拒否します。
アッティラフロップ

@AttilaFulopはい、確かにセキュリティを考慮する必要がありますが、これは完璧なソリューションではなく「最も迅速な」ソリューションだと言いました。インポートが完了したら、ユーザーを削除して、余​​分なユーザーがいるリスクを軽減できます。
ColinM

その通りです。この特定の側面にも注意を引きたいと思っただけです。同僚が 'root' @ '%'を追加して、チャックノリスが生きている限りそこに残していました。永遠に;)
アッティラフロップ

6

データベースのすべてのビューをエクスポートします<DB>

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

または:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

編集 views.sqlそれらをして再作成します。

cat views.sql | mysql <DB>

必要に応じて指定-uして-p切り替えます。


これは、クリーンな答えである
ウォルフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.