Wenn es darum geht, Daten aus MySQL zu exportieren oder fremde Daten direkt in eine MySQL-Tabelle zu importieren, dann müssen wir zunächst sicherstellen, dass wir die entsprechenden Rechte haben.
mysql> select * from akten order by Titel into outfile '/home/up/export.tb'; ERROR 1045: Access denied for user: 'up@localhost' (Using password: YES)
Erinnern wir uns, wir haben dem User 'up' nur Rechte für die Datenbank 'archiv' gegeben. Beim Exportieren (und auch Importieren) benötigen wir zusätzliche Rechte, weil wir die abgeschlossene MySQL-Welt verlassen und direkt mit Linux sprechen. Wir haben gelernt, dass sämtliche Rechte in der Tabelle 'mysql' verwaltet werden. Da unser User 'up' mehr Rechte erhalten soll, sollten wir das in der Tabelle 'user' finden. Wir melden uns mit 'root@localhost' an, geben 'use mysql' ein und lassen uns die Struktur anzeigen, um herauszufinden, welche Einstellung tangiert werden könnte:
mysql> describe user; +-----------------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-----------------+------+-----+---------+-------+ | Host | char(60) binary | | PRI | | | | User | char(16) binary | | PRI | | | | Password | char(16) binary | | | | | | Select_priv | enum('N','Y') | | | N | | | Insert_priv | enum('N','Y') | | | N | | | Update_priv | enum('N','Y') | | | N | | | Delete_priv | enum('N','Y') | | | N | | | Create_priv | enum('N','Y') | | | N | | | Drop_priv | enum('N','Y') | | | N | | | Reload_priv | enum('N','Y') | | | N | | | Shutdown_priv | enum('N','Y') | | | N | | | Process_priv | enum('N','Y') | | | N | | | File_priv | enum('N','Y') | | | N | | | Grant_priv | enum('N','Y') | | | N | | | References_priv | enum('N','Y') | | | N | | | Index_priv | enum('N','Y') | | | N | | | Alter_priv | enum('N','Y') | | | N | | +-----------------+-----------------+------+-----+---------+-------+ 17 rows in set (0.00 sec)
Es sollte nicht schwer sein, herauszufinden, dass wir dem User 'up' wohl das Recht 'File_priv' geben müssen. Um sicher zu gehen, schauen wir kurz nach, was für Rechte er hat:
mysql> select Host,User,File_priv from user where User='up'; +-----------+------+-----------+ | Host | User | File_priv | +-----------+------+-----------+ | localhost | up | N | +-----------+------+-----------+ 1 row in set (0.00 sec)
Ok, wir wissen nun, was zu tun ist und geben dem User 'up' das entsprechende Recht:
mysql> update user set File_priv='Y' where User='up'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select Host,User,File_priv from user where User='up'; +-----------+------+-----------+ | Host | User | File_priv | +-----------+------+-----------+ | localhost | up | Y | +-----------+------+-----------+ 1 row in set (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
So, nun kann sich der User 'up' anmelden und den Export durchführen. Für den Exportvorgang verwenden wir 'select ... into outfile ...':
mysql> select * from akten into outfile '/home/up/export.tb'; ERROR 1: Can't create/write to file '/home/up/export.tb' (Errcode: 13)
Die Fehlermeldung mag auf den ersten Blick irritieren. Wir haben dem User 'up' die Rechte doch korrekt erteilt? Schon, aber der Export wird durch MySQL durchgeführt und deshalb benötigen wir im Export-Verzeichnis zumindest Schreib-Rechte für 'Alle'. Das erledigen wir direkt in der Linux-Konsole mit:
shell> mkdir /home/up/mysql shell> chmod -R a+rw /home/up/mysql
Nach dem Export sollten wir die
Rechte wieder mit 'chmod -R go-rw /home/up/mysql' zurücksetzen, damit
die Datei nicht von Dritten eingesehen werden kann. Alternativ könnten
wir auch mit dem User 'mysql' und der Gruppe 'mysql' arbeiten, was mir
aber aus Sicherheitsüberlegungen weniger sinnvoll erscheint.