Jak podzielić duży plik kopii zapasowej MySql na wiele plików?

14

Mam 250 MB zapasowego pliku SQL, ale limit na nowy hosting to tylko 100 MB ...

Czy istnieje program, który pozwala podzielić plik SQL na wiele plików SQL?

Wygląda na to, że ludzie odpowiadają na złe pytanie ... więc wyjaśnię więcej:

Mam TYLKO plik 250 MB i mam nowy hosting używając phpMyAdmin, który obecnie nie ma danych w bazie danych. Muszę wziąć plik 250 MB i przesłać go do nowego hosta, ale istnieje limit wielkości przesyłania kopii zapasowej pliku SQL 100 MB. Po prostu muszę wziąć jeden plik, który jest zbyt duży i podzielić go na wiele plików, z których każdy zawiera tylko pełne prawidłowe instrukcje SQL (żadnych instrukcji nie można podzielić na dwa pliki).

Brian T. Hannan
źródło
Czy musi to być wiele poprawnych plików SQL? Spakowałbym plik do kilku archiwów w 100 MB fragmentach i załadowałem.
Nifle
Tak, musi to być wiele poprawnych plików SQL ... o ile nie ma połowy jednej instrukcji w jednym pliku, a drugiej połowy w innym pliku.
Brian T Hannan

Odpowiedzi:

5

Od Jak podzielić dane wyjściowe z mysqldump na mniejsze pliki?

Najpierw zrzuć schemat (na pewno pasuje do 2Mb, nie?)

mysqldump -d --all-databases

i przywróć to.

Następnie zrzuć tylko dane w osobnych instrukcjach wstawiania, abyś mógł podzielić pliki i przywrócić je bez konieczności łączenia ich na zdalnym serwerze

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
harrymc
źródło
Dobra rada! Ma sens. Naprawdę dobrze, gdy istnieją złożone zależności między tabelami, więc podział eksportu zarówno schematu, jak i danych nie działa.
Reed Richards
7

Najprostszym sposobem podziału pliku kopii zapasowej jest skorzystanie z oprogramowania sqldumpsplitter, które pozwala podzielić plik db na wiele plików db. Pobierz tutaj

Albo użyj tego polecenia terminala.

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

Tutaj 600 to liczba linii, które chcesz mieć w podzielonych plikach. Dwa argumenty to odpowiednio źródło i miejsce docelowe plików.

UWAGA: musisz sprawdzić podzielone pliki, nie dzielisz żadnego polecenia.

GIRI
źródło
1
Dzięki za podpowiedzi we właściwym kierunku! Ale zamiast używać splitpolecam używać csplit. Nie podzieli się zaraz po określonym numerze linii, który może znajdować się INSERTna przykład między listą wartości. Możesz przekazać wyrażenie regularne, aby zidentyfikować linie do podziału. Użyj go w następujący sposób, przykład : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}' 'Spowoduje to podzielenie pliku zrzutu przed każdą create table …instrukcją. Zmień to na swoje potrzeby. (Nawiasem mówiąc, {900}zamiast przekazać, {*}ponieważ pojawia się błąd „csplit: *}: zła liczba powtórzeń” , może po prostu problem na MacOS?)
Arvid
3

Napisałem mysqldumpsplitter (skrypt powłoki), który dzieli bazy danych / tabele zgodnie z instrukcją w szybki i łatwy sposób. Zobacz wszystkie możliwe zastosowania wyodrębnienia z mysqldump .

sh mysqldumpsplitter.sh --source mysqldump-file.sql --extract DB --match_str database-name
mysql_user
źródło
0

1) Czy masz opcję przesłania pliku inną metodą, np. Scp lub ftp, a następnie przywrócenia go z pliku lokalnego?

2) Czy twój dostawca Internetu zabierze plik na CD i załaduje go dla ciebie?

3) Czy możesz przywrócić plik na serwerze lokalnym, a następnie wykonać z niego serię plików kopii zapasowych, stosując określone kryteria, aby utrzymać indywidualne rozmiary?

4) Czy możesz podzielić plik ręcznie, a następnie uporządkować polecenia SQL na końcu plików?

Linker3000
źródło
Myślałem o opcjach 2, 3 i 4. 2 byłoby ostatecznością. 3 jest właściwie prawdopodobnie następną rzeczą, którą spróbuję zrobić. 4 to moja pierwsza myśl, ale nie mogę nawet otworzyć dużego pliku w notatniku ani w żadnym edytorze, ponieważ otwarcie pliku 250 MB całego tekstu ... wszystkie aplikacje podobne do notatnika zawieszają się i nigdy nie wracają.
Brian T Hannan
@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ może sobie z nimi poradzić. jeszcze spójrz na superuser.com/questions/34749/…
Sathyajith Bhat
Jeśli chcesz podzielić plik AUTOMATYCZNIE, a następnie posprzątać mniejsze elementy, spójrz na opcję podziału szwajcarskiego narzędzia File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000
0

Możesz podzielić duży plik w Eclipse. Próbowałem z powodzeniem pliku 105 GB w systemie Windows:

Wystarczy dodać bibliotekę MySQLDumpSplitter do swojego projektu: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Szybka uwaga na temat importowania:

- 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.
Alisa
źródło
0

Miałem też ten problem i postanowiłem zakodować fragment kodu o wyjątkowo dużej pamięci i wydajności procesora, który dzieli pojedynczy plik .sql na kilka (jeden na tabelę).

Musiałem to napisać, ponieważ inne znalezione przeze mnie rozwiązanie nie działało wystarczająco dobrze. Na prawdziwym zrzutu 16 GB udało mi się go podzielić w mniej niż 2 minuty.

Kod i instrukcje są dostępne na stronie projektu na github

Andrea Baccega
źródło
0

Istnieje kilka opcji, jeśli możesz uruchomić skrypt bash lub perl. Spróbuj tego z 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!"
Jrgns
źródło
-1

Zamiast dzielić plik, możesz użyć klienta MySQL na komputerze lokalnym i połączyć go ze zdalną bazą danych MySQL. Używam HeidiSQL i uważam, że jest bardzo dobry.

Oczywiście przesłanie 250 MB instrukcji SQL przez Internet może chwilę potrwać.

Możesz także wypróbować BigDump

Hydaralny
źródło