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

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

возможный дубликат Как вывести результаты запроса MySQL в формате csv? < / а>   —  person dreeves    schedule 10.08.2014

См. также:  Как масштабировать экспресс-сервер node, который передает файлы?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 11
  1. dreeves

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

    да, да, он должен был прочитать «базу данных». Нет, для CSV нет опции, это лучшее, что я знаю, без использования встроенного MySQL ‘select into outfile’, который может делать CSV, но записывает файлы на сервер, а не на клиент . person dreeves; 22.01.2009

    как принудительно перезаписать выходной файл? person dreeves; 18.12.2015

    Обратите внимание, что если указан относительный путь (или просто имя файла), файл появится в вашем каталоге MYSQL, а не в текущем каталоге оболочки (т.е. откуда \. file.sql считывается). Таким образом, в зависимости от вашей установки вы, вероятно, найдете его на /var/lib/mysql/[db_name]/table.csv person dreeves; 25.01.2016

  2. dreeves

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

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

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

    Кажется, я не могу найти сброшенный файл в указанном мной каталоге, почему? person dreeves; 18.12.2015

    @JCm сбрасывает на сервер person dreeves; 18.12.2015

  3. dreeves

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

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

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

    Возможно, это не идеальная резервная копия, но она отлично подходит для ОБМЕНА. Спасибо! person dreeves; 07.11.2011

    maatkit кажется сейчас частью percona toolkit, но я не могу найти соответствующие инструменты. person dreeves; 23.01.2017

  4. dreeves

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

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

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

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

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

    спасибо, очень помогли! ты убедил меня. Однако у меня есть другие причины, по которым мне нужен быстрый способ получить дамп csv с помощью команды командной строки. Я жду принятого ответа. (хотя я, вероятно, мог бы собрать его на этом этапе из текущих ответов, я думаю, с помощью сценария mysql). person dreeves; 22.01.2009

    Я вижу большую ценность как в резервной копии, использующей собственный метод, так и в извлечениях для других целей. person dreeves; 22.01.2009

    mk-parallel-restore может восстановить резервную копию CSV, созданную с помощью mk-parallel dump, так что вы можете получить лучшее из обоих миров. Фактически, mk-parallel-restore работает лучше, гарантируя, что все триггеры, которые вы определили, восстанавливаются в последнюю очередь. person dreeves; 22.01.2009

  5. dreeves

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

    Я все время возвращался к этому ответу, это определенно лучший способ экспортировать все таблицы в файл с разделителями. person dreeves; 06.05.2017

    Как 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. person dreeves; 15.08.2020

  6. dreeves

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

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

    Эта команда привела к замене буквы t на ", " в выходном файле. Не совсем то, что мне было нужно. person dreeves; 10.02.2017

  7. dreeves

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

    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 ` person dreeves; 23.10.2019

  8. dreeves

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

    И это также должно быть --skip-column-names в моей версии mysql person dreeves; 17.05.2019

  9. dreeves

    Двухстрочный ответ 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. dreeves

    Если вы хотите сбросить весь 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
    
  11. dreeves

    Есть несколько более простой способ быстро поместить все таблицы в разделители табуляции:

    #!/bin/bash
    tablenames=$(mysql your_database -e "show tables;" -B |sed "1d")
    
    IFS=$'\n'
    
    tables=($tablenames)
    
    for table in ${tables[@]}; do
            mysql your_database -e "select * from ${table}" -B > "${table}.tsv"
    done
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: