Speichern Sie eine MySQL-Datenbank über die Befehlszeile in einer CSV-Sicherung (Klartext)


92

Ich möchte mysqldump vermeiden, da dies in einer Form ausgegeben wird, die nur für mysql zum Lesen geeignet ist. CSV scheint universeller zu sein (eine Datei pro Tabelle ist in Ordnung). Aber wenn mysqldump Vorteile hat, bin ich ganz Ohr. Außerdem möchte ich etwas, das ich über die Befehlszeile (Linux) ausführen kann. Wenn das ein MySQL-Skript ist, wären Hinweise, wie man so etwas macht, hilfreich.


Antworten:


140

Wenn Sie mit Tabellenkalkulationen umgehen können und Ihre Daten nicht binär sind, verwenden Sie die -BOption für den mysqlBefehl. Mit dieser Option werden TSV-Dateien (tabulatorgetrennte Dateien) generiert, die ganz einfach in Excel usw. importiert werden können:

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

Wenn Sie direkten Zugriff auf das Dateisystem des Servers haben, können Sie alternativ Folgendes verwenden, SELECT INTO OUTFILEum echte CSV-Dateien zu generieren:

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

Vielen Dank! Ihre zweite "Tabelle" sollte "Datenbank" sein, oder? Keine Option für CSV anstelle von TSV, die Sie kennen?
Dreeves

duh - ja, es sollte 'Datenbank' gelesen haben. Nein, es gibt keine Option für CSV. Dies ist die beste, die ich kenne, ohne die in MySQL integrierte Funktion "In Outfile auswählen" zu verwenden, die CSV ausführen kann , aber die Dateien auf den Server und nicht auf den Client schreibt.
Alnitak

Wie erzwinge ich das Überschreiben der Ausgabedatei?
JCm

11
Beachten Sie, dass bei Angabe eines relativen Pfads (oder einfach eines Dateinamens) die Datei in Ihrem MYSQL-Verzeichnis und nicht in Ihrem aktuellen Shell-Verzeichnis (dh woher sie \. file.sqlliest) angezeigt wird . Abhängig von Ihrer Installation finden Sie es wahrscheinlich bei/var/lib/mysql/[db_name]/table.csv
Mala


26

Sie können eine ganze Datenbank auf einmal mit der mysqldump's --tabOption sichern. Sie geben einen Verzeichnispfad an und es wird eine .sqlDatei mit der CREATE TABLE DROP IF EXISTSSyntax und eine .txtDatei mit dem Inhalt auf der Registerkarte getrennt erstellt. Um durch Kommas getrennte Dateien zu erstellen, können Sie Folgendes verwenden:

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

Dieser Pfad muss sowohl vom MySQL-Benutzer als auch vom Benutzer, der den Befehl ausführt, beschreibbar sein. Der Einfachheit halber empfehle ich daher chmod 777 /tmp/path_to_dump/zuerst.


1
Ich bin immer wieder auf diese Antwort zurückgekommen. Es ist definitiv der beste Weg, alle Tabellen in eine begrenzte Datei zu exportieren.
Joevallender

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

Als root: GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 . In meinem Fall musste ich /var/lib/mysql-files/(anstelle von /tmp/) den Benutzer auf mysql: mysql setzen und die Rechte auf 777 - stackoverflow.com/a/32737616/1707015 setzen .
qräbnö vor

18

Die Option "In Outfile auswählen" würde für mich nicht funktionieren, aber der folgende Umweg, um tabulatorgetrennte Dateien durch SED zu leiten, hat Folgendes bewirkt:

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

1
Dieser Befehl in dem Schreiben geführt twird , mit ersetzt ", "in der Ausgabedatei. Nicht genau das, wonach ich gesucht habe.
BrennanR

9

Hier ist der einfachste Befehl dafür

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

Wenn der Spaltenwert ein Komma enthält, können wir mit dem folgenden Befehl .tsv anstelle von .csv generieren

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

Für CSV: Es funktioniert dort, wo ich nur Komma brauche. mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`

3

Wenn Sie wirklich eine "Sicherung" benötigen, benötigen Sie auch ein Datenbankschema wie Tabellendefinitionen, Ansichtsdefinitionen, Speicherprozeduren usw. Eine Sicherung einer Datenbank besteht nicht nur aus den Daten.

Der Wert des mysqldump-Formats für die Sicherung besteht insbesondere darin, dass es sehr EINFACH ist, es zum Wiederherstellen von mysql-Datenbanken zu verwenden. Ein Backup, das nicht einfach wiederhergestellt werden kann, ist weitaus weniger nützlich. Wenn Sie nach einer Methode suchen, mit der Sie MySQL-Daten zuverlässig sichern können, damit Sie sie auf einem MySQL-Server wiederherstellen können, sollten Sie sich an das Tool MySQLldump halten.

MySQL ist kostenlos und läuft auf vielen verschiedenen Plattformen. Das Einrichten eines neuen MySQL-Servers, auf dem ich wiederherstellen kann, ist einfach. Ich mache mir überhaupt keine Sorgen, dass ich MySQL nicht einrichten kann, damit ich eine Wiederherstellung durchführen kann.

Ich würde mir viel mehr Sorgen machen, wenn eine benutzerdefinierte Sicherung / Wiederherstellung basierend auf einem fragilen Format wie csv / tsv fehlschlägt. Sind Sie sicher, dass alle Ihre Anführungszeichen, Kommas oder Tabulatoren in Ihren Daten korrekt maskiert und dann von Ihrem Wiederherstellungstool korrekt analysiert werden?

Wenn Sie nach einer Methode zum Extrahieren der Daten suchen, finden Sie in den anderen Antworten mehrere.


danke, sehr hilfreich! Du hast mich überzeugt. Ich habe andere Gründe, um einen schnellen Weg zu finden, um einen CSV-Dump über einen Befehlszeilenbefehl zu erhalten. Ich halte für die "akzeptierte Antwort". (obwohl ich es wahrscheinlich an dieser Stelle aus den aktuellen Antworten zusammensetzen könnte, denke ich mit einem MySQL-Skript).
Dreeves

Ich kann viel Wert darin sehen, sowohl ein Backup mit der nativen Methode als auch Extrakte für andere Zwecke zu haben.
Zoredache

Mit mk-parallel-restore kann eine mit mk-parallel dump wiederhergestellte CSV-Sicherung wiederhergestellt werden, sodass Sie das Beste aus beiden Welten erhalten. Tatsächlich macht mk-parallel-restore einen besseren Job, indem sichergestellt wird, dass alle von Ihnen definierten Trigger zuletzt wiederhergestellt werden.
Paul Dixon

3

Sie können das folgende Skript verwenden, um die Ausgabe in CSV-Dateien zu erhalten. Eine Datei pro Tabelle mit Headern.

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

Benutzer ist Ihr Benutzername, Kennwort ist das Kennwort, wenn Sie das Kennwort nicht für jede Tabelle eingeben möchten, und mydb ist der Datenbankname.

Erläuterung des Skripts: Der erste Ausdruck in sed ersetzt die Registerkarten durch ",", sodass Felder in doppelte Anführungszeichen gesetzt und durch Kommas getrennt sind. Der zweite fügt am Anfang ein doppeltes Anführungszeichen ein und der dritte am Ende ein doppeltes Anführungszeichen. Und der letzte kümmert sich um das \ n.


Dies brachte mich meistens dahin, wo ich hin musste, war aber überrascht, als der Buchstabe "t" durch Kommas ersetzt wurde: stackoverflow.com/a/2610121/8400969
Michael

Und das sollte auch --skip-column-namesin meiner Version von MySQL stehen
Michael

2

Schauen Sie sich mk-parallel-dump an, das Teil der immer nützlichen Maatkit - Tool-Suite ist . Dies kann durch Kommas getrennte Dateien mit der Option --csv sichern.

Dies kann Ihre gesamte Datenbank ohne Angabe einzelner Tabellen ausführen, und Sie können Gruppen von Tabellen in einer Backupset-Tabelle angeben.

Beachten Sie, dass Tabellendefinitionen, Ansichten und Trigger auch in separaten Dateien gespeichert werden. Zusätzlich zur Bereitstellung eines vollständigen Backups in einer allgemein zugänglichen Form kann es auch sofort mit mk-parallel-restore wiederhergestellt werden


Dies ist möglicherweise nicht das ideale Backup, aber für das Teilen ist absolut fantastisch. Danke dir!
Atroon

maatkitscheint Teil des percona toolkitJetzt zu sein, aber ich kann keine entsprechenden Werkzeuge finden.
Sjas

1

Zweizeilige PowerShell-Antwort:

# 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 = der Name Ihrer Datenbank

-e = Abfrage

-B = tabulatorgetrennt


1

Wenn Sie die gesamte Datenbank als CSV ausgeben möchten

#!/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
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.