Antworten auf Ihre häufigsten Fragen

MySQL Views und Datenbank-Exporte und -Importe

Beim Import von MySQL-Datenbankdumps, die Views enthalten, kann es zu Fehlermeldungen über fehlende SUPER-Privileges kommen. In diesem Artikel zeigen wir Ihnen, wie Sie solche Dumps erfolreich importieren können. Beim Anlegen eines Views wird dem View ein sog. "DEFINER" mitgegeben. Dabei handelt es sich um die Angabe des Users unter welchem der View angelegt wurde. Wird DEFINER beim CREATE VIEW-Statement nicht explizit mit angegeben, wird automatisch CURRENT_USER verwendet - also der User, welcher das CREATE VIEW-Statement absetzt.

Beim Export einer Datenbank/Tabelle wird in den Dump das komplette CREATE VIEW-Statement geschrieben, inklusive der DEFINER-Angabe. Die genauen Daten, welche nachher im Dump stehen, kann man sich für einen View mit nachfolgendem Befehl anzeigen lassen:

show create view testview\G
*************************** 1. row ***************************
View: testview
Create View: CREATE
ALGORITHM=UNDEFINED
DEFINER=`db1234567-test`@`localhost`
SQL SECURITY DEFINER
VIEW `testview`
AS select `tbl`.`clmn1` AS `clmn1`
from `tbl` where (`tbl`.`id` >= '3')

In diesem Fall wurde der View also vom User 'db1234567-test'@'localhost' angelegt, oder die DEFINER-Angabe wurde beim Anlegen des Views manuell durch einen User welcher über das SUPER-Privilege verfügt festgelegt. Soll der Dump nun wieder importiert werden, gilt:

Ein View darf nur angelegt werden, wenn der im DEFINER angegebene User gleich dem User ist, welcher den View anlegt/den Dump einspielt. Wurde der View also von 'db1234567-test'@'localhost' erzeugt, es wird aber versucht den Dump als User 'db1234567-foo'@'localhost' zu importieren, schlägt der Import mit Verweis auf die fehlenden SUPER-Privileges fehl. Es ist auch unbedingt zu beachten, dass nicht nur der User-, sondern auch die Hostangabe identisch sein muss.

Das heißt: 'db1234567-test'@'%' ist NICHT gleich 'db1234567-test'@'localhost' ist NICHT gleich 'db1234567-test'@'server01.dbadmin.hosteurope.de' etc.

Da in einem Dump Views mit unterschiedlichen DEFINER-Angaben vorkommen können, ist wohl die einfachste Möglichkeit einen Dump zu importieren, sämtliche DEFINER-Angaben aus den CREATE VIEW-Statements manuell (mit einem Editor) zu löschen.

Wie bereits beschrieben, verwendet CREATE VIEW beim Weglassen der DEFINER-Angabe einfach die Information DEFINER = CURRENT_USER zum Anlegen des Views, wodurch nur der zum Import genutzte User das CREATE VIEW-Privilege benötigt, ansonsten aber eigentlich nichts weiter zu beachten ist. Je nach Umfang der Datenbank ist es teilweise kaum noch möglich, einen Dump manuell im Editor zu editieren.

Es empfiehlt sich daher zwei Dumps zu erzeugen:

1) Einen "Structure"-Dump, welcher lediglich die Struktur der MySQL-Datenbank und aller enthaltenen Tabellen/Funktionen/etc enthält.

2) Einen "Data"-Dump, welcher keine Informationen über irgendeine Struktur, sondern ausschliesslich die in der Datenbank befindlichen Daten enthält.

Zum Erzeugen dieser Dumps geht man wie folgt vor:

Structure-Dump:

- Via PHPMyAdmin: Im Export-Tab der entsprechenden Datenbank den Haken bei "Data" im "Options"-Bereich entfernen.

- Via mysqldump in der SSH:

mysqldump --quick --quote-names --allow-keywords \
--force --no-data db1234567-test > db1234567-test_struct.sql

Data-Dump:

- Via PHPMyAdmin: Im Export-Tab der entsprechenden Datenbak den Haken bei "Structure" im "Options"-Bereich entfernen.

- Via mysqldump in der SSH:

mysqldump --quick --quote-names --allow-keywords \
--force --extended-insert --no-tablespaces \
--no-create-db --no-create-info --skip-add-drop-table \
db1234567-test > db1234567-test_data.sql

Anschließend kann dann der erzeugte db1234567-test_struct.sql-Dump in einem Texteditor bearbeitet werden. Wie oben erwähnt, empfiehlt es sich, einfach jegliches vorkommen von "DEFINER = @" zu löschen.

HINWEIS: Auf keinen Fall einfach alle Vorkommen des Wortes "DEFINER" löschen!

Beispiel:

"[...]
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dbu1234567`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `testview` AS select `tbl`.`id` AS `id`,`tbl`.`clmn1` AS
`clmn1`
* from `tbl` where (`tbl`.`id` >= 3) */;
[...]"

ändern in

"[...]
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 SQL SECURITY DEFINER */
/*!50001 VIEW `testview` AS select `tbl`.`id` AS `id`,`tbl`.`clmn1` AS
`clmn1`
* from `tbl` where (`tbl`.`id` >= 3) */;
[...]"

Die beiden Dumps können dann nacheinander (erst Structure, dann Data) wieder importiert werden. Das Einhalten der Reihenfolge ist dabei unbedingt zu beachten.


otto.friedrich@hosteurope.de xanthippe.ypsilante@hosteurope.de hercules.ikarus@hosteurope.de