2010-12-14 45 views
2

J'ai besoin d'importer une grande table SQL d'une base de données Oracle vers une base de données mySQL. J'ai "déversé" la table Oracle en utilisant RazorSQL de sorte que j'ai maintenant un grand fichier .sql (2.5 Go), avec de nombreuses instructions INSERT.Fractionner un grand fichier sql sur les limites d'une instruction?

Ce fichier est trop volumineux et je souhaite le scinder pour l'importer en morceaux. Quelle serait une façon intelligente de diviser un tel fichier?

  • en utilisant la commande split fonctionnerait à l'exception des valeurs de chaîne contient des caractères de nouvelles lignes pour qu'il y ait un risque élevé de split mi-déclaration division. Un quickie Perl utilisant une expression rationnelle pour diviser sur "; \ n" (fin de l'instruction) fonctionnerait, mais il existe toujours la possibilité à distance qu'une telle séquence de caractères puisse être trouvée dans les données.

Bien sûr, je peux toujours écrire un analyseur pour comprendre en citant la chaîne. Je me demande cependant s'il y a quelque chose de plus intelligent?

Des questions similaires ont été posées par exemple:

How do I split the output from mysqldump into smaller files?

Mais la seule solution de séparation a été une suggestion pour certains logiciels de Windows. Windows n'est pas une option pour moi. Je cours Unix, à savoir Mac OS X.

Pour donner un peu d'arrière-plan, la raison pour laquelle je veux faire cela est que j'ai une erreur lors de l'importation du fichier dans mySQL. La localisation de l'erreur est douloureuse, ne serait-ce que parce qu'elle prend du temps et parce que l'ouverture de gros fichiers texte pour l'édition n'est pas triviale, au mieux, avec la plupart des éditeurs de texte. Certains de mes outils SQL ne signalent même pas l'emplacement de l'erreur dans le fichier, ce qui suggère fortement une approche de dichotomie pour mettre à zéro l'erreur en divisant le nombre de fois. Automatiser cela serait utile.

Merci pour votre idée.

+0

Si vous pouvez utiliser un outil mysqlimport et éviter d'utiliser les instructions INSERT, les choses iront beaucoup plus vite, l'overhead de l'analyseur n'est pas négligeable. Assurez-vous également que les index sont désactivés sur vos tables jusqu'à ce que les données soient chargées. La différence peut aller jusqu'à quelques ordres de grandeur dans le temps d'importation. Utilisez ** split **, il peut produire les fichiers qui vous intéressent, si le problème qui vous préoccupe se produit alors. Si vous obtenez une sortie d'erreur terrible du processus d'importation, vous pouvez effectuer une recherche binaire dans le fichier gênant pour localiser l'erreur. – kevpie

+0

Comme je l'ai écrit, 'split' n'est pas correct: il divisera le fichier sur les limites de la ligne, pas sur les limites de la déclaration. I * do * ont des instructions qui s'exécutent sur plusieurs lignes. Pour effectuer une recherche binaire, j'ai besoin d'une solution de fractionnement fiable. Les divisions simples basées sur du texte ne sont pas correctes. Peut-être qu'une regexp pourrait être OK, mais l'expression rationnelle devrait être une chaîne de caractères à guillemets simples. –

+0

Combien de fichiers de quelle taille voulez-vous créer? – kevpie

Répondre

0

Pas exactement une réponse à votre question, mais peut-être une solution à votre problème:

Navicat (MySQL GUI) Installer. Il a un outil de migration oracle => mysql, qui pourrait vous aider, parce que, très probablement, les erreurs que vous obtenez proviennent de différences de syntaxe. Ce sera une tâche difficile de convertir manuellement un dialecte SQL en un autre.

+0

Pas vraiment.La seule différence de syntaxe que j'ai trouvée était la fonction Oracle 'to_date'. J'ai résolu celui-là en définissant ma propre fonction mySQL 'to_date'. Dans la plupart des cas, je m'attends à ce que tout problème de syntaxe apparaisse pour toutes les lignes, pas une ligne isolée au milieu de ce gros fichier. –