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

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

Ответ 1

Если вы можете справиться с таблицей по времени, а ваши данные не являются бинарными, используйте параметр -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

Ответ 3

Вы можете сбросить всю базу данных за один раз с помощью опции mysqldump --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/.

Ответ 4

Выбор в опции outfile не будет работать для меня, но приведенный ниже обходной путь файла с разделителями табуляции через SED:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv

Ответ 5

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

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

Ответ 6

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

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

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

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

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

Ответ 7

Вы можете использовать ниже script, чтобы получить вывод в файлы 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

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

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

Ответ 8

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

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

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

Ответ 9

Ответ на две строки 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= разделитель табуляции

Ответ 10

Если вы хотите сбросить всю базу данных как 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

Ответ 11

Если вы хотите сбросить всю базу данных как 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