Как разделить большой файл резервной копии MySql на несколько файлов?


14

У меня есть резервный файл SQL объемом 250 МБ, но ограничение на новый хостинг составляет всего 100 МБ ...

Существует ли программа, позволяющая разбить файл SQL на несколько файлов SQL?

Кажется, что люди отвечают на неправильный вопрос ... поэтому я уточню больше:

У меня ТОЛЬКО файл 250 МБ, и только новый хостинг использует phpMyAdmin, который в настоящее время не имеет данных в базе данных. Мне нужно взять файл 250 МБ и загрузить его на новый хост, но есть ограничение размера загрузки файла резервной копии SQL 100 МБ. Мне просто нужно взять один файл, который слишком велик, и разбить его на несколько файлов, каждый из которых содержит только полные допустимые операторы SQL (никакие операторы не могут быть разделены между двумя файлами).


Должно ли быть несколько допустимых файлов SQL? Я заархивировал файл в несколько архивов по 100 МБ и загрузил его.
Nifle

Да, это должно быть несколько допустимых файлов SQL ... если в одном файле нет половины одного оператора, а другого - в другой.
Брайан Т Ханнан

Ответы:


5

От Как я могу разделить вывод из mysqldump на более мелкие файлы?

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

mysqldump -d --all-databases

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

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

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE

Хороший совет! Имеет смысл. Действительно хорошо, когда между таблицами существуют сложные зависимости, так что разделение экспорта схемы и данных не работает.
Рид Ричардс

7

Простейший способ разбить файл резервной копии - использовать программное обеспечение sqldumpsplitter, которое позволяет разбить файл БД на несколько файлов БД. Скачать здесь

Или используйте эту терминальную команду.

split -l 600 ./path/to/source/file.sql ./path/to/dest/file-

Здесь 600 - это количество строк, которые вы хотите иметь в ваших разделенных файлах. И два аргумента - источник и место назначения файлов соответственно.

ПРИМЕЧАНИЕ: вы должны проверить файлы разделения, вы не разделяете никакие команды.


1
Спасибо за подсказку в правильном направлении! Но вместо использования splitя рекомендую использовать csplit. Он не будет разделяться сразу после определенного номера строки, который может быть, например, между списком INSERTзначений. Вы можете передать регулярное выражение, чтобы определить строки для разделения. Используйте его следующим образом, пример : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}'` Это разделит ваш файл дампа перед каждым create table …оператором. Измените это в соответствии с вашими потребностями. (Кстати, я передаю {900}вместо того, {*}потому что я получаю ошибку "csplit: *}: неверное количество повторений" , может быть, просто проблема в MacOS?)
Arvid

3

Я написал mysqldumpsplitter (сценарий оболочки), который быстро и легко разбивает базы данных / таблицы в соответствии с инструкциями. Просмотрите все возможные варианты использования инструкции по извлечению из mysqldump .

sh mysqldumpsplitter.sh --source mysqldump-file.sql --extract DB --match_str database-name

2

Этот код будет делать именно то, что вы хотите (и это с открытым исходным кодом):

https://web.archive.org/web/20160313044916/http://rodo.nl/index.php?page=mysql-splitter

Это позволяет вам разбить любой файл SQL на несколько файлов меньшего размера (вы можете определить максимальный размер). Синтаксис SQL будет сохраняться правильно, и он работает с синтаксисом запроса «множественная вставка».

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


0

1) У вас есть возможность загрузить файл другим способом, например: scp или ftp, а затем восстановить его из локального файла?

2) Ваш провайдер возьмет файл с компакт-диска и загрузит его для вас?

3) Можете ли вы восстановить файл на локальном сервере, а затем сделать из него серию файлов резервных копий, используя определенные критерии для уменьшения размеров отдельных файлов?

4) Вы могли бы разделить файл вручную, а затем привести в порядок команды SQL в конце файлов?


Я думал о варианте 2, 3 и 4. 2 будет последним средством. 3 на самом деле, вероятно, следующая вещь, которую я собираюсь попробовать сделать. 4 была моей первой мыслью, но я даже не могу открыть большой файл в блокноте или любом редакторе, потому что для открытия 250-мегабайтного файла всего текста требуются часы ... все приложения, похожие на блокнот, останавливаются и никогда не возвращаются.
Брайан Т Ханнан

@ Брайан: 4 was my first thought, but I can't even open the large file in notepad or any editor - Блокнот ++ может справиться с ними хорошо. еще посмотрите на superuser.com/questions/34749/…
Сатьяджит Бхат

Если вы хотите разбить файл АВТОМАТИЧЕСКИ, а затем привести в порядок меньшие фрагменты, взгляните на опцию разделения утилиты Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000

0

Вы можете разбить большой файл в Eclipse. Я попытался файл 105GB в 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.

0

У меня тоже была эта проблема, и я решил написать чрезвычайно эффективный код памяти и процессора, который разбивает один файл .sql на несколько (по одному на таблицу).

Я должен был написать это, так как любое другое решение, которое я нашел, не было достаточно хорошим. На реальном 16ГБ дампе мне удалось разделить его менее чем за 2 минуты.

Код и инструкции доступны на странице проекта на github.


0

Есть несколько вариантов, если вы можете запустить bash или perl скрипт. Попробуйте это от yoodey.com

#!/usr/bin/perl -w
#
# splitmysqldump - split mysqldump file into per-database dump files.
use strict;
use warnings;
my $dbfile;
my $dbname = q{};
my $header = q{};
while (<>) {    

# Beginning of a new database section:
    # close currently open file and start a new one
    if (m/-- Current Database\: \`([-\w]+)\`/) {
    if (defined $dbfile && tell $dbfile != -1) {
        close $dbfile or die "Could not close file!"
    }
    $dbname = $1;
    open $dbfile, ">>", "$1_dump.sql" or die "Could not create file!";
    print $dbfile $header;
    print "Writing file $1_dump.sql ...\n";
    }
    if (defined

$dbfile && tell $dbfile != -1) {
    print $dbfile $_;
    }
    # Catch dump file header in the beginning
    # to be printed to each separate dump file.
    if (!

$dbname) { $header .= $_; }
}
close $dbfile or die "Could not close file!"

-1

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

Конечно, отправка 250 МБ операторов SQL через Интернет может занять некоторое время.

Вы также можете попробовать BigDump

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.