2010-05-19 10 views
31

MySQL ist genial! Ich bin derzeit an einer großen Servermigration beteiligt und zuvor war unsere kleine Datenbank auf demselben Server wie der Client gehostet.
So haben wir dies zu tun: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....MySQL - SELECT * IN OUTFILE LOKAL?

Jetzt haben wir die Datenbank auf einen anderen Server verschoben und SELECT * INTO OUTFILE .... nicht mehr funktioniert, verständlich - aus Sicherheitsgründen, glaube ich. Aber interessanterweise LOAD DATA INFILE .... kann geändert werden zu LOAD DATA LOCAL INFILE .... und bam, es funktioniert.

Ich beschwere mich nicht, noch drücke ich Ekel gegenüber MySQL aus. Die Alternative zu diesem fügte 2 Zeilen zusätzlichen Code und einen Systemaufruf ein .SQL-Skript hinzu. Ich wollte nur wissen, warum LOAD DATA LOCAL INFILE funktioniert und warum gibt es keine SELECT INTO OUTFILE LOCAL?

Ich habe meine Hausaufgaben gemacht, konnte keine direkte Antwort auf meine Fragen oben finden. Ich konnte auch keine Feature-Anfrage bei MySQL finden. Wenn jemand das klären kann, war das großartig!

Kann MariaDB dieses Problem lösen?

+0

Es ist eine Alternative, die den Befehl tee beinhaltet, die Sie die Eingabe und Ausgabe von mysql ein protokollieren können separate Datei auf der Client-Seite, jedoch protokolliert dies die gesamte mysql-Sitzung, anstatt ausgewählte Abfragebefehle auszugeben, und es gibt keine Formatierungsoptionen wie die Ausgabe im CSV-Format. – CMCDragonkai

Antwort

43

Aus dem Handbuch: The SELECT ... INTO OUTFILE Anweisung soll in erster Linie Sie eine Tabelle schnell in eine Textdatei auf dem Server-Rechner ausgeben. Wenn Sie die resultierende Datei auf einem anderen Client-Host als dem Server-Host erstellen möchten, können Sie SELECT ... INTO OUTFILE nicht verwenden. In diesem Fall sollten Sie stattdessen einen Befehl wie mysql -e "SELECT ..." > file_name verwenden, um die Datei auf der Client-Host zu generieren „

http://dev.mysql.com/doc/refman/5.0/en/select.html

Ein Beispiel:.

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt 
2

Re: SELECT * INTO OUTFILE

Überprüfen Sie, ob MySQL-Berechtigungen eine Datei in das OUTFILE Verzeichnis auf dem Server zu schreiben.

+0

Die OUTFILE schreibt auf den Client-Server, der sich von dem Server unterscheidet, auf dem die Datenbank gehostet wird. – ThinkCode

+3

Die MySQL-Dokumentation (http://dev.mysql.com/doc/refman/5.0/en/select.html) definiert den Speicherort von OUTFILE. Es heißt: "Die Datei wird auf dem Server-Host erstellt, so dass Sie die FILE-Berechtigung haben müssen, um diese Syntax zu verwenden. Dateiname darf keine vorhandene Datei sein, die unter anderem Dateien wie/etc/passwd und Datenbanktabellen verhindert zerstört. " Also würde ich überprüfen, ob MySQL berechtigt ist, eine Datei in das Verzeichnis OUTFILE auf dem Server zu schreiben. Ich weiß nicht, warum es keine "LOCAL OUTFILE" -Version gibt. Wenn Sie lokal eine Option exportieren müssen, verwenden viele Leute phpMyAdmin. – Snowcrash

+0

Sie haben mir gerade einen unklaren Posten gerettet. – octopusgrabbus

5

Der Pfad, den Sie an LOAD DATA INFILE übergeben, ist für das Dateisystem auf dem Computer, auf dem der Server ausgeführt wird, nicht für den Computer, von dem aus Sie eine Verbindung herstellen. LOAD DATA LOCAL INFILE ist für den Client-Computer, aber es erfordert, dass der Server mit den richtigen Einstellungen gestartet wurde, sonst ist es nicht erlaubt. Sie können alles über es hier lesen: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

Wie für SELECT INTO OUTFILE Ich bin nicht sicher, warum es keine lokale Version gibt, abgesehen davon, es wahrscheinlich schwierig über die Verbindung zu tun. Sie können die gleiche Funktionalität über das Tool mysqldump erhalten, aber nicht durch das Senden von SQL an den Server.

+1

LOAD DATA funktioniert einwandfrei, aber wenn die Datei auf dem Server, auf dem die Datenbank gehostet wird, abgelegt wird, ist es nicht möglich, die Datei auf dem Client abzulegen, der sich auf einem anderen Server befindet. – ThinkCode

+1

mysqldump und mysql -e swtich-Option beide nicht das beabsichtigte Ergebnis. mysqldump gibt die gesamte db/table aus und wir können nicht nur wenige Spalten basierend auf einer Bedingung ausgeben. mysql -e swtich löscht die Datei im .txt-Format und die Pipe-Ausgabe kann nicht erreicht werden. – ThinkCode

5

können Sie erreichen, was Sie mit dem wollen mysql console mit der Option -s (--silent) übergeben

Es ist wahrscheinlich eine gute Idee, auch die Option -r (--raw) zu übergeben, damit Sonderzeichen nicht maskiert werden Dies um Anfragen wie Sie wollen ng.

mysql -u Benutzername h Host-Name -p es -r-„wählen concat ('this',‘‘, 'funktioniert')“

EDIT: Auch, wenn Sie die Spalte entfernen Name aus Ihrer Ausgabe, fügen Sie einfach eine andere -s (mysql -ss -r etc.)

2

Verwenden von mysql CLI mit-e-Option wie Waverly360 schlägt vor, ist eine gute, aber das könnte aus dem Speicher gehen und auf große getötet werden Ergebnisse.(Havent findet den Grund dafür). Wenn das der Fall ist, und Sie müssen alle Datensätze, meine Lösung ist: mysqldump + mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py 
mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv