Ändern Sie den DEFINER in vielen Ansichten

25

Ich habe Probleme beim Sichern meiner Datenbanken nach einem Update. Ich habe mich in meinem System umgesehen und versucht herauszufinden, warum. Eine Abfrage, die ich ausgeführt habe, ergab dieses Ergebnis.

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

Nach einigen Nachforschungen scheint es, dass der Definierer für diese Ansichten ein altes Entwicklerkonto ist, das aus dem System gelöscht wurde. Die Datenbanken und Ansichten mit diesem Problem werden sehr selten verwendet und die meisten werden zu Archivierungszwecken aufbewahrt.

Es gibt ungefähr 40 Views mit einem Definer, der nicht mehr existiert. Gibt es eine einfache Möglichkeit, den Definer für alles gleichzeitig auf ein anderes Konto umzustellen? Gibt es eine Möglichkeit, mysqldump dazu zu bringen, einfach alle Ansichten in eine Datei zu kopieren, damit ich diese Datei bearbeiten und die Ansichten neu erstellen kann?

Zoredache
quelle
Für mich habe ich gerade das fehlende Konto zur Datenbank hinzugefügt und der Fehler ist verschwunden.
user1794918

Antworten:

13

Erstellen Sie eine Textdatei mit allen Ansichtsdefinitionen:

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

Dort bearbeiten Sie AllMyViews.sql. Löschen Sie dann die Ansichten

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

Nach der Bearbeitung von AllMyViews.sql laden Sie sie neu

mysql -uusername -ppassword -A < AllMyViews.sql

Versuche es !!!

RolandoMySQLDBA
quelle
+1 als großartige Alternative, wenn die view_definition von information_schema nicht angezeigt wird, SHOW CREATE VIEW jedoch einwandfrei funktioniert.
Derek Downey
Die Lösung von DTest gefiel mir zwar theoretisch besser, aber etwas an meinem System verhinderte, dass sie funktionierte. Ich habe die obigen Anweisungen im Grunde genommen verwendet, um die show create-Anweisungen in eine Datei zu kopieren, und ich musste sie manuell ein wenig bearbeiten und dann ausführen.
Zoredache
SHOW CREATE VIEW funktioniert nicht, wenn der definierende Benutzer nicht vorhanden ist. Es wird derselbe Fehler The user specified as a definer ('abc'@'1.2.3.4') does not exist
ausgegeben
@ Marki555 Anschließend müssen Sie diesen Benutzer vorübergehend erstellen. rennen CREATE USER 'abc'@'1.2.3.4';. Versuchen Sie es dann erneut.
RolandoMySQLDBA
Ich habe gerade bemerkt, dass die Ansicht eine gespeicherte Prozedur verwendet und die Fehlermeldung an den Definierer dieser Prozedur weitergeleitet wird, nicht an sich selbst
Marki555
25

Sie können ALTER VIEW in Verbindung mit dem Informationsschema verwenden . Du hast erwähnt, dass du es in eine Textdatei kopierst, also vielleicht in etwa so:

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

Mischen Sie dies mit der mysql-Befehlszeile (vorausgesetzt, * nix, nicht vertraut mit Windows):

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

Anmerkung: Sie können die information_schema-Einträge nicht direkt ändern . Hinweis 2: Dies funktioniert jeweils nur für eine Datenbank. Wenn Sie WHERE table_schema weglassen, müssen Sie USE-Befehle zwischen den einzelnen Datenbanken einfügen.

Derek Downey
quelle
Ich mag das, weil es etwas weniger kompliziert und prägnanter aussieht als meins. +1 !!! (Ich habe ALTER VIEW vergessen)
RolandoMySQLDBA
Irgendeine Idee, warum das view_definition-Feld leer wäre? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; kehrt zurück| Staff | |
Zoredache
Aus der Diskussion im Chat geht hervor, dass es sich um ein Berechtigungsproblem mit dem Superprivileg handelt. bugs.mysql.com/bug.php?id=39733
Derek Downey
Perfekte Lösung! +1
Pablo Martinez
Zumindest bei RedHat, wenn Sie in eine Datei ausgeben, müssen Sie die Back Ticks echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
umgehen
3

Bei der Automatisierung der Dereks-Lösung wird DEFINER in allen Ansichten in allen Datenbanken auf " root@localhostund" gesetzt SQL SECURITY INVOKER(stellen Sie sicher, dass Sie das zuerst wollen!):

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

WARNUNG: Stellen Sie sicher, dass Sie ein vollständiges MySQL-Backup erstellt haben (z. B. durch Stoppen von MySQL und Sichern aller Dateien in / var / lib / mysql), bevor Sie es ausführen - nur für den Fall ... Es hat bei mir funktioniert, aber bei YMMV .

Sie sollten auch alle Ihre Tabellen / Ansichten überprüfen mit:

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'

Es sollte sich nicht länger über ungültige Definierer in Views beschweren.

Matija Nalis
quelle
Schamlos fügte dies meinen Ausschnitten hinzu. Vielen Dank!
Stefgosselin
3

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 views.sql(Definierer ändern) und neu erstellen:

cat views.sql | mysql <DB>

Geben Sie an -uund -pwechseln Sie bei Bedarf.

x-yuri
quelle
Wie sollen die VIEWS views.sqlbearbeitet werden? Auch, wie man sie neu erstellt?
SherylHohman
@SherylHohman Ändern DEFINER = olduser@oldhostin DEFINER = newuser@newhost, cat views.sql | mysql <DB>erstellt die Ansichten neu.
X-Yuri