Speichern Sie alle Tabellen im CSV-Format mit 'mysqldump'.


77

Ich muss alle Tabellen in MySQL im CSV-Format sichern.

Gibt es einen Befehl, mit mysqldumpdem nur jede Zeile für jede Tabelle im CSV-Format ausgegeben wird?


1
Sie können dies mit einem mysql.exeProgramm tun . Versuchen Sie es mit SELECT * FROM Tabelle INTO OUTFILE 'Dateiname'. Sie sollten jedoch jede Tabelle manuell angeben.
Devart

Antworten:


118

Zunächst kann ich Ihnen die Antwort für einen Tisch geben:

Das Problem bei all diesen INTO OUTFILEoder --tab=tmpfile(und -T/path/to/directory) Antworten besteht darin, dass mysqldump auf demselben Server wie der MySQL-Server ausgeführt werden muss und über diese Zugriffsrechte verfügt.

Meine Lösung bestand einfach darin, mysql( nicht mysqldump ) mit dem -BParameter zu arbeiten, die SELECT-Anweisung mit inline zu setzen -e, dann die ASCII-Ausgabe mit zu massieren sedund mit CSV einschließlich einer Header-Feldzeile aufzuwickeln:

Beispiel:

 mysql -B -u username -p password database -h dbhost -e "SELECT * FROM accounts;" \
 | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"

"id", "login", "password", "folder", "email" "8", "mariana", "xxxxxxxxxx", "mariana", "" 3 "," squaredesign "," xxxxxxxxxxxxxxxxxx "," squaredesign "," mkobylecki@squaredesign.com "" 4 "," miedziak "," xxxxxxxxxx "," miedziak "," miedziak@mail.com "" 5 "," Sarko "," xxxxxxxxxx "," Sarko "," "6", "Logitrans Poland", "xxxxxxxxxxxxxx", "LogitransPoland", "7", "Amos", "xxxxxxxxxxxxxxxxxxxxx", "Amos", "9", "Annabelle", "xxxxxxxx" Annabelle, 11, 11Brandväter und Söhne "," xxxxxxxxxxxxxxxxx "," BrandfathersAndSons "," 12 "," Imagine Group "," xxxxxxxxxxxxxxxxx "," ImagineGroup "," 13 "," EduSquare.pl "," xxxxxxxxxxxxxx .pl "," 101 "," tmp "," xxxxxxxxxxxxxxxxxxxxx "," _ "," WOBC-14.squaredesign.atlassian.net@yoMama.com "_ "," WOBC-14.squaredesign.atlassian.net@yoMama.com "_ "," WOBC-14.squaredesign.atlassian.net@yoMama.com "

Fügen Sie > outfile.csvam Ende dieses Einzeilers ein hinzu, um Ihre CSV-Datei für diese Tabelle abzurufen.

Als nächstes erhalten Sie eine Liste aller Ihrer Tabellen mit

mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"

Von dort aus ist es nur noch ein Schritt, eine Schleife zu erstellen, beispielsweise in der Bash-Shell, um diese Tabellen zu durchlaufen:

 for tb in $(mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"); do
     echo .....;
 done

Fügen Sie zwischen dound ; doneden langen Befehl ein, den ich oben in Teil 1 geschrieben habe, aber ersetzen Sie $tbstattdessen Ihren Tabellennamen .


1
Dies schlägt fehl, wenn die Abfrageergebnisse den Speicher auf dem Computer überschreiten, auf den Sie sichern. Irgendwelche Workarounds?
T. Brian Jones

2
Dies scheint STRING-Spaltentypen mit doppelten Anführungszeichen nicht zu berücksichtigen - sie sollten maskiert werden, da sie sonst fehlerhaft sind. Irgendeine Idee, wie das geht?
Zeitplan

2
@Blossoming_Flower: Hier ist die aktualisierte Regex, um doppelte Anführungszeichen zu vermeiden: | sed "s/\"/\"\"/;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"( ordnungsgemäß entkommen Sie ein doppeltes Anführungszeichen in CSV )
OlivierLarue

1
@Olivier, @Blossoming_Flower: Vielleicht | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"g Option hinzufügen, um jedes "in der Eingabe zu verdoppeln? Ruby CSV erwartet eine solche Konvention.
Kostas

2
Hier ist das sed ohne die Anführungszeichen: sed "s / '//; s / \ t /, / g; s / \ n // g"
elegante Würfel

31

Dieser Befehl erstellt zwei Dateien in / path / to / directory table_name.sql und table_name.txt .

Die SQL-Datei enthält das Tabellenerstellungsschema und die txt-Datei enthält die Datensätze der mytable-Tabelle mit durch Komma getrennten Feldern.

mysqldump -u username -p -t  -T/path/to/directory dbname table_name --fields-terminated-by=','

5
Denken Sie daran, -T / path zu etwas zu verwenden, das durch den MySQL-Prozess beschreibbar ist.
Mayank Jain

10
funktioniert nur, wenn Sie mysqldump auf demselben Computer wie den Datenbankserver ausführen
Jake

3
Wenn Sie auf die Probleme mit der sicheren Datei von mysql stoßen, führen SHOW VARIABLES LIKE "secure_file_priv";Sie den dort angegebenen Ordner als Ausgabeordner in Ihrem mysqldumpBefehl aus, wenn Sie den mysql-Server nicht neu starten können.
Sjas

21

mysqldump hat Optionen für die CSV-Formatierung:

--fields-terminated-by=name
                  Fields in the output file are terminated by the given
--lines-terminated-by=name
                  Lines in the output file are terminated by the given

Das namesollte eines der folgenden Elemente enthalten:

`--fields-terminated-by`

\t oder "\""

`--fields-enclosed-by=name`
   Fields in the output file are enclosed by the given

und

--lines-terminated-by

  • \r
  • \n
  • \r\n

Natürlich sollten Sie jede Tabelle einzeln mysqldump.

Ich schlage vor, Sie sammeln alle Tabellennamen in einer Textdatei. Durchlaufen Sie dann alle Tabellen, in denen mysqldump ausgeführt wird. Hier ist ein Skript, das 10 Tabellen gleichzeitig ausgibt und gzip:

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQLSTMT="SELECT CONCAT(table_schema,'.',table_name)"
SQLSTMT="${SQLSTMT} FROM information_schema.tables WHERE table_schema NOT IN "
SQLSTMT="${SQLSTMT} ('information_schema','performance_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/DBTB.txt
COMMIT_COUNT=0
COMMIT_LIMIT=10
TARGET_FOLDER=/path/to/csv/files
for DBTB in `cat /tmp/DBTB.txt`
do
    DB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $2}'`
    DUMPFILE=${DB}-${TB}.csv.gz
    mysqldump ${MYSQL_CONN} -T ${TARGET_FOLDER} --fields-terminated-by="," --fields-enclosed-by="\"" --lines-terminated-by="\r\n" ${DB} ${TB} | gzip > ${DUMPFILE}
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

2
Das ist keine CSV, das ist tabulatorgetrennt. CSV erfordert das Anhalten von Kommas, Anführungszeichen usw.
Ken Williams

1
@ KenWilliams Danke. Ich habe doppelte Anführungszeichen hinzugefügt --fields-enclosed-by.
RolandoMySQLDBA

Dies erzeugt einen Fehler. mysqldump: You must use option --tab with --fields-...
Anthony Hatzopoulos

3
Ich kann die --tabOption, die Sie hinzugefügt haben, nicht finden .
DrLightman

1
In den Cloud SQL-Dokumenten wird beschrieben, wie Sie einen mysqldump erstellen. cloud.google.com/sql/docs/mysql/import-export Einige der Optionen können auch für die Erstellung eines CSV-Dumps für Bigquery relevant sein, z. B. mysqldump --- hex-blob --default-character-set = utf8
intecho

17

Wenn Sie MySQL oder MariaDB verwenden, ist der einfachste und performanteste Weg, CSV für einzelne Tabellen zu sichern, -

SELECT customer_id, firstname, surname INTO OUTFILE '/exportdata/customers.txt'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM customers;

Jetzt können Sie diesen Befehl mit anderen Techniken für mehrere Tabellen wiederholen. Weitere Details finden Sie hier:


Dies scheint die am besten geeignete Antwort zu sein, da es gleichzeitig flexibel und performant ist.
Thomas Kimber

9

Das hat bei mir gut funktioniert:

mysqldump <DBNAME> --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/

Oder wenn Sie nur eine bestimmte Tabelle sichern möchten:

mysqldump <DBNAME> <TABLENAME> --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/

Ich entleere /var/lib/mysql-files/, um diesen Fehler zu vermeiden:

mysqldump: Fehler: 1290: Der MySQL-Server wird mit der Option --secure-file-priv ausgeführt, sodass diese Anweisung beim Ausführen von 'SELECT INTO OUTFILE' nicht ausgeführt werden kann.


8

Es sieht so aus, als hätten auch andere dieses Problem, und es gibt jetzt ein einfaches Python-Skript zum Konvertieren der Ausgabe von mysqldump in CSV-Dateien.

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

Es stellte sich heraus, dass mysqldump-to-csv einige Fehler in seinem einfachen Code enthielt. Seien Sie also bereit, das Problem zu beheben, oder bleiben Sie bei einer langsameren, aber stabilen Lösung ...
Vajk Hermecz

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.