Как я могу разделить вывод из mysqldump на более мелкие файлы? - PullRequest
41 голосов
/ 25 сентября 2008

Мне нужно переместить целые таблицы из одной базы данных MySQL в другую. У меня нет полного доступа ко второму, только доступ phpMyAdmin. Я могу загружать только (сжатые) файлы sql размером менее 2 МБ. Но сжатый вывод из mysqldump таблиц первой базы данных превышает 10 МБ.

Есть ли способ разбить вывод из mysqldump на более мелкие файлы? Я не могу использовать split (1), так как я не могу cat (1) вернуть файлы на удаленный сервер.

Или есть другое решение, которое я пропустил?

Редактировать

Опция --extended-insert = FALSE для mysqldump, предложенная первым постером, дает файл .sql, который затем можно разбить на импортируемые файлы при условии, что split (1) вызывается с подходящей опцией --lines. Методом проб и ошибок я обнаружил, что bzip2 сжимает файлы .sql в 20 раз, поэтому мне нужно было выяснить, сколько строк кода SQL соответствует примерно 40 МБ.

Ответы [ 17 ]

34 голосов
/ 30 марта 2012

Этот скрипт bash разбивает дамп-файл одной базы данных на отдельные файлы для каждой таблицы и именует их с помощью csplit и присваивает им соответствующие имена:

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on https://gist.github.com/jasny/1608062
####

#adjust this to your case:
START="/-- Table structure for table/"
# or 
#START="/DROP TABLE IF EXISTS/"


if [ $# -lt 1 ] || [[ $1 == "--help" ]] || [[ $1 == "-h" ]] ; then
        echo "USAGE: extract all tables:"
        echo " $0 DUMP_FILE"
        echo "extract one table:"
        echo " $0 DUMP_FILE [TABLE]"
        exit
fi

if [ $# -ge 2 ] ; then
        #extract one table $2
        csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
        #extract all tables
        csplit -s -ftable $1 "$START" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
        mv $FILE foot
else
        csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*}
        mv ${FILE}1 foot
fi

for FILE in `ls -1 table*`; do
        NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
        cat head $FILE foot > "$NAME.sql"
done

rm head foot table*

на основе https://gist.github.com/jasny/1608062
и https://stackoverflow.com/a/16840625/1069083

29 голосов
/ 25 сентября 2008

Сначала выведите схему (она наверняка умещается в 2Mb, нет?)

mysqldump -d --all-databases 

и восстановите его.

После этого выведите только данные в отдельные операторы вставки, чтобы вы могли разбивать файлы и восстанавливать их без необходимости объединять их на удаленном сервере

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
11 голосов
/ 25 сентября 2008

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

for T in `mysql -N -B -e 'show tables from dbname'`; \
   do echo $T; \
   mysqldump [connecting_options] dbname $T \
   | gzip -c > dbname_$T.dump.gz ; \
   done

Это создаст файл gzip для каждой таблицы.

Другим способом разделения вывода mysqldump на отдельные файлы является использование параметра --tab.

mysqldump [connecting options] --tab=directory_name dbname 

, где имя_каталога - это имя пустого каталога. Эта команда создает файл .sql для каждой таблицы, содержащий инструкцию CREATE TABLE, и файл .txt, содержащий данные, которые необходимо восстановить с помощью LOAD DATA INFILE. Я не уверен, что phpMyAdmin может обрабатывать эти файлы с вашим конкретным ограничением.

9 голосов
/ 22 января 2011

Поздний ответ, но искал то же решение и наткнулся на следующий код с сайта:

for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done

http://www.commandlinefu.com/commands/view/2916/backup-all-mysql-databases-to-individual-files

5 голосов
/ 25 февраля 2015

Существует превосходный скрипт mysqldumpsplitter , который имеет множество опций для извлечения из mysqldump.

Я бы скопировал здесь рецепт, чтобы выбрать ваш случай:

1) Извлечение единой базы данных из mysqldump:

sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name

Приведенная выше команда создаст sql для указанной базы данных из указанной sql-файл "filename" и сохраните его в сжатом формате базы данных name.sql.gz.

2) Извлечь одну таблицу из mysqldump:

sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name

Приведенная выше команда создаст sql для указанной таблицы из указанной "имя файла" mysqldump файл и сохранить его в сжатом формате базы данных name.sql.gz.

3) Извлечение таблиц, соответствующих регулярному выражению, из mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str regular-expression

Команда выше создаст sqls для таблиц, соответствующих указанной регулярной Выражение из указанного файла "имя файла" mysqldump и сохранить его в сжатый формат для отдельной таблицы name.sql.gz.

4) Извлечь все базы данных из mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLDBS

Команда выше извлечет все базы данных из указанного "имени файла" MySQL файл и сохранить его в сжатом формате для отдельных базы данных name.sql.gz.

5) Извлечь всю таблицу из mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES

Команда выше будет извлекать все таблицы из указанного "имени файла" MySQL файл и сохранить его в сжатом формате для отдельных настольный name.sql.gz.

6) Извлечь список таблиц из mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str '(table1|table2|table3)'

Команда выше будет извлекать таблицы из указанного "имени файла" MySQL файл и хранить их в сжатом формате для отдельных настольный name.sql.gz.

7) Извлечение базы данных из сжатого mysqldump:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip

Приведенная выше команда распаковывает filename.sql.gz с помощью gzip, extract база данных с именем "dbname" из "filename.sql.gz" и сохранить ее как из / dbname.sql.gz

8) Извлечение базы данных из сжатого mysqldump в несжатый Формат:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip --compression none

Команда выше распаковывает filename.sql.gz с помощью gzip и извлекает база данных с именем "dbname" из "filename.sql.gz" и хранить ее как обычный sql из / dbname.sql

9) Извлечение всех таблиц из mysqldump в другую папку:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES --output_dir /path/to/extracts/

Команда выше извлечет все таблицы из указанного "имени файла" mysqldump файл и извлекает таблицы в сжатом формате для отдельных файлы, table-name.sql.gz, хранящиеся в / path / to / extracts /. Сценарий создаст папку / путь / к / извлекает /, если не существует.

10) Извлечение одной или нескольких таблиц из одной базы данных в полный дамп:

Предположим, у вас есть полный дамп с несколькими базами данных, и вы хотите извлечь несколько таблиц из одной базы данных.

Извлечение единой базы данных: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

Извлеките все таблицы sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)", хотя мы можем использовать другую опцию, чтобы сделать это в одной команде следующим образом:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1|tbl2)" --compression none

Команда выше извлечет и tbl1, и tbl2 из базы данных DBNAME в Формат sql в папке «out» в текущей директории.

Вы можете извлечь одну таблицу следующим образом:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1)" --compression none

11) Извлечь все таблицы из определенной базы данных:

mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.*" --compression none

Команда выше извлечет все таблицы из базы данных DBNAME в sql отформатируйте и сохраните его в директории "out".

12) Список содержимого файла mysqldump

mysqldumpsplitter.sh --source filename --desc

Команда выше выведет список баз данных и таблиц из файла дампа.

Позже вы можете загрузить файлы: zcat filename.sql.gz | mysql -uUSER -p -hHOSTNAME

  • Также, когда вы извлекаете одну таблицу, которая, по вашему мнению, еще больше, вы можете использовать команду linux split с количеством строк для дальнейшего разделения дампа. split -l 10000 filename.sql

  • Тем не менее, если вам это нужно (приходите чаще), вы можете рассмотреть возможность использования mydumper , который фактически создает отдельные дампы, которые вам не нужно разбивать!

4 голосов
/ 03 августа 2014

Я недавно создал sqlsplit.com . Попробуйте.

2 голосов
/ 07 октября 2009

Вам не нужен доступ по ssh ни к одному из ваших серверов. Просто клиент mysql [dump] в порядке. С помощью mysql [dump] вы можете сбросить базу данных и снова импортировать ее.

На вашем ПК вы можете сделать что-то вроде:

$ mysqldump -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u newuser -pnewpassword -h newhost newdatabase

и все готово. : -)

надеюсь, это поможет

1 голос
/ 22 июня 2015

Пояснение к ответу @ Vérace:

Мне особенно нравится интерактивный метод; Вы можете разбить большой файл в Eclipse. Я успешно попробовал файл 105 ГБ в Windows:

Просто добавьте библиотеку MySQLDumpSplitter в свой проект: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Краткое примечание о том, как импортировать:

- In Eclipse, Right click on your project --> Import
- Select "File System" and then "Next"
- Browse the path of the jar file and press "Ok"
- Select (thick) the "MySQLDumpSplitter.jar" file and then "Finish"
- It will be added to your project and shown in the project folder in Package Explorer in Eclipse
- Double click on the jar file in Eclipse (in Package Explorer)
- The "MySQL Dump file splitter" window opens which you can specify the address of your dump file and proceed with split.
1 голос
/ 19 февраля 2011

Я бы порекомендовал утилиту bigdump, вы можете взять ее здесь. http://www.ozerov.de/bigdump.php это замедляет выполнение дампа, настолько близкого к нему, насколько это возможно, до выполнения целых строк за раз.

1 голос
/ 25 сентября 2008

Вы можете сбросить отдельные таблицы с помощью mysqldump, запустив mysqldump database table1 table2 ... tableN

Если ни одна из таблиц не будет слишком большой, этого будет достаточно. В противном случае вам придется начать разбивать данные на таблицы большего размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...