Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Dump in CSV-Textdateien mit Spaltennamen oben?

Ich habe einen Weg gefunden, diese Namen manuell einzugeben, solange Sie MySQL 5 oder höher ausführen. Hier ist es, geschrieben als Bash-Skript zum Ausführen auf einer Unix-Befehlszeile:

DBNAME=<database_name>
TABLE=<table_name>

FNAME=/path/to/output/dir/$(date +%Y.%m.%d)-$DBNAME.csv

#(1)creates empty file and sets up column names using the information_schema
mysql -u <username> -p<password> $DBNAME -B -e "SELECT COLUMN_NAME FROM information_schema.COLUMNS C WHERE table_name = '$TABLE';" | awk '{print $1}' | grep -iv ^COLUMN_NAME$ | sed 's/^/"/g;s/$/"/g' | tr '\n' ',' > $FNAME

#(2)appends newline to mark beginning of data vs. column titles
echo "" >> $FNAME

#(3)dumps data from DB into /var/mysql/tempfile.csv
mysql -u <username> -p<password> $DBNAME -B -e "SELECT * INTO OUTFILE '/var/mysql/tempfile.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' FROM $TABLE;"

#(4)merges data file and file w/ column names
cat /var/mysql/tempfile.csv >> $FNAME

#(5)deletes tempfile
rm -rf /var/mysql/tempfile.csv

Obwohl dies nicht die anmutigste Lösung ist, bin ich sicher, dass sie von jemandem, der SQL und/oder Bash etwas besser kennt als ich, in eine einzige Zeile komprimiert werden kann ...

Was es tut, ist:

  1. verwendet das Informationsschema von MySQL, um eine leere CSV-Datei mit Spaltenüberschriften zu erstellen
  2. hängt einen zusätzlichen Zeilenumbruch an diese leere CSV-Datei an, sodass Ihre Daten in einer neuen Zeile erscheinen
  3. verwendet eine ziemlich standardmäßige "SELECT * INTO OUTFILE..."-Abfrage, um eine CSV-Datei voller Daten zu erstellen
  4. hängt die Datendatei an die Datei mit Spaltenüberschriften an
  5. löscht die (temporäre) Datendatei

Viel Glück, und wenn Sie es aufräumen, posten Sie Ihre Ergebnisse!