Scarica un database mysql su un backup in testo normale (CSV) dalla riga di comando


92

Vorrei evitare mysqldump poiché restituisce in una forma che è conveniente solo per mysql da leggere. CSV sembra più universale (un file per tabella va bene). Ma se ci sono vantaggi per mysqldump, sono tutt'orecchi. Inoltre, mi piacerebbe qualcosa che posso eseguire dalla riga di comando (linux). Se si tratta di uno script mysql, sarebbero utili suggerimenti su come fare una cosa del genere.


Risposte:


140

Se riesci a gestire la tabella alla volta ei tuoi dati non sono binari, utilizza l' -Bopzione per il mysqlcomando. Con questa opzione genererà file TSV (separati da tabulazioni) che possono essere importati in Excel, ecc. Abbastanza facilmente:

% echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database

In alternativa, se hai accesso diretto al file system del server, usa SELECT INTO OUTFILEche può generare file CSV reali:

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table

Grazie! la tua seconda "tabella" dovrebbe essere "database", giusto? nessuna opzione per CSV invece di TSV che conosci?
dreeves il

duh - sì, avrebbe dovuto leggere "database". No, non c'è alcuna opzione per CSV, questo è il meglio che conosco senza usare il "select into outfile" integrato di MySQL, che può eseguire CSV, ma scrive i file sul server, non sul client.
Alnitak

come forzare la sovrascrittura sul file di output?
JCm

11
Notare che quando viene fornito un percorso relativo (o semplicemente un nome di file), il file verrà visualizzato nella directory MYSQL e non nella directory della shell corrente (ovvero da dove si \. file.sqllegge). Pertanto, a seconda dell'installazione, probabilmente lo troverai a/var/lib/mysql/[db_name]/table.csv
Mala


26

Puoi eseguire il dump di un intero database in una volta con l' mysqldump's --tabopzione. Fornisci un percorso di directory e crea un .sqlfile con la CREATE TABLE DROP IF EXISTSsintassi e un .txtfile con i contenuti, separati da tabulazioni. Per creare file separati da virgole è possibile utilizzare quanto segue:

mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name

Quel percorso deve essere scrivibile sia dall'utente mysql che dall'utente che esegue il comando, quindi per semplicità lo consiglio chmod 777 /tmp/path_to_dump/prima.


1
Ho continuato a tornare a questa risposta, è sicuramente il modo migliore per esportare tutte le tabelle in un file delimitato.
joevallender

mysqldump: You must use option --tab with --fields-...
Marco Marsala

Come root: GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 . Nel mio caso ho dovuto prendere /var/lib/mysql-files/(invece di /tmp/), impostare l'utente su mysql: mysql e impostare i diritti su 777 - stackoverflow.com/a/32737616/1707015 .
qräbnö

18

L'opzione di selezione nel file di uscita non funzionerebbe per me, ma il modo rotatorio sottostante di convogliare file delimitati da tabulazioni tramite SED ha funzionato:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv

1
Questo comando ha comportato la tsostituzione della lettera con ", "nel file di output. Non esattamente quello che stavo cercando.
BrennanR

9

Ecco il comando più semplice per questo

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv

Se è presente una virgola nel valore della colonna, possiamo generare .tsv invece di .csv con il seguente comando

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv

Per CSV: funziona dove ho solo bisogno di virgola. mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`

3

Se hai davvero bisogno di un "backup", allora hai anche bisogno di schemi di database, come definizioni di tabelle, definizioni di viste, procedure di archiviazione e così via. Un backup di un database non è solo i dati.

Il valore del formato mysqldump per il backup è in particolare che è molto FACILE da usare per ripristinare i database mysql. Un backup che non è facilmente ripristinabile è molto meno utile. Se stai cercando un metodo per eseguire il backup affidabile dei dati mysql in modo da poterli ripristinare su un server mysql, penso che dovresti restare con lo strumento mysqldump.

Mysql è gratuito e funziona su molte piattaforme diverse. Configurare un nuovo server mysql su cui eseguire il ripristino è semplice. Non sono affatto preoccupato di non essere in grado di configurare mysql in modo da poter eseguire un ripristino.

Sarei molto più preoccupato per un backup / ripristino personalizzato basato su un formato fragile come csv / tsv che fallisce. Sei sicuro che tutte le virgolette, le virgole o le tabulazioni che si trovano nei tuoi dati sarebbero state sottoposte a escape correttamente e quindi analizzate correttamente dal tuo strumento di ripristino?

Se stai cercando un metodo per estrarre i dati, ne vedrai diversi nelle altre risposte.


grazie, molto utile! mi hai convinto. Tuttavia, ho altri motivi per desiderare un modo rapido per ottenere un dump CSV tramite un comando da riga di comando. sto resistendo per quello per la "risposta accettata". (anche se potrei probabilmente metterlo insieme a questo punto dalle risposte attuali, immagino con uno script mysql).
dreeves il

Vedo molto valore nell'avere sia un backup che utilizza il metodo nativo, sia estratti per altri scopi.
Zoredache

mk-parallel-restore può ripristinare un backup CSV creato con mk-parallel dump, così puoi ottenere il meglio da entrambi i mondi. In effetti, mk-parallel-restore fa un lavoro migliore assicurandosi che tutti i trigger definiti vengano ripristinati per ultimi.
Paul Dixon

3

È possibile utilizzare lo script seguente per ottenere l'output nei file CSV. Un file per tabella con intestazioni.

for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
do 
mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
done

user è il tuo nome utente, password è la password se non vuoi continuare a digitare la password per ogni tabella e mydb è il nome del database.

Spiegazione dello script: La prima espressione in sed, sostituirà le tabulazioni con "," in modo da avere i campi racchiusi tra virgolette doppie e separati da virgole. Il secondo inserisce virgolette doppie all'inizio e il terzo inserisce virgolette doppie alla fine. E l'ultimo si occupa del \ n.


Questo mi ha portato soprattutto dove dovevo andare, ma sono rimasto sorpreso quando la lettera "t" è stata sostituita da virgole: stackoverflow.com/a/2610121/8400969
Michael

E questo dovrebbe dirlo anche --skip-column-namesnella mia versione di mysql
Michael

2

Dai un'occhiata a mk-parallel-dump che fa parte della sempre utile suite di strumenti maatkit . Questo può eseguire il dump di file separati da virgole con l'opzione --csv.

Questo può eseguire l'intero database senza specificare singole tabelle ed è possibile specificare gruppi di tabelle in una tabella di backupset.

Si noti che esegue anche il dump delle definizioni delle tabelle, delle viste e dei trigger in file separati. Oltre a fornire un backup completo in una forma più universalmente accessibile, è anche immediatamente ripristinabile con mk-parallel-restore


Questo potrebbe non essere il backup ideale, ma è assolutamente fantastico per la CONDIVISIONE. Grazie!
atroon

maatkitsembra far parte percona toolkitdell'adesso, ma non riesco a trovare gli strumenti corrispondenti.
sjas

1

Risposta PowerShell a due righe:

# Store in variable
$Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
| ConvertFrom-Csv -Delimiter "`t"

# Out to csv
$Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation

Boom-bata-boom

-D = il nome del tuo database

-e = query

-B = delimitato da tabulazioni


1

Se vuoi scaricare l'intero db come csv

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/



DATE=`date +%Y%m%d`
rm -rf $DATE

echo 'show tables' | mysql -B -h${host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
awk 'NR>1' tables.txt > tables_new.txt

while IFS= read -r line
do
  mkdir -p $DATE/$line
  echo "select * from $line" | mysql -B -h"${host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
done < tables_new.txt

touch $DATE/$DATE.fin


rm -rf tables_new.txt tables.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.