Wie ändere ich den DEFINER einer VIEW in MySQL?

35

Wenn ich mysqldump starte, erhalte ich eine Fehlermeldung:

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

Dies ist sinnvoll, da foobares sich um eine Legacy-Maschine handelt, die nicht mehr existiert.

Wie ändere ich den Definer aller meiner Tabellen auf 'root' @ 'localhost'?

kfmfe04
quelle
4
Hast du Views? Tabellen haben nicht definers ich bin sicher , ... Siehe auch dba.stackexchange.com/q/4129/630
gbn
1
@gbn +1 du hattest recht - sie waren Ansichten - danke für den Link, aber ich konnte es nicht ganz richtig zum Laufen bringen. Allerdings konnte ich die Ansichten in SQLyog so ändern, dass ich den Dump durchführen konnte.
kfmfe04
Es funktioniert bei mir. {{alles gewähren auf . an 'root' @ '%' identifiziert durch 'password' mit Erteilungsoption; }}
Muhammad Azeem

Antworten:

33

Ich denke, dass die Datenbank, die Sie sichern möchten, Prozeduren / Methoden enthält, die von einem Benutzer definiert wurden, als er als root @ 'foobar' angemeldet war.

Jetzt besteht die Lösung darin, dass Sie die Definer für diese Prozeduren / Methoden ersetzen müssen

dann können Sie den Speicherauszug ohne den Fehler generieren.

Sie können dies tun, wie ..

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

Seien Sie vorsichtig, da dies alle Definitionen für alle Datenbanken ändert.

Versuch es....!

UPDATE am 9. Februar 2012

Da ich den Link von @gbn gesehen habe, der eine Antwort von @Rolando ist, kann das auch der Fall sein. Bitte besuchen Sie den Link

BEARBEITEN von @RolandoMySQLDBA 16.12.2011 11:20 EDT

Diese Antwort ist zwar riskant, aber gut. Zur Verdeutlichung: Sie können die Datenbank in Ihrer Abfrage wie folgt angeben:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';
Abdul Manaf
quelle
1
Der obige Link zeigt, wie man es mit ALTER-Anweisungen macht, die möglicherweise weniger riskant sind ... Überprüfen Sie auch mein Update auf die Definitionen in Ihrem UPDATE
gbn
UPDATEdie Tabelle geändert, aber mysqldumpsieht es nicht: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Auch nach dem Neustart mysql. Ich renne mysql-5.5.31.
X-Yuri
Mein Fehler. Ich hatte auch Ansichten mit einem falschen Definer. update mysql.procAnsatz funktioniert in der Tat.
X-Yuri
Hat nicht funktioniert ...
カ ナ シ
3
Diese Antwort dient zum Ändern der Definitionen von Prozeduren und Funktionen, ändert jedoch nicht den Definierer einer Ansicht .
Anthony G - Gerechtigkeit für Monica
35

Einfachere Verwendung des --single-transactionSchalters:

mysqldump --single-transaction -u username -p db > db.sql
Stange
quelle
1
Entschuldigung, wie wird das in der ursprünglichen Frage beschriebene Problem behoben? Sieht so aus, als hätten Sie die falsche Frage beantwortet ...
22.
6
Die Struktur der Antwort ist falsch, da --single-transaction vor dem Datenbanknamen stehen muss, die Antwort jedoch tatsächlich korrekt ist. Das Angeben dieser Option umgeht das Problem, indem das Sperrverhalten von mysqldump geändert wird, sodass der Fehler in der ursprünglichen Frage nicht mehr auftritt.
Michael - sqlbot
Ich stand vor dem gleichen Problem. arbeitete - Single-Transaktion.
Nicht sicher, was es tut, aber es hat funktioniert! Vielen Dank
Sri Harsha Kappala
17

Die schnellste Lösung wäre lediglich, den Definer neu zu erstellen, sofern er nicht zu Konflikten mit vorhandenen Benutzern führt.

CREATE USER 'root'@'foobar';

ColinM
quelle
Was ist, wenn der Benutzer 'root' @ '%' war? Ich bestreite einfach so etwas auf einem Server, für den wir verantwortlich sind.
Attila Fulop
@AttilaFulop Ja, Sicherheit sollte auf jeden Fall in Betracht gezogen werden, aber ich sagte, dies sei die "schnellste" Lösung, nicht die perfekte. Sobald der Import abgeschlossen ist, kann der Benutzer gelöscht werden, um das Risiko zusätzlicher Benutzer zu verringern.
ColinM
Da hast du recht. Ich wollte nur auch auf diesen speziellen Aspekt aufmerksam machen. Meine Arbeitskollegen hätten 'root' @ '%' hinzugefügt und dort belassen, solange Chuck Norris lebt, d. H. für immer;)
Attila Fulop
6

Exportieren Sie alle Ansichten der Datenbank <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

oder:

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

Bearbeiten Sie sie views.sqlund erstellen Sie sie neu:

cat views.sql | mysql <DB>

Geben Sie an -uund -pwechseln Sie bei Bedarf.

x-yuri
quelle
Dies ist die sauberste Antwort
Wolfe