Мені потрібно скинути всі таблиці в MySQL у форматі CSV.
Чи існує команда, mysqldumpяка просто виводить кожен рядок для кожної таблиці у форматі CSV?
Відповіді:
По-перше, я можу дати вам відповідь для однієї таблиці:
Проблема з усіма цими INTO OUTFILEабо --tab=tmpfile(і -T/path/to/directory) відповідями полягає в тому, що для цього потрібно запустити mysqldump на тому ж сервері , що і сервер MySQL, і мати ці права доступу.
Моє рішення було просто використовувати mysql( не mysqldump ) з -Bпараметром, вбудувати оператор SELECT за допомогою -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", "xxxxxxxxxxxxxxxx", " squaredesign "," mkobylecki@squaredesign.com "" 4 "," miedziak "," xxxxxxxxxx "," miedziak "," miedziak@mail.com "" 5 "," Sarko "," xxxxxxxxx "," Sarko "," "" 6 "," Logitrans Польща "," xxxxxxxxxxxxxx "," LogitransPoland "," "" 7 "," Amos "," xxxxxxxxxxxxxxxxxxx "," Amos "," "9", "Annabelle", "xxxxxx "Аннабель", "" "11", "Батьки та сини "," xxxxxxxxxxxxxxxxx "," BrandfathersAndSons "," "" 12 "," Imagine Group "," xxxxxxxxxxxxxxx "," ImagineGroup "," "" 13 "," EduSquare.pl ", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: .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 "
Додайте в > 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 вставте довгу команду, яку я писав у частині 1 вище, але замість неї введіть ім'я таблиці $tb.
| sed "s/\"/\"\"/;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"( Правильно уникати подвійних лапок у CSV )
| sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g", додати опцію g, щоб подвоїти кожен "у вході? Ruby CSV очікує такої конвенції.
Ця команда створить два файли в / 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=','
SHOW VARIABLES LIKE "secure_file_priv";та використовуйте папку, яку вам там повідомляють, як вихідну папку у вашій mysqldumpкоманді, якщо ви не можете перезапустити сервер mysql.
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`
Fields in the output file are enclosed by the given
і
--lines-terminated-by
\r\n\r\nЗвичайно, ви повинні mysqldump кожну таблицю окремо.
Я пропоную вам зібрати всі назви таблиць у текстовий файл. Потім перегляньте всі таблиці, на яких запущений mysqldump. Ось скрипт, який одночасно скидає та зчитує 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
--fields-enclosed-by.
mysqldump: You must use option --tab with --fields-...
--tabопцію, яку ви кажете, що ви додали.
Якщо ви використовуєте 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/
Або якщо ви хочете скинути лише певну таблицю:
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'
Схоже, у інших також була ця проблема, і зараз існує простий скрипт Python для перетворення виводу 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
Ви також можете зробити це за допомогою інструменту експорту даних у dbForge Studio для MySQL .
Це дозволить вам вибрати деякі або всі таблиці та експортувати їх у формат CSV.
mysql.exeпрограми, спробуйте SELECT * FROM table INTO OUTFILE 'file_name'. Але слід вказати кожну таблицю вручну.