Дамп базы данных mysql в резервную копию открытого текста (CSV) из командной строки

93

Я бы хотел избежать использования mysqldump, поскольку он выводит данные в форме, удобной только для чтения mysql. CSV кажется более универсальным (достаточно одного файла на таблицу). Но если у mysqldump есть преимущества, я все слышу. Кроме того, мне бы хотелось что-нибудь, что можно запустить из командной строки (Linux). Если это сценарий mysql, были бы полезны указания, как это сделать.

Dreeves
источник

Ответы:

141

Если вы можете справиться с таблицей за раз, и ваши данные не являются двоичными, используйте -Bпараметр mysqlкоманды. С этой опцией он будет генерировать файлы TSV (разделенные табуляцией), которые можно легко импортировать в Excel и т. Д.:

% echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database

В качестве альтернативы, если у вас есть прямой доступ к файловой системе сервера, используйте SELECT INTO OUTFILEее для создания реальных файлов CSV:

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table
Альнитак
источник
Благодарность! ваша вторая «таблица» должна быть «базой данных», верно? вам не известно о возможности использовать CSV вместо TSV?
dreeves
да, да, он должен был прочитать «базу данных». Нет, для CSV нет возможности, это лучшее, что я знаю, без использования встроенного MySQL «select into outfile», который может выполнять CSV, но записывает файлы на сервер, а не на клиент.
Alnitak
как принудительно перезаписать выходной файл?
JCm
11
Обратите внимание: если указан относительный путь (или просто имя файла), файл появится в вашем каталоге MYSQL, а не в текущем каталоге оболочки (т.е. откуда \. file.sqlвыполняется чтение). Таким образом, в зависимости от вашей установки вы, вероятно, найдете его по адресу/var/lib/mysql/[db_name]/table.csv
Mala
32

В самом MySQL вы можете указать вывод CSV, например:

SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

С http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

Пол Томблин
источник
2
Кажется, я не могу найти сброшенный файл в указанном мной каталоге, почему?
JCm
@JCm сбрасывает на сервер
Альнитак
26

Вы можете сбросить всю базу данных за один раз с mysqldump's --tabопцией. Вы указываете путь к каталогу, и он создает один .sqlфайл с CREATE TABLE DROP IF EXISTSсинтаксисом и .txtфайл с содержимым, разделенным табуляцией. Для создания файлов, разделенных запятыми, вы можете использовать следующее:

mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name

Этот путь должен быть доступен для записи как пользователю mysql, так и пользователю, выполняющему команду, поэтому для простоты я рекомендую chmod 777 /tmp/path_to_dump/сначала.

chmac
источник
1
Я все время возвращался к этому ответу, это определенно лучший способ экспортировать все таблицы в файл с разделителями.
joevallender
mysqldump: You must use option --tab with --fields-...
Марко Марсала
Как root: GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 . В моем случае мне пришлось взять /var/lib/mysql-files/(вместо /tmp/), установить пользователя на mysql: mysql и установить права на 777 - stackoverflow.com/a/32737616/1707015 .
qräbnö
18

Опция select into outfile не сработает для меня, но следующий обходной способ передачи файла с разделителями табуляции через SED сработал:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv
Шри
источник
1
Эта команда привела к tзамене буквы ", "на в выходном файле. Не совсем то, что мне было нужно.
BrennanR
9

Вот простейшая команда для этого

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv

Если в значении столбца есть запятая, мы можем сгенерировать .tsv вместо .csv с помощью следующей команды

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv
минхас23
источник
Для CSV: работает там, где мне нужна только запятая. mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`
3

Если вам действительно нужна «резервная копия», вам также понадобится схема базы данных, например, определения таблиц, определения представлений, процедуры хранения и так далее. Резервная копия базы данных - это не просто данные.

Ценность формата mysqldump для резервного копирования в частности заключается в том, что его очень ЛЕГКО использовать для восстановления баз данных mysql. Резервная копия, которую нелегко восстановить, гораздо менее полезна. Если вы ищете способ надежного резервного копирования данных mysql, чтобы вы могли восстановить их на сервере mysql, я думаю, вам следует придерживаться инструмента mysqldump.

Mysql бесплатен и работает на многих различных платформах. Настроить новый сервер mysql, на который я могу восстановить данные, очень просто. Меня совсем не беспокоит то, что я не смогу настроить mysql, поэтому я могу выполнить восстановление.

Я бы гораздо больше беспокоился о нестандартном резервном копировании / восстановлении на основе хрупкого формата, такого как сбой csv / tsv. Вы уверены, что все ваши кавычки, запятые или табуляции, которые есть в ваших данных, будут правильно экранированы, а затем правильно проанализированы вашим инструментом восстановления?

Если вы ищете способ извлечения данных, посмотрите несколько других ответов.

Zoredache
источник
спасибо, очень помогли! ты убедил меня. Однако у меня есть другие причины, по которым мне нужен быстрый способ получить дамп CSV с помощью команды командной строки. Я жду "принятого ответа". (хотя я, вероятно, мог бы собрать его на этом этапе из текущих ответов, я думаю, со сценарием mysql).
dreeves,
Я вижу большую ценность как в резервном копировании с использованием собственного метода, так и в извлечениях для других целей.
Zoredache
mk-parallel-restore может восстановить резервную копию CSV, созданную с помощью mk-parallel dump, так что вы можете получить лучшее из обоих миров. Фактически, mk-parallel-restore работает лучше, обеспечивая восстановление всех определенных вами триггеров в последнюю очередь.
Пол Диксон,
3

Вы можете использовать приведенный ниже сценарий, чтобы получить вывод в файлы csv. Один файл на таблицу с заголовками.

for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
do 
mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
done

user - ваше имя пользователя, password - это пароль, если вы не хотите продолжать вводить пароль для каждой таблицы, а mydb - это имя базы данных.

Объяснение сценария: Первое выражение в sed заменит табуляцию на ",", поэтому у вас есть поля, заключенные в двойные кавычки и разделенные запятыми. Вторая вставляет двойную кавычку в начале, а третья вставляет двойную кавычку в конце. И последний заботится о \ n.

Киран Патхуру
источник
В основном это привело меня туда, куда мне нужно было пойти, но был удивлен, когда букву «t» заменили запятыми: stackoverflow.com/a/2610121/8400969
Майкл
И это должно быть сказано и --skip-column-namesв моей версии mysql
Майкл
2

Посмотрите mk-parallel-dump, который является частью неизменно полезного набора инструментов maatkit . Это может сбрасывать файлы, разделенные запятыми, с параметром --csv.

Это может сделать всю вашу базу данных без указания отдельных таблиц, и вы можете указать группы таблиц в таблице резервного набора.

Обратите внимание, что он также выгружает определения таблиц, представления и триггеры в отдельные файлы. Помимо обеспечения полной резервной копии в более универсальной форме, она также может быть немедленно восстановлена ​​с помощью mk-parallel-restore.

Пол Диксон
источник
Возможно, это не идеальная резервная копия, но она отлично подходит для ОБМЕНА. Спасибо!
atroon
maatkitкажется, это часть percona toolkitсейчас, но я не могу найти соответствующие инструменты.
sjas
1

Двухстрочный ответ PowerShell:

# Store in variable
$Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
| ConvertFrom-Csv -Delimiter "`t"

# Out to csv
$Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation

Бум-бата-бум

-D = имя вашей базы данных

-e = запрос

-B = разделенный табуляцией

Колобский каньон
источник
1

Если вы хотите сбросить весь db как csv

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/



DATE=`date +%Y%m%d`
rm -rf $DATE

echo 'show tables' | mysql -B -h${host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
awk 'NR>1' tables.txt > tables_new.txt

while IFS= read -r line
do
  mkdir -p $DATE/$line
  echo "select * from $line" | mysql -B -h"${host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
done < tables_new.txt

touch $DATE/$DATE.fin


rm -rf tables_new.txt tables.txt
Veera
источник