多くのビューでDEFINERを変更する


25

更新後にデータベースのバックアップに問題があります。私はシステムをいじって、その理由を探っています。実行した1つのクエリでこの結果が返されました。

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

いくつかの調査の後、これらのビューの定義者は、システムから削除された古い開発者アカウントであるようです。この問題が発生したデータベースとビューは非常にまれにしか使用されず、ほとんどはアーカイブ目的で保持されています。

約40個のビューが存在しますが、それらはもはや存在しません。一度にすべての定義者を別のアカウントに変更する簡単な方法はありますか?mysqldumpですべてのビューをファイルに単純にダンプして、そのファイルを編集してビューを再作成できるようにする方法はありますか?


私にとっては、不足しているアカウントをデータベースに追加しただけで、エラーはなくなりました。
user1794918

回答:


13

すべてのビュー定義を含むテキストファイルを作成します。

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

そこからAllMyViews.sqlを編集します。次に、ビューをドロップします

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

AllMyViews.sqlの編集後、それらをリロードします

mysql -uusername -ppassword -A < AllMyViews.sql

試してみる !!!


information_schemaのview_definitionが表示されないが、SHOW CREATE VIEWが正常に機能する場合の優れた代替手段としての+1。
デレクダウニー

理論的にはDTestのソリューションの方が好きでしたが、私のシステムに関する何かが動作を妨げていました。基本的に上記を使用してshow createステートメントをファイルにダンプし、それらを少し手動で編集してから実行する必要がありました。
ゾレダチェ

SHOWない作業定義者ユーザーが存在しないんときVIEWを作成する-それはmysqldumpを同じエラーがスローされます:The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555

@ Marki555次に、そのユーザーを一時的に作成する必要があります。を実行しCREATE USER 'abc'@'1.2.3.4';ます。その後、再試行してください。
RolandoMySQLDBA 14

私はちょうど自分自身を見ていない、ビューは、いくつかのストアドプロシージャを使用していることに気づいて、そのエラーメッセージは、そのプロシージャの定義にrealatedされる
Marki555

25

情報スキーマとともにALTER VIEWを使用できます。あなたはそれをテキストファイルにダンプすることに言及したので、おそらく次のようなものです:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

これをmysqlコマンドラインと混合します(* nixを想定していますが、Windowsに慣れていません):

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

補足:information_schemaエントリを直接変更することはできません。注2:これは、一度に1つのデータベースに対してのみ機能します。WHEREtable_schemaを省略した場合、それぞれの間にUSEコマンドを挿入する必要があります。


私がこれを気に入っているのは、私のものよりもやや複雑でなく簡潔だからです。+1 !!! (ALTER VIEWを忘れていました)
RolandoMySQLDBA

view_definitionフィールドが空になる理由は何ですか? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; リターン| Staff | |
ゾレダチェ

チャットでの議論から、それはスーパー特権を持つ許可の問題のようです。bugs.mysql.com/bug.php?id=39733
デレクダウニー

完璧なソリューション!+1
パブロマルティネス

少なくともRedHatでは、ファイルに出力する場合、バックティックをエスケープする必要があります。たとえばecho "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
clav

3

Derekのソリューションを自動化すると、DEFINERは root@localhostSQL SECURITY INVOKERれ、すべてのデータベースのすべてのビューで設定されます(最初にそれを確認してください!)。

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

警告:実行する前に、mysqlの完全なバックアップ(たとえば、mysqldを停止し、/ var / lib / mysqlのすべてのファイルをバックアップする)を行ったことを確認してください-念のため...うまくいきましたが、YMMV 。

また、以下を使用してすべてのテーブル/ビューを確認する必要があります。

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

ビュー内の無効な定義者について文句を言う必要はもうありません。


これを恥知らずにスニペットに追加しました。ありがとう!
stefgosselin

3

データベースのすべてのビューをエクスポートします<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切り替えます。


VIEWSをどのようviews.sqlに編集する必要がありますか?また、それらを再作成する方法は?
シェリルホーマン

@SherylHohmanに変更DEFINER = olduser@oldhostするDEFINER = newuser@newhostcat views.sql | mysql <DB>、ビューが再作成されます。
x-yuri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.