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?
Antworten:
Erstellen Sie eine Textdatei mit allen Ansichtsdefinitionen:
Dort bearbeiten Sie AllMyViews.sql. Löschen Sie dann die Ansichten
Nach der Bearbeitung von AllMyViews.sql laden Sie sie neu
Versuche es !!!
quelle
The user specified as a definer ('abc'@'1.2.3.4') does not exist
CREATE USER 'abc'@'1.2.3.4';
. Versuchen Sie es dann erneut.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:
Mischen Sie dies mit der mysql-Befehlszeile (vorausgesetzt, * nix, nicht vertraut mit Windows):
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.
quelle
SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp';
kehrt zurück| Staff | |
echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
Bei der Automatisierung der Dereks-Lösung wird DEFINER in allen Ansichten in allen Datenbanken auf "
root@localhost
und" gesetztSQL SECURITY INVOKER
(stellen Sie sicher, dass Sie das zuerst wollen!):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:
Es sollte sich nicht länger über ungültige Definierer in Views beschweren.
quelle
Exportieren Sie alle Ansichten der Datenbank
<DB>
:oder:
Bearbeiten
views.sql
(Definierer ändern) und neu erstellen:Geben Sie an
-u
und-p
wechseln Sie bei Bedarf.quelle
views.sql
bearbeitet werden? Auch, wie man sie neu erstellt?DEFINER = olduser@oldhost
inDEFINER = newuser@newhost
,cat views.sql | mysql <DB>
erstellt die Ansichten neu.