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( nichtmysqldump ) 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"
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?
@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.
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="SELECTCONCAT(table_schema,'.',table_name)"
SQLSTMT="${SQLSTMT} FROM information_schema.tables WHERE table_schema NOTIN"
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=0wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
thenwait
fi
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, -
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.
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.
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 ...
mysql.exe
Programm tun . Versuchen Sie es mit SELECT * FROM Tabelle INTO OUTFILE 'Dateiname'. Sie sollten jedoch jede Tabelle manuell angeben.Antworten:
Zunächst kann ich Ihnen die Antwort für einen Tisch geben:
Das Problem bei all diesen
INTO OUTFILE
oder--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
( nichtmysqldump
) mit dem-B
Parameter zu arbeiten, die SELECT-Anweisung mit inline zu setzen-e
, dann die ASCII-Ausgabe mit zu massierensed
und 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"
Fügen Sie
> outfile.csv
am 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
do
und; done
den langen Befehl ein, den ich oben in Teil 1 geschrieben habe, aber ersetzen Sie$tb
stattdessen Ihren Tabellennamen .quelle
| sed "s/\"/\"\"/;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"
( ordnungsgemäß entkommen Sie ein doppeltes Anführungszeichen in CSV )| 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.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=','
quelle
SHOW VARIABLES LIKE "secure_file_priv";
Sie den dort angegebenen Ordner als Ausgabeordner in Ihremmysqldump
Befehl aus, wenn Sie den mysql-Server nicht neu starten können.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
name
sollte 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
quelle
--fields-enclosed-by
.mysqldump: You must use option --tab with --fields-...
--tab
Option, die Sie hinzugefügt haben, nicht finden .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:
quelle
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:quelle
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
quelle
Sie können dies auch mit dem Datenexport-Tool in dbForge Studio für MySQL tun .
Hier können Sie einige oder alle Tabellen auswählen und in das CSV-Format exportieren.
quelle