Звантажте базу даних mysql у резервну копію відкритого тексту (CSV) із командного рядка


92

Я хотів би уникати mysqldump, оскільки це виводить у формі, зручній для читання лише mysql. CSV здається більш універсальним (один файл на таблицю - це нормально). Але якщо у mysqldump є переваги, я всі вуха. Крім того, я хотів би щось, що я можу запустити з командного рядка (linux). Якщо це скрипт mysql, корисними будуть вказівки на те, як зробити таке.


Відповіді:


140

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

duh - так, це повинно було читати "база даних". Ні, немає можливості для CSV, це найкраще, що я знаю, без використання вбудованого MySQL 'select into outfile', який може робити CSV, але пише файли на сервері, а не на клієнті.
Alnitak

як змусити перезаписати вихідний файл?
JCm

11
Зверніть увагу, що коли вказано відносний шлях (або просто ім'я файлу), файл з'явиться у вашому каталозі MYSQL, а не у вашому поточному каталозі оболонки (тобто звідки \. file.sqlчитається). Таким чином, залежно від вашої інсталяції, ви, мабуть, знайдете це за адресою/var/lib/mysql/[db_name]/table.csv
Мала

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 скидає на сервер
Alnitak

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/спочатку.


1
Я постійно повертався до цієї відповіді, це, безумовно, найкращий спосіб експортувати всі таблиці до розділеного файлу.
joevallender

mysqldump: You must use option --tab with --fields-...
Marco Marsala

Як корінь: 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

Вибір опції 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

Для 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. Ви впевнені, що всі ваші цитати, коми або вкладки, які є у ваших даних, будуть правильно екрановані, а потім правильно проаналізовані вашим інструментом відновлення?

Якщо ви шукаєте метод для вилучення даних, перегляньте кілька в інших відповідях.


спасибі, дуже корисно! ти переконав мене. у мене є інші причини хотіти швидкий спосіб отримати CSV-дамп через команду командного рядка. я витримую це за "прийняту відповідь". (тому що я, напевно, міг би скласти це разом із поточних відповідей, я думаю, без сценарію mysql).
dreeves

Я бачу велику цінність як резервного копіювання за допомогою власного методу, так і витягів для інших цілей.
Zoredache

mk-паралельне відновлення може відновити резервну копію CSV, створену за допомогою mk-паралельного дампа, щоб ви могли отримати найкраще з обох світів. Насправді, mk-паралельне відновлення робить кращу роботу, забезпечуючи відновлення останніх визначених вами тригерів.
Пол Діксон,

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

Пояснення сценарію: Перший вираз у sed, замінить вкладки на ",", тому у вас є поля, укладені у подвійні лапки та розділені комами. Другий вставляє подвійні лапки на початку, а третій вставляє подвійні лапки в кінці. І остання піклується про \ n.


Це здебільшого привело мене туди, куди мені потрібно було піти, але був здивований, коли букву "t" замінювали комами: stackoverflow.com/a/2610121/8400969
Майкл

І це слід сказати і --skip-column-namesв моїй версії mysql
Майкл

2

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

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

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


Це може бути не ідеальною резервною копією, але цілком приголомшливим для Спільного використання. Дякую!
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.