Frage Dump eine Mysql-Datenbank auf eine Klartext (CSV) -Sicherung von der Befehlszeile


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


75
2018-01-21 23:13


Ursprung


Antworten:


Wenn Sie mit Table-at-a-Time zurechtkommen und Ihre Daten nicht binär sind, verwenden Sie die -B Option zum mysql Befehl. Mit dieser Option werden TSV-Dateien (Tab-separated) erzeugt, die sehr 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, verwenden Sie alternativ SELECT INTO OUTFILE das kann echte CSV-Dateien generieren:

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

119
2018-01-21 23:18



In MySQL selbst können Sie eine 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/


26
2018-01-21 23:38



Mit der Option --tab von mysqldump können Sie eine ganze Datenbank auf einmal sichern. Sie geben einen Verzeichnispfad an und erstellen eine .sql-Datei mit der Syntax CREATE TABLE DROP IF EXISTS und einer TXT-Datei mit dem Inhalt, Registerkarte getrennt. Um kommagetrennte Dateien zu erstellen, könnten 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. Aus Gründen der Einfachheit empfehle ich diesen Pfad chmod 777 /tmp/path_to_dump/ zuerst.


16
2018-05-09 18:00



Die Option "In Outfile auswählen" würde für mich nicht funktionieren, aber der folgende Umweg über die durch Tabulatoren getrennte Datei über SED:

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

14
2017-10-16 06:21



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 im Spaltenwert ein Komma vorhanden ist, 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

5
2017-10-16 07:59



Wenn Sie wirklich eine "Sicherung" benötigen, benötigen Sie auch ein Datenbankschema, wie Tabellendefinitionen, View-Definitionen, Storeprozeduren und so weiter. Ein Backup einer Datenbank besteht nicht nur aus den Daten.

Der Wert des mysqldump-Formats für die Sicherung ist speziell, dass es sehr EINFACH ist, es zu verwenden, um mysql-Datenbanken wiederherzustellen. Eine Sicherung, die nicht einfach wiederhergestellt werden kann, ist weitaus weniger nützlich. Wenn Sie nach einer Methode suchen, um mysql-Daten zuverlässig zu sichern, damit Sie auf einen mysql-Server wiederherstellen können, dann sollten Sie mit dem mysqldump-Tool arbeiten.

Mysql ist kostenlos und läuft auf vielen verschiedenen Plattformen. Das Einrichten eines neuen mysql-Servers, auf den ich wiederherstellen kann, ist einfach. Ich bin überhaupt nicht besorgt darüber, dass ich mysql nicht einrichten kann, damit ich eine Wiederherstellung durchführen kann.

Ich wäre viel mehr besorgt über eine benutzerdefinierte Sicherung / Wiederherstellung basierend auf einem fragilen Format wie csv / tsv fehlgeschlagen. Sind Sie sicher, dass alle Ihre Anführungszeichen, Kommas oder Tabs, die in Ihren Daten enthalten sind, korrekt maskiert und dann von Ihrem Wiederherstellungswerkzeug korrekt analysiert werden?

Wenn Sie nach einer Methode suchen, um die Daten zu extrahieren, dann sehen Sie einige in den anderen Antworten.


3
2018-01-22 01:36



Auschecken mk-parallel-dump Das ist Teil des immer Nützlichen maatkit Suite von Werkzeugen. Dies kann kommagetrennte Dateien mit der Option --csv ausgeben.

Dies kann Ihre gesamte Datenbank ohne Angabe von einzelnen Tabellen ausführen, und Sie können Gruppen von Tabellen in einer Tabelle für Sicherungssätze angeben.

Beachten Sie, dass auch Tabellendefinitionen, Ansichten und Trigger in separaten Dateien gespeichert werden. Neben der Bereitstellung einer vollständigen Sicherung in einer allgemein zugänglichen Form, ist es auch sofort wiederherstellbar mit mk-parallel-wiederherstellen


2
2018-01-21 23:41



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

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 ist Ihr Benutzername, password ist das Passwort, wenn Sie nicht das Passwort für jede Tabelle eingeben wollen, und mydb ist der Datenbankname.

Erklärung des Skripts: Der erste Ausdruck in sed ersetzt die Tabulatoren durch "," so dass Sie Felder in doppelte Anführungszeichen eingeschlossen und durch Kommas getrennt haben. Die zweite Einfügung Doppelzitat am Anfang und die dritte Einfügung Doppelzitat am Ende. Und das letzte kümmert sich um das \ n.


2
2017-10-10 16:59



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
2017-09-14 19:12