Извлеките базу данных MySQL из резервной копии (CSV) из командной строки

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

80 голосов | спросил dreeves 22 Jam1000000amThu, 22 Jan 2009 02:13:15 +030009 2009, 02:13:15

9 ответов


0

Если вы можете справиться с таблицей за раз, и ваши данные не являются двоичными, используйте параметр -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
ответил Alnitak 22 Jam1000000amThu, 22 Jan 2009 02:18:03 +030009 2009, 02:18:03
0

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

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

От

ответил Paul Tomblin 22 Jam1000000amThu, 22 Jan 2009 02:38:59 +030009 2009, 02:38:59
0

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

ответил chmac 9 Maypm12 2012, 22:00:39
0

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

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv
ответил Sri 16 +04002012-10-16T10:21:57+04:00312012bEurope/MoscowTue, 16 Oct 2012 10:21:57 +0400 2012, 10:21:57
0

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

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
ответил minhas23 16 +03002015-10-16T10:59:59+03:00312015bEurope/MoscowFri, 16 Oct 2015 10:59:59 +0300 2015, 10:59:59
0

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

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

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

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

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

ответил Zoredache 22 Jam1000000amThu, 22 Jan 2009 04:36:23 +030009 2009, 04:36:23
0

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

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

ответил Kiran Pathuru 10 +03002016-10-10T19:59:21+03:00312016bEurope/MoscowMon, 10 Oct 2016 19:59:21 +0300 2016, 19:59:21
0

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

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

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

ответил Paul Dixon 22 Jam1000000amThu, 22 Jan 2009 02:41:31 +030009 2009, 02:41:31
0

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

ответил Kolob Canyon 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 14 Sep 2017 22:12:13 +0300 2017, 22:12:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132