Comment diviser un gros fichier de sauvegarde MySql en plusieurs fichiers?

14

J'ai un fichier SQL de sauvegarde de 250 Mo mais la limite sur le nouvel hébergement n'est que de 100 Mo ...

Existe-t-il un programme qui vous permet de diviser un fichier SQL en plusieurs fichiers SQL?

Il semble que les gens répondent à la mauvaise question ... alors je vais clarifier davantage:

Je n'ai que le fichier de 250 Mo et je n'ai que le nouvel hébergement utilisant phpMyAdmin qui n'a actuellement aucune donnée dans la base de données. J'ai besoin de prendre le fichier de 250 Mo et de le télécharger sur le nouvel hôte, mais il y a une limite de taille de téléchargement de fichier de sauvegarde SQL de 100 Mo. J'ai simplement besoin de prendre un fichier trop volumineux et de le diviser en plusieurs fichiers contenant chacun uniquement des instructions SQL valides (aucune instruction ne peut être divisée entre deux fichiers).

Brian T Hannan
la source
Doit-il s'agir de plusieurs fichiers SQL valides? Je compresserais le fichier dans plusieurs archives en morceaux de 100 Mo et le téléchargerais.
Nifle
Oui, il doit s'agir de plusieurs fichiers SQL valides ... dans la mesure où il n'y a pas la moitié d'une instruction dans un fichier et l'autre moitié dans un autre fichier.
Brian T Hannan

Réponses:

5

De Comment diviser la sortie de mysqldump en fichiers plus petits?

Déchargez d'abord le schéma (il tient sûrement dans 2 Mo, non?)

mysqldump -d --all-databases

et le restaurer.

Ensuite, ne sauvegardez que les données dans des instructions d'insertion distinctes, vous pouvez donc fractionner les fichiers et les restaurer sans avoir à les concaténer sur le serveur distant

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
harrymc
la source
Bon conseil! C'est parfaitement logique. Vraiment bien quand il y a des dépendances complexes entre les tables, de sorte qu'un fractionnement de l'exportation du schéma et des données ne fonctionne pas.
Reed Richards
7

Le moyen le plus simple de diviser le fichier de sauvegarde consiste à utiliser un logiciel sqldumpsplitterqui vous permet de diviser le fichier db en plusieurs fichiers db. Téléchargez ici

Ou bien utilisez cette commande de terminal.

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

Ici, 600 est le nombre de lignes que vous souhaitez avoir dans vos fichiers fractionnés. Et les deux arguments sont respectivement la source et la destination des fichiers.

REMARQUE: vous devez vérifier les fichiers divisés, vous ne divisez aucune commande.

GIRI
la source
1
Merci d'avoir fait allusion dans la bonne direction! Mais au lieu d'utiliser, splitje recommande d'utiliser csplit. Il ne se divisera pas juste après un certain numéro de ligne, qui pourrait être entre une liste de INSERTvaleurs par exemple. Vous pouvez passer une expression régulière pour identifier les lignes à diviser. Utilisez-le de la manière suivante, par exemple : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}' 'Cela divisera votre fichier de vidage avant chaque create table …instruction. Modifiez cela selon vos besoins. (Au fait, je passe {900}au lieu de {*}car j'obtiens une erreur "csplit: *}: mauvais nombre de répétitions" , peut-être juste un problème sur MacOS?)
Arvid
3

J'ai écrit mysqldumpsplitter (script shell), qui divise les bases de données / tables comme indiqué de manière simple et rapide. Voir tous les cas d'utilisation possibles de comment extraire de mysqldump .

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

Ce code fera exactement ce que vous voulez (et c'est open source):

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

Il vous permet de diviser n'importe quel fichier SQL en plusieurs fichiers plus petits (vous pouvez définir la taille maximale). La syntaxe SQL sera conservée correctement et elle fonctionne avec la syntaxe de requête «insertion multiple».

J'espère que cela t'aides!

Will0
la source
0

1) Avez-vous la possibilité de télécharger le fichier par une autre méthode, par exemple: scp ou ftp, puis de le restaurer à partir du fichier local?

2) Votre FAI prendra-t-il le fichier sur CD et le chargera-t-il pour vous?

3) Pouvez-vous restaurer le fichier sur un serveur local, puis créer une série de fichiers de sauvegarde à partir de celui-ci en utilisant des critères spécifiques pour réduire les tailles individuelles?

4) Vous pourriez diviser le fichier manuellement puis ranger les commandes SQL à la fin des fichiers?

Linker3000
la source
Je pensais aux options 2, 3 et 4. 2 serait le dernier recours. 3 est en fait probablement la prochaine chose que je vais essayer de faire. 4 a été ma première pensée, mais je ne peux même pas ouvrir le gros fichier dans le bloc-notes ou n'importe quel éditeur car il faut des heures pour ouvrir un fichier de 250 Mo de tout le texte ... toutes les applications de type bloc-notes se figent et ne reviennent jamais.
Brian T Hannan
@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ peut les gérer correctement . sinon regardez superuser.com/questions/34749/…
Sathyajith Bhat
Si vous souhaitez diviser le fichier AUTOMATIQUEMENT, puis ranger les petits morceaux, jetez un œil à l'option de fractionnement de l'utilitaire Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html )
Linker3000
0

Vous pouvez fractionner un gros fichier dans Eclipse. J'ai essayé avec succès un fichier de 105 Go dans Windows:

Ajoutez simplement la bibliothèque MySQLDumpSplitter à votre projet: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Note rapide sur la façon d'importer:

- 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
la source
0

J'ai également eu ce problème et j'ai décidé de coder un morceau de code extrêmement efficace en mémoire et en processeur qui divise un seul fichier .sql en plusieurs (un par table).

J'ai dû l'écrire car toute autre solution que j'ai trouvée ne fonctionnait pas assez bien. Sur un vrai vidage de 16 Go, j'ai réussi à le diviser en moins de 2 minutes.

Le code et les instructions sont disponibles sur la page du projet sur github

Andrea Baccega
la source
0

Il y a quelques options si vous pouvez exécuter un script bash ou perl. Essayez celui-ci de 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
la source
-1

Au lieu de diviser le fichier, vous pouvez utiliser un client MySQL sur votre machine locale et le connecter à la base de données MySQL distante. J'utilise HeidiSQL et je l' ai trouvé très bon.

Bien sûr, l'envoi des 250 Mo d'instructions SQL sur Internet peut prendre un certain temps.

Vous pouvez également essayer BigDump

Hydaral
la source