File non trovato dopo l'esportazione di MySQL
-
14-11-2019 - |
Domanda
Ho bisogno di esportare i dati da una tabella a un CSV.Ho la seguente struttura (non proprio il mio tavolo ma per scopi demo)
CREATE TABLE `mytable` (
`id` int(11) DEFAULT NULL,
`mycolumn` varchar(25) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
.
con i dati (circa 3000 record).Ora voglio esportare alcuni di questi record (da uno script che corro via cronjob)
SELECT * INTO OUTFILE '/tmp/mytable.sql'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM mytable;
.
Mostra:
Query OK, 3 rows affected (0.00 sec)
.
Allora io faccio:
ls: cannot access /tmp/mytable.sql: No such file or directory
.
Dov'è il mio file?
Soluzione
Quando si utilizza il comando INTO OUTFILE
, esporta i dati nella cartella locale del server non quello che si esegue la query.
Esempio: sei sul computer (IP: 192.168.0.100) e ti connetti a MySQLServer (IP: 192.168.0.101) utilizzando il comando MySQL: mysql -uuser -h192.168.0.101 -A database
.Eseguendo SELECT * INTO OUTFILE
Il file viene salvato su MySQLServer (IP: 192.168.0.101) e non sul computer (IP: 192.168.0.100).
Ora, è possibile utilizzare uno script che crea un file CSV (nel tuo Cronjob: seleziona tutti i dati, generano il file e invia tramite SCP all'altro server).
o - È inoltre possibile avere un NFS montato su /shared/
e quando si crea automaticamente il file l'altro server.
o - puoi semplicemente eseguire un comando mysql in uno script bash come questo dal tuo primo server.
mysql -uroot test -B -e "select * from test.mytable;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > /tmp/filename.csv
.