Мені потрібно скинути всі таблиці в 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'. Але слід вказати кожну таблицю вручну.