Як розділити великий файл резервної копії MySql на кілька файлів?


14

У мене є резервна копія SQL-файлу в 250 Мб, але ліміт на новий хостинг становить лише 100 Мб ...

Чи існує програма, яка дозволить вам розділити файл SQL на кілька файлів SQL?

Схоже, люди відповідають на неправильне запитання ... тож я уточню більше:

Я ТІЛЬКО має файл 250 Мб і маю лише новий хостинг за допомогою phpMyAdmin, який наразі не має даних у базі даних. Мені потрібно взяти файл 250 Мб і завантажити його на новий хост, але є обмеження розміру завантаження файлу резервного копіювання файлів у 100 Мб. Мені просто потрібно взяти один занадто великий файл і розділити його на кілька файлів, кожен з яких містить лише повні дійсні заяви SQL (жодні заяви не можуть бути розділені між двома файлами).


Чи повинно бути кілька дійсних файлів SQL? Я зіткнув би файл у кілька архівів на шматках розміром 100 Мб і завантажував його.
Ніфле

Так, це повинно бути кілька дійсних файлів SQL ... наскільки не має половини одного твердження в одному файлі, а другої половини в іншому файлі.
Брайан Т Ханнан

Відповіді:


5

Звідки я розділити вихід з mysqldump на менші файли?

Спершу скидайте схему (вона, безумовно, вміщується в 2 Мб, ні?)

mysqldump -d --all-databases

і відновити його.

Згодом вивантажуйте лише дані в окремі оператори вставлення, так що ви можете розділити файли та відновити їх, не зв'язуючи їх на віддаленому сервері

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

Хороша порада! Має ідеальний сенс. Дійсно добре, коли між таблицями є складні залежності, так що розщеплення експорту і схеми, і даних не працює.
Рід Річардс

7

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

Або ж скористайтеся цією командою терміналу.

розділити -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?)
Арвід,

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 Мб всього тексту ... всі програми, схожі на блокнот, заморожуються та ніколи не повертаються.
Брайан Т Ханан

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

Якщо ви хочете розділити файл АВТОМАТИЧНО, а потім привести в порядок менші шматки, ознайомтеся з опцією розділення утиліти Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000

0

Ви можете розділити великий файл у 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.

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.