Извлеките базу данных MySQL из резервной копии (CSV) из командной строки - PullRequest
86 голосов
/ 22 января 2009

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

Ответы [ 10 ]

135 голосов
/ 22 января 2009

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

В самом 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-запрос-результатов-в-текст-или-csv-файл /

19 голосов
/ 09 мая 2012

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

17 голосов
/ 16 октября 2012

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

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv
8 голосов
/ 16 октября 2015

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

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
3 голосов
/ 10 октября 2016

Вы можете использовать приведенный ниже скрипт для получения вывода в 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.

3 голосов
/ 22 января 2009

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

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

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

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

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

2 голосов
/ 22 января 2009

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

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

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

1 голос
/ 14 сентября 2017

Ответ 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

Boom-бат-бум

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

-e = запрос

-B = разделитель табуляции

0 голосов
/ 11 июня 2019

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