Мне нужно сбросить все таблицы в MySQL в формате CSV.
Есть ли команда, использующая mysqldump
для вывода каждой строки для каждой таблицы в формате CSV?
Мне нужно сбросить все таблицы в MySQL в формате CSV.
Есть ли команда, использующая mysqldump
для вывода каждой строки для каждой таблицы в формате CSV?
Во-первых, я могу дать вам ответ за одну таблицу:
Проблема со всеми этими INTO OUTFILE
или --tab=tmpfile
(и -T/path/to/directory
) заключается в том, что для этого требуется запустить mysqldump на том же сервере, что и сервер MySQL, и иметь эти права доступа.
Мое решение состояло в том, чтобы просто использовать mysql
(НЕ mysqldump
) с параметром -B
оператор SELECT с помощью -e
, затем -e
вывод ASCII с помощью sed
и завершить с помощью CSV, включая строку поля заголовка:
Пример:
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 "," xxxxxxxxxxxxxxxxx "," squaredesign "," [email protected] "" 4 "," miedziak "," xxxxxxxxxx "," miedziak "," [email protected] "" 5 "," Sarko "," xxxxxxxxx "," Sarko "," "" 6 "," Logitrans Poland "," xxxxxxxxxxxxxx "," LogitransPoland "," "" 7 "," Amos "," xxxxxxxxxxxxxxxxxxxx "," Amos "," "" 9 "," Annabelle "," xxxxxxxxxxxxxxxx ", "Annabelle", "" "11", "Brandfathers and Sons", "xxxxxxxxxxxxxxxxx", "BrandfathersAndSons", "" "12", "Imagine Group", "xxxxxxxxxxxxxxxx", "ImagineGroup", "" "13", " EduSquare.pl "," xxxxxxxxxxxxxxxxx "," EduSquare.pl "," "101", "tmp", "xxxxxxxxxxxxxxxxxxxxx", "_", "[email protected]"
Добавьте a > outfile.csv
в конце этой > outfile.csv
, чтобы получить CSV файл для этой таблицы.
Далее, получите список ВСЕХ ваших таблиц с
mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"
Оттуда, это только еще один шаг, чтобы сделать цикл, например. в оболочке bash
для перебора этих таблиц:
for tb in $(mysql -u username -ppassword dbname -sN -e "SHOW TABLES;"); do
echo .....;
done
Между do
и ; done
; done
вставьте длинную команду, которую я написал в части 1 выше, но вместо этого замените ваше имя таблицы на $tb
.
Эта команда создаст 2 файла в каталоге /path/to/directory table_name.sql и table_name.txt.
Файл sql будет содержать схему создания таблицы, а файл txt будет содержать записи таблицы mytable с полями, разделенными запятой.
mysqldump -u username -p -t -T/path/to/directory dbname table_name --fields-terminated-by=','
mysqldump имеет опции форматирования CSV
--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
name
должен содержать одно из следующих
`--fields-terminated-by`
\t
или "\""
`--fields-enclosed-by=name`
Поля в выходном файле заключаются в заданный
и
--lines-terminated-by
\r
\n
\r\n
Естественно, вы должны mysqldump каждую таблицу отдельно
Я предлагаю вам собрать все имена таблиц в текстовом файле. Затем, итерация по всем таблицам, использующим mysqldump. Вот script, который будет выгружать и gzip по 10 таблиц за раз:
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
Дайте ему попробовать!!!
Похоже, что и у других была эта проблема, теперь есть простой python script для преобразования вывода mysqldump в файлы csv.
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
Если вы используете MySQL или MariaDB, самый простой и эффективный способ выгрузить CSV для одной таблицы -
SELECT customer_id, firstname, surname INTO OUTFILE '/exportdata/customers.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM customers;
Теперь вы можете использовать другие методы, чтобы повторить эту команду для нескольких таблиц. Подробнее смотрите здесь:
Это хорошо сработало для меня:
mysqldump DBNAME --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/
Или, если вы хотите сбросить только TABLENAME:
mysqldump DBNAME TABLENAME --fields-terminated-by ',' \
--fields-enclosed-by '"' --fields-escaped-by '\' \
--no-create-info --tab /var/lib/mysql-files/
Я дам в /var/lib/mysql-files/
чтобы избежать этой ошибки:
mysqldump: получена ошибка: 1290: сервер MySQL работает с параметром --secure-file-priv, поэтому он не может выполнить этот оператор при выполнении команды "SELECT INTO OUTFILE"
Вы также можете сделать это, используя инструмент Data Export в dbForge Studio for MySQL.
Он позволит вам выбрать некоторые или все таблицы и экспортировать их в формат CSV.
Это много возни, просто чтобы экспортировать как csv, почему бы вам просто не установить Dbeaver из описания ссылки здесь
Он охватывает большинство популярных баз данных, кроме nosql, и может экспортировать в различные форматы, включая csv и sql.
Вы можете использовать простой метод more, инструмент csvdump, чтобы распечатать удаленный файл csv из mysql: https://github.com/bobby96333/csvdump