Скинути всі таблиці у форматі CSV, використовуючи 'mysqldump'


78

Мені потрібно скинути всі таблиці в MySQL у форматі CSV.

Чи існує команда, mysqldumpяка просто виводить кожен рядок для кожної таблиці у форматі CSV?


1
Ви можете зробити це за допомогою mysql.exeпрограми, спробуйте SELECT * FROM table INTO OUTFILE 'file_name'. Але слід вказати кожну таблицю вручну.
Devart

Відповіді:


119

По-перше, я можу дати вам відповідь для однієї таблиці:

Проблема з усіма цими 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.


1
Це не вдається, якщо результати запиту перевищують пам’ять машини, на яку ви скидаєте дані. Будь-яка робота?
Т. Брайан Джонс

2
Схоже, це не враховує STRING типів стовпців, у яких є подвійні лапки - їх слід захищати, інакше він не працює. Будь-яка ідея, як це зробити?
timetofly

2
@Blossoming_Flower: Ось оновлений регулярний вираз для уникнення подвійних лапок: | sed "s/\"/\"\"/;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g"( Правильно уникати подвійних лапок у CSV )
OlivierLarue

1
@Olivier, @Blossoming_Flower: можливо | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g", додати опцію g, щоб подвоїти кожен "у вході? Ruby CSV очікує такої конвенції.
Костас,

2
Ось sed без лапок: sed "s / '//; s / \ t /, / g; s / \ n // g"
елегантні кубики

31

Ця команда створить два файли в / 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=','

5
Не забувайте використовувати -T / шлях до чогось, що можна записати в процесі mysql.
Mayank Jain

10
працює лише в тому випадку, якщо ви запускаєте mysqldump з тієї ж машини, що і db-сервер
Джейк

3
якщо ви зіткнетеся з проблемами приватного захисту приватних файлів mysql, виконайте SHOW VARIABLES LIKE "secure_file_priv";та використовуйте папку, яку вам там повідомляють, як вихідну папку у вашій mysqldumpкоманді, якщо ви не можете перезапустити сервер mysql.
sjas

21

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

2
Це не CSV, це розділено табуляцією. CSV вимагає екранування коми, цитування тощо.
Кен Вільямс,

1
@KenWilliams Дякую. Я додав подвійні лапки в --fields-enclosed-by.
RolandoMySQLDBA

Це призводить до помилки. mysqldump: You must use option --tab with --fields-...
Ентоні Хацопулос,

3
Я не можу знайти --tabопцію, яку ви кажете, що ви додали.
DrLightman

1
Документи Cloud SQL описують, як створити mysqldump. cloud.google.com/sql/docs/mysql/import-export Деякі з параметрів можуть також бути актуальними для створення CSV-дампа для bigquery, такого як mysqldump --- hex-blob --default-character-set = utf8
intotecho

17

Якщо ви використовуєте 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;

Тепер ви можете використовувати інші методи, щоб повторити цю команду для декількох таблиць. Детальніше дивіться тут:


Здається, це найбільш відповідна відповідь, оскільки вона гнучка та одночасно ефективна.
Thomas Kimber

9

Це мені вдало:

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'


8

Схоже, у інших також була ця проблема, і зараз існує простий скрипт 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

Зверніть увагу, mysqldump-to-csv, як виявилося, містить деякі помилки у своєму простому коді. Тож будьте готові
виправити цю помилку або залиштесь

1

Ви також можете зробити це за допомогою інструменту експорту даних у dbForge Studio для MySQL .

Це дозволить вам вибрати деякі або всі таблиці та експортувати їх у формат CSV.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.