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.

träumt
quelle

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
Alnitak
quelle
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
32

In MySQL selbst können Sie die CSV-Ausgabe wie folgt angeben:

SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

Von http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

Paul Tomblin
quelle
2
Ich kann die gedumpte Datei nicht in dem von mir angegebenen Verzeichnis finden. Warum ist das so?
JCm
@ JCM es Dumps auf dem Server
Alnitak
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.

chmac
quelle
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
Sri
quelle
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
minhas23
quelle
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.

Zoredache
quelle
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.

Kiran Pathuru
quelle
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

Paul Dixon
quelle
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

Kolob Canyon
quelle
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
veera
quelle