2008-09-30 4 views
19

Ich verwende mysqldump, um eine Datenbank zwischen Konten auf einer bestimmten Maschine zu replizieren. Alles funktioniert einfach großartig, außer wenn wir zu unseren definierten Ansichten kommen. Da die Dump eine Zeile wie die folgende enthält ...Wie kann ich mit mysqldump Ansichten zwischen Konten replizieren?

/*!50013 DEFINER=`user_a`@`localhost` SQL SECURITY DEFINER */ 

... wenn die Sicherung in mysql auf user_b Laden erhalten wir einen Fehler:

ERROR 1227 (42000) at line 657: Access denied; you need the SUPER privilege for this operation 

Unnötig zu sagen, ich weiß nicht habe SUPER-Rechte für diese mysql-Instanz. Gibt es eine Möglichkeit, mysqldump zu überzeugen, die Ansichten auf benutzerunabhängige Art und Weise auszugeben? Ich kann in diesem Handbuch nichts finden. Muss ich die Dumpdatei tatsächlich analysieren, um die Benutzernamen zu ersetzen? Oder fehlt mir etwas?

Antwort

27

dasselbe Problem. Ich löste es auf diese Weise:

mysqldump -uuser1 -ppassword1 database1 > backup.sql 

sed '/^\/\*\!50013 DEFINER/d' backup.sql > backup_without_50013.sql 

mysql -u user2 -ppassword2 -D database2 < backup_without_50013.sql 

Das Interessante ist, der sed Befehl, die hier alle Zeilen mit/* 50013 beginnen entfernt!.

Heidy

+2

Danke, ich habe am Ende dasselbe gemacht, außer grep -v anstelle von sed zu benutzen, aber das Ergebnis war dasselbe. :) –

2

Die SQL SECURITY-Klauseln bestimmen, welches MySQL-Konto verwendet werden soll, wenn Zugriffsrechte für die Ansicht überprüft werden (wie Sie wahrscheinlich herausgefunden haben).

Wenn Sie eine Ansicht erstellen, können Sie eine Reihe von Sicherheitsoptionen für diese Ansicht definieren. Sie können mehr lesen here, aber im Grunde ist der Zugriff standardmäßig auf den 'Definierer' der Ansicht beschränkt, d. H. Auf den Benutzer, der sie erstellt hat.

+0

Danke, max. Ich habe es überprüft, und es scheint nicht so zu sein, dass das Herumspielen mit diesen Optionen die Art beeinflusst, wie mysqldump die Ausgabe erzeugt. Wenn es die DEFINER-Linie einfach weglassen würde, wäre ich golden. :) –

0

Run mysqldump mit der Option "--skip-triggers"

+0

Interessante Idee, aber das tut nichts, um die @DEFINER-Zeilen in der Dump-Ausgabe zu beeinflussen. Solange ich einen anderen Definierer als den eingeloggten MySQL-Benutzer aktiviere, erhalte ich den Sicherheitsfehler. –

12

Sie müssen die Backup-Datei und ändern Sie die DEFINER verarbeiten:

DEFINER = user_a @localhost

Ich mag es ändern zu:

DEFINER = CURRENT_USE R

Es wird dann automatisch dem Konto zugeordnet, das es lädt.

+3

danke für den Tipp! Ich benutze (ich muss die '' entkommen): sed -ri s/DEFINER = \ '[^ \ '] + \' @ \ '% \'/DEFINER = CURRENT_USER/g file.sql – brunoqc

+2

Dies! Und mit ein wenig "sed" Magie von @brunoqc ist es einfach perfekt – Matthew

Verwandte Themen