2010-05-19 14 views
31

MySQL è fantastico! Attualmente sono coinvolto in un'importante migrazione del server e in precedenza il nostro piccolo database era ospitato sullo stesso server del client.
così abbiamo usato per fare questo: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....MySQL - SELEZIONA * IN LOCALE OUTFILE?

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

Non mi lamento né sto esprimendo disgusto nei confronti di MySQL. L'alternativa a quella aggiunta 2 righe di codice aggiuntivo e una chiamata di sistema formano uno script .sql. Tutto quello che volevo sapere è perché funziona LOAD DATA LOCAL INFILE e perché non esiste qualcosa come SELECT INTO OUTFILE LOCAL?

Ho fatto i compiti, non ho trovato una risposta diretta alle mie domande sopra. Neanche io sono riuscito a trovare una richiesta di funzionalità @ MySQL. Se qualcuno può chiarirlo, sarebbe stato fantastico!

MariaDB è in grado di gestire questo problema?

+0

c'è un'alternativa che comporta l'uso del comando tee che permette di registrare l'ingresso e l'uscita di mysql per un file separato sul lato client, tuttavia questo registra l'intera sessione mysql, piuttosto che emettere il contenuto di query selezionate, e non ci sono opzioni di formattazione come l'output in stile CSV. – CMCDragonkai

risposta

43

Dal manuale: l'istruzione The SELECT ... INTO OUTFILE è concepita principalmente per consentire di scaricare rapidamente una tabella in un file di testo sul computer server. Se si desidera creare il file risultante su un host client diverso dall'host del server, 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 client "

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

Un esempio:.

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

Re: SELECT * INTO OUTFILE

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

+0

L'OUTFILE deve scrivere sul server del client che è diverso dal server su cui è ospitato il database. – ThinkCode

+3

I documenti MySQL (http://dev.mysql.com/doc/refman/5.0/en/select.html) definiscono la posizione di OUTFILE. Si afferma: "Il file viene creato sull'host del server, quindi è necessario avere il privilegio FILE per utilizzare questa sintassi. Nome_file non può essere un file esistente, che tra l'altro impedisce l'esistenza di file come/etc/passwd e le tabelle del database distrutto. " Quindi, vorrei verificare se MySQL ha le autorizzazioni per scrivere un file nella directory OUTFILE sul server. Non so perché non esiste una versione "LOCAL OUTFILE". Se devi esportare localmente un'opzione che molte persone usano è phpMyAdmin. – Snowcrash

+0

Mi hai appena salvato un post poco chiaro. – octopusgrabbus

5

Il percorso assegnato a LOAD DATA INFILE è per il filesystem sulla macchina su cui è in esecuzione il server, non sulla macchina da cui si effettua la connessione. LOAD DATA LOCAL INFILE è per il computer del cliente, ma richiede che il server sia stato avviato con le impostazioni corrette, altrimenti non è consentito. Puoi leggere tutto su di esso qui: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

Per quanto riguarda SELECT INTO OUTFILE Non sono sicuro del motivo per cui non esiste una versione locale, oltre a essere probabilmente difficile da fare rispetto alla connessione. È possibile ottenere la stessa funzionalità tramite lo strumento mysqldump, ma non attraverso l'invio di SQL al server.

+1

LOAD DATA funziona bene ma, se possibile, il dump del file sul server su cui è ospitato il DB, non è possibile scaricare il file sul client che si trova su un altro server. L'opzione – ThinkCode

+1

mysqldump e mysql -e swtich non raggiungono il risultato desiderato. mysqldump scarica l'intero db/table e non possiamo scaricare solo poche colonne in base a una condizione. mysql -e swtich scarica il file in formato .txt e non è possibile ottenere l'output di pipe. – ThinkCode

5

È possibile ottenere ciò che si vuole con la mysql console con l'opzione -s (--silent) inoltrata.

Probabilmente è una buona idea anche passare l'opzione -r (--raw) in modo che i caratteri speciali non vengano scappati. questo per sondare domande come te ng.

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

EDIT: Inoltre, se si desidera rimuovere la colonna nome dal tuo output, aggiungi un altro -s (mysql -ss -r ecc.)

2

Utilizzo di mysql CLI con l'opzione -e come suggerito da Waverly360 è buono, ma che potrebbe andare fuori memoria e venire ucciso su grandi risultati.(Havent trova il motivo 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