Как я могу разделить вывод из 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 ]

0 голосов
/ 28 декабря 2018

Я написал новую версию SQLDumpSplitter, на этот раз с правильным синтаксическим анализатором, позволяющим разбивать файлы на такие полезные вещи, как INSERT со многими значениями, и теперь он мультиплатформенный: https://philiplb.de/sqldumpsplitter3/

0 голосов
/ 21 ноября 2015

Попробуйте это: https://github.com/shenli/mysqldump-hugetable Он будет сбрасывать данные во множество небольших файлов. Каждый файл содержит меньше или равно записей MAX_RECORDS. Вы можете установить этот параметр в env.sh.

0 голосов
/ 02 ноября 2014

Вы можете разбить существующий файл по AWK. Это очень быстро и просто

Давайте разделим дамп таблицы на «таблицы»:

cat dump.sql | awk 'BEGIN {output = "comments"; }
$data ~ /^CREATE TABLE/ {close(output); output = substr($3,2,length($3)-2); }
{ print $data >> output }';

Или вы можете разделить дамп по базе данных

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}';
0 голосов
/ 08 февраля 2014

Я создал MySQLDumpSplitter.java, который, в отличие от скриптов bash, работает в Windows. Это доступно здесь https://github.com/Verace/MySQLDumpSplitter.

0 голосов
/ 16 ноября 2012

Этот скрипт должен сделать это:

#!/bin/sh

#edit these
USER=""
PASSWORD=""
MYSQLDIR="/path/to/backupdir"

MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"

echo - Dumping tables for each DB
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
for db in $databases; do
    echo - Creating "$db" DB
    mkdir $MYSQLDIR/$db
    chmod -R 777 $MYSQLDIR/$db
    for tb in `$MYSQL  --user=$USER --password=$PASSWORD -N -B -e "use $db ;show tables"`
        do 
            echo -- Creating table $tb
            $MYSQLDUMP --opt  --delayed-insert --insert-ignore --user=$USER --password=$PASSWORD $db $tb | bzip2 -c > $MYSQLDIR/$db/$tb.sql.bz2
    done
    echo
done
0 голосов
/ 25 сентября 2008

Попробуйте csplit (1) разрезать вывод на отдельные таблицы на основе регулярных выражений (соответствуя границе таблицы, я бы подумал).

0 голосов
/ 17 июня 2010

Проверьте SQLDumpSplitter 2, я просто использовал его, чтобы с успехом разделить дамп в 40 МБ. Вы можете получить его по ссылке ниже:

sqldumpsplitter.com

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

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