2010-01-08 7 views
2

J'ai jeté des données à partir d'une base de données à l'aide de la boîte à outils MySQL Admin Migration. Une des tables contient plus de 5 millions de lignes. Lorsque j'essaie de charger le fichier de données généré, j'ai des problèmes de mémoire.MySQL Insertion de plus de 5 millions de lignes - valider chaque option x nombre de lignes?

Existe-t-il un moyen de forcer la validation après X nombre de lignes? Le script généré par la boîte à outils de migration est illustré ci-dessous:

INSERT INTO mytable (`col1`, `col1`) 
VALUES (823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 

Répondre

3

Oui. Cette grande instruction INSERT INTO est essentiellement un script. Prenez un éditeur pour ça; toutes les quelques centaines de lignes, insérez une ligne qui indique COMMIT, puis démarrez une nouvelle instruction INSERT ... VALUES. Pour plus de crédit, vous pouvez écrire un script simple pour réécrire l'instruction SQL d'origine en plusieurs transactions (comme indiqué ci-dessus) par programmation. Vous ne voulez pas le faire à la main à plusieurs reprises.

Il n'y a pas de paramètre externe que vous pouvez activer pour que vous puissiez soumettre ce script dans son intégralité et que des validations automatiques se produisent à intervalles réguliers sans modifier le script.

Augmenter l'espace fichier journal peut augmenter la limite, mais je ne compte pas sur elle. Affrontez-le: La base de données n'a tout simplement pas été conçue pour traiter des instructions de plusieurs milliers de lignes.

Ce que je ferais probablement est de faire plusieurs commits, mais pousser ce truc à une table temporaire ou avec un drapeau "temporaire"; puis exécutez un ou un petit nombre d'opérations pour rendre ces changements permanents. Si cela ne fonctionne pas, vous pouvez toujours réessayer ou supprimer vos enregistrements temporaires.

+1

Souhaitez-vous vraiment vouloir commettre plusieurs fois cependant? Si quelque chose échoue plus tard, vous vous retrouvez avec des données incohérentes. –

+0

Ce n'est pas une question de vouloir. Il n'y a au mieux de ma connaissance aucun autre moyen. Augmenter votre espace de commit à plusieurs gigaoctets peut fonctionner dans Oracle, mais il est tout à fait possible qu'il ne vole pas dans MySQL. C'est une base de données de jouets, après tout. –

+0

Vous avez raison, mais si la possibilité de revenir en arrière est importante, vous devez de toute façon reformater les insertions OU, au moins temporairement, augmenter la taille du tampon INNODB. Les seules limitations dont je suis conscient dans MySQL pour la taille du tampon sont la mémoire système, mais je peux me tromper. –

3

Demandez à votre administrateur de base de données d'augmenter l'innodb_log_file_size à 256 Mo à partir du 5M par défaut. Il améliore également les performances pour les charges de travail intensives en écriture. Soyez prudent, car lorsque vous modifiez ce paramètre, vous devez supprimer les anciens fichiers journaux avant de redémarrer le démon. Cela devrait supprimer complètement le besoin de "commettre automatiquement toutes les X lignes".

+0

+1, si cela fonctionne vraiment. –

+0

En supposant que les données elles-mêmes ne transgressent pas la limite du journal INNODB de 4 Go (comme le mentionne Carl), voici la réponse que j'aurais suggérée. –

Questions connexes