Come divido un grande file di backup MySql in più file?


14

Ho un file SQL di backup da 250 MB ma il limite sul nuovo hosting è di soli 100 MB ...

Esiste un programma che ti consente di dividere un file SQL in più file SQL?

Sembra che le persone stiano rispondendo alla domanda sbagliata ... quindi chiarirò di più:

Ho SOLO il file da 250 MB e ho solo il nuovo hosting usando phpMyAdmin che al momento non ha dati nel database. Devo prendere il file da 250 MB e caricarlo sul nuovo host ma esiste un limite di dimensioni per il caricamento del file di backup SQL di 100 MB. Devo semplicemente prendere un file troppo grande e dividerlo in più file, ciascuno contenente solo istruzioni SQL valide complete (nessuna istruzione può essere suddivisa tra due file).


Deve essere più file SQL validi? Comprimerei il file in diversi archivi in ​​blocchi da 100 MB e lo caricavo.
Nifle

Sì, deve essere più file SQL validi ... per non avere la metà di un'istruzione in un file e l'altra metà in un altro file.
Brian T Hannan,

Risposte:


5

Da Come divido l'output di mysqldump in file più piccoli?

Prima scarica lo schema (si adatta sicuramente a 2Mb, no?)

mysqldump -d --all-databases

e ripristinalo.

Successivamente scarica solo i dati in istruzioni insert separate, in modo da poter dividere i file e ripristinarli senza doverli concatenare sul server remoto

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

Buon Consiglio! Ha perfettamente senso. Davvero buono quando ci sono dipendenze complesse tra le tabelle in modo che una suddivisione dell'esportazione di schema e dati non funzioni.
Reed Richards,

7

Il modo più semplice per dividere il file di backup è utilizzare un software sqldumpsplitter, che consente di dividere il file db in più file db. Scarica qui

Oppure usa questo comando terminale.

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

Qui, 600 è il numero di righe che desideri avere nei tuoi file divisi. E i due argomenti sono rispettivamente l'origine e la destinazione dei file.

NOTA: è necessario controllare i file divisi, non dividere alcun comando.


1
Grazie per il suggerimento nella direzione corretta! Ma invece di usare splitconsiglio di usare csplit. Non verrà suddiviso subito dopo un determinato numero di riga, che potrebbe essere compreso tra un elenco di INSERTvalori, ad esempio. Puoi passare una regex per identificare le linee in cui dividere. Usalo nel seguente modo, esempio : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}'` Questo dividerà il tuo file dump prima di ogni create table …istruzione. Cambia questo in base alle tue esigenze. (A proposito, {900}invece che {*}perché ricevo un errore "csplit: *}: cattivo conteggio delle ripetizioni" , forse solo un problema su MacOS?)
Arvid

3

Ho scritto mysqldumpsplitter (shell script), che divide i database / le tabelle come indicato in modo rapido e semplice. Vedi tutti i possibili casi d'uso di come estrarre da mysqldump .

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


0

1) Hai la possibilità di caricare il file con un altro metodo, ad esempio: scp o ftp e quindi ripristinarlo dal file locale?

2) Il tuo ISP prenderà il file su CD e lo caricherà per te?

3) È possibile ripristinare il file su un server locale e quindi creare una serie di file di backup da esso utilizzando criteri specifici per mantenere le dimensioni individuali?

4) Potresti dividere il file manualmente, quindi riordinare i comandi SQL alla fine dei file?


Stavo pensando all'opzione 2, 3 e 4. 2 sarebbe l'ultima risorsa. 3 è probabilmente la prossima cosa che proverò a fare. 4 è stato il mio primo pensiero, ma non riesco nemmeno ad aprire il file di grandi dimensioni nel blocco note o in qualsiasi editor b / c ci vogliono ore per aprire un file da 250 MB di tutto il testo ... tutte le app simili a blocchi di appunti si bloccano e non ritornano mai più.
Brian T Hannan,

@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ può gestirli bene. altro guarda superuser.com/questions/34749/…
Sathyajith Bhat

Se vuoi dividere il file AUTOMATICAMENTE e poi riordinare i pezzi più piccoli, dai un'occhiata all'opzione divisa dell'utilità Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000,

0

È possibile dividere un file di grandi dimensioni in Eclipse. Ho provato con successo un file da 105 GB in Windows:

Aggiungi la libreria MySQLDumpSplitter al tuo progetto: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Breve nota su come importare:

- 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

Ho avuto anche questo problema e ho deciso di codificare un pezzo di codice estremamente efficiente in termini di memoria e CPU che divide un singolo file .sql in diversi (uno per tabella).

Ho dovuto scriverlo poiché qualsiasi altra soluzione trovata non funzionava abbastanza bene. In un vero dump da 16 GB sono riuscito a dividerlo in meno di 2 minuti.

Il codice e le istruzioni sono disponibili nella pagina del progetto su github


0

Ci sono un paio di opzioni se puoi eseguire uno script bash o perl. Prova questo da 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

Invece di dividere il file, è possibile utilizzare un client MySQL sul computer locale e collegarlo al database MySQL remoto. Uso HeidiSQL e l'ho trovato molto buono.

Ovviamente potrebbe essere necessario del tempo per inviare 250 MB di istruzioni SQL su Internet.

Puoi anche provare BigDump

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.