Ich muss alle Tabellen in MySQL im CSV-Format sichern.
Gibt es einen Befehl, mit mysqldump
dem nur jede Zeile für jede Tabelle im CSV-Format ausgegeben wird?
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
( nicht mysqldump
) mit dem -B
Parameter zu arbeiten, die SELECT-Anweisung mit inline zu setzen -e
, dann die ASCII-Ausgabe mit zu massieren sed
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"
"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.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 .
| 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=','
SHOW VARIABLES LIKE "secure_file_priv";
Sie den dort angegebenen Ordner als Ausgabeordner in Ihrem mysqldump
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
--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:
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.
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
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.
mysql.exe
Programm tun . Versuchen Sie es mit SELECT * FROM Tabelle INTO OUTFILE 'Dateiname'. Sie sollten jedoch jede Tabelle manuell angeben.