Domanda

MySQL è impressionante! Attualmente sto coinvolto in una migrazione di server maggiore e in precedenza, il nostro piccolo database utilizzato per essere ospitati sullo stesso server come il client.
Così abbiamo usato per fare questo: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

Ora, abbiamo spostato il database a un server e SELECT * INTO OUTFILE .... diverso non funziona più, comprensibile - motivi di sicurezza credo. Ma, curiosamente LOAD DATA INFILE .... può essere cambiato in LOAD DATA LOCAL INFILE .... e bam, funziona.

non mi lamento né sono esprimendo disgusto verso MySQL. L'alternativa a che ha aggiunto 2 linee di codice in più e una chiamata di sistema formano uno script Sql. Tutto quello che volevo sapere è il motivo per cui le opere LOAD DATA LOCAL INFILE e perché non v'è alcuna cosa come SELECT INTO OUTFILE LOCAL?

Ho fatto il mio dovere, non riusciva a trovare una risposta diretta alle mie domande di cui sopra. Non riuscivo a trovare una richiesta di funzionalità @ MySQL sia. Se qualcuno può chiarire che fino, che doveva essere impressionante!

Is MariaDB in grado di gestire questo problema?

È stato utile?

Soluzione

Dal manuale: dichiarazione The SELECT ... INTO OUTFILE è destinato principalmente per far si dump molto rapidamente una tabella in un file di testo sul computer server. Se si desidera creare il file risultante su alcuni client host diverso dal server host, non è possibile utilizzare SELECT ... INTO OUTFILE. In tal caso, si dovrebbe invece usare un comando come mysql -e "SELECT ..." > file_name per generare il file sull'host cliente ".

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

Un esempio:

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

Altri suggerimenti

È possibile ottenere ciò che si vuole con la console mysql con le -s (--silent) opzione passata.

E 'probabilmente una buona idea per passare anche l'opzione -r (--raw) in modo che i caratteri speciali non vengono fuggiti. È possibile utilizzare questo per le query di tubi, come hai intenzione.

mysql -u nome utente -h hostname -p -s -r -e "select concat ( 'questo','', 'opere')"

EDIT: Inoltre, se si desidera rimuovere il nome della colonna dal vostro output, basta aggiungere un altro -s (. Mysql -ss -r etc)

Il percorso si dà per LOAD DATA INFILE è per il file system sulla macchina su cui il server è in esecuzione, non la macchina si connette da. LOAD DATA LOCAL INFILE è per la macchina del cliente, ma richiede che il server è stato avviato con le impostazioni corrette, altrimenti non è permesso. Potete leggere tutto su di esso qui: http: // dev .mysql.com / doc / refman / 5.0 / it / load-dati-local.html

Per quanto riguarda SELECT INTO OUTFILE non sono sicuro perché non c'è una versione locale, oltre ad essere probabilmente difficile da fare tramite la connessione. È possibile ottenere la stessa funzionalità tramite lo strumento mysqldump, ma non attraverso l'invio di SQL al server.

Uso mysql CLI con l'opzione -e come suggerisce Waverly360 è una buona, ma che potrebbe andare la memoria e farsi ammazzare su grandi risultati. (Ho mai trovare la ragione dietro di esso). Se questo è il caso, ed è necessario tutti i record, la mia soluzione è: 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

Re: SELECT * INTO OUTFILE

Controllare se MySQL dispone di autorizzazioni di scrivere un file nella directory OUTFILE sul server.

Dal momento che mi trovo piuttosto regolarmente alla ricerca di questo problema esatto (nella speranza ho perso qualcosa prima ...), ho finalmente deciso di prendere il tempo e scrivere una piccolo nocciolo alle richieste di esportazione di MySQL come file CSV , un po 'come https: //stackoverflow.com/a/28168869 ma sulla base di PHP e con un paio di altre opzioni. Questo è stato importante per il mio caso d'uso, perché ho bisogno di essere in grado di mettere a punto i parametri di CSV (delimitatore, movimentazione valore NULL) e il file devono essere in formato CSV in realtà valide, in modo che un semplice CONCAT non è sufficiente in quanto doesn' t generare file CSV validi se i valori contengono interruzioni di riga o il delimitatore CSV.

Attenzione: richiede PHP per essere installato sul server (Può essere controllato tramite php -v)

"Install" mysql2csv tramite

wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(il download di contenuti del Gist, checksum di controllo e renderlo eseguibile)

Esempio di utilizzo

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

genera /tmp/result.csv file con contenuti

foo,bar
1,2

Guida di riferimento

./mysql2csv --help
Helper command to export data for an arbitrary mysql query into a CSV file.
Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
because the mysql server is running on a remote host.

Usage example:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

cat /tmp/result.csv

Options:
        -q,--query=name [required]
                The query string to extract data from mysql.
        -h,--host=name
                (Default: 127.0.0.1) The hostname of the mysql server.
        -D,--database=name
                The default database.
        -P,--port=name
                (Default: 3306) The port of the mysql server.
        -u,--user=name
                The username to connect to the mysql server.
        -p,--password=name
                The password to connect to the mysql server.
        -F,--file=name
                (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
        -L,--delimiter=name
                (Default: ,) The CSV delimiter.
        -C,--enclosure=name
                (Default: ") The CSV enclosure (that is used to enclose values that contain special characters).
        -E,--escape=name
                (Default: \) The CSV escape character.
        -N,--null=name
                (Default: \N) The value that is used to replace NULL values in the CSV file.
        -H,--header=name
                (Default: 1) If '0', the resulting CSV file does not contain headers.
        --help
                Prints the help for this command.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top