web-dev-qa-db-fra.com

Migrer d'Oracle vers MySQL

Nous avons rencontré de graves problèmes de performances avec notre base de données Oracle et nous aimerions essayer de les migrer vers une base de données basée sur MySQL (directement MySQL ou, de préférence, Infobright).

Le fait est que nous devons laisser l'ancien et le nouveau système se chevaucher pendant au moins quelques semaines, voire des mois, avant de savoir si toutes les fonctionnalités de la nouvelle base de données correspondent à nos besoins.

Alors, voici notre situation:

La base de données Oracle est constituée de plusieurs tables contenant chacune des millions de lignes. Au cours de la journée, il y a littéralement des milliers de déclarations que nous ne pouvons pas arrêter pour la migration.

Chaque matin, de nouvelles données sont importées dans la base de données Oracle, remplaçant quelques milliers de lignes. La copie de ce processus n'est pas un problème, nous pourrions donc, en théorie, importer dans les deux bases de données en parallèle.

Mais, et là réside le défi, pour que cela fonctionne, nous avons besoin d'une exportation à partir de la base de données Oracle avec un état cohérent du jour au lendemain. (Nous ne pouvons pas exporter certaines tables le lundi et d’autres le mardi, etc.) Cela signifie qu’au moins l’exportation doit être terminée en moins d’un jour.

Notre première idée était de vider le schéma, mais je n’ai pas trouvé un outil pour importer un fichier de vidage Oracle dans MySQL. L'exportation de tables dans des fichiers CSV peut fonctionner, mais je crains que cela ne prenne trop de temps.

Donc ma question est maintenant: 

Que devrais-je faire? Existe-t-il un outil pour importer des fichiers de vidage Oracle dans MySQL? Quelqu'un at-il une expérience avec une telle migration à grande échelle?

PS: S'il vous plaît, ne suggérez pas de techniques d'optimisation des performances pour Oracle, nous avons déjà beaucoup essayé :-)

Edit: Nous avions déjà essayé quelques outils ETL auparavant, juste pour découvrir qu'ils n'étaient pas assez rapides: l'exportation d'une seule table prenait déjà plus de 4 heures ... 

2nd Edit: Allez les gars ... personne n'a-t-il jamais essayé d'exporter toute une base de données aussi rapidement que possible et de convertir les données afin qu'elles puissent être importées dans un autre système de base de données?

22
Dan Soap

Oracle ne fournit pas d'utilitaire de déchargement prêt à l'emploi. 

Gardez à l'esprit sans informations complètes sur votre environnement (version Oracle? Plate-forme serveur? Combien de données? Quels types de données?) Tout est en YMMV et vous voudriez essayer votre système pour plus de performances et de synchronisation. 

Mes points 1 à 3 ne sont que des idées génériques sur le mouvement des données. Le point 4 est une méthode qui réduira les temps d'arrêt ou les interruptions à quelques minutes ou quelques secondes. 

1) Des utilitaires tiers sont disponibles. J’en ai utilisé quelques-uns, mais je vous recommande de les vérifier vous-même dans le but recherché. Quelques produits de tiers sont listés ici: OraFaq . Malheureusement, beaucoup d’entre eux fonctionnent sous Windows, ce qui ralentirait le processus de déchargement des données à moins que votre serveur de base de données ne fonctionne sous Windows et que vous puissiez exécuter l’utilitaire de chargement directement sur le serveur. 

2) Si vous n’avez pas de types de données complexes comme les LOB, vous pouvez utiliser le vôtre avec SQLPLUS. Si vous avez créé une table à la fois, vous pouvez facilement la paralléliser. Le sujet a été visité sur ce site probablement plus d'une fois, voici un exemple: Linky

3) Si vous êtes 10g + alors les tables externes peuvent être un moyen performant d'accomplir cette tâche. Si vous créez des tables externes vierges avec la même structure que vos tables actuelles et y copiez les données, celles-ci seront converties au format de table externe (un fichier texte). Encore une fois, OraFAQ au rescue

4) Si vous devez conserver les systèmes en parallèle pendant des jours/semaines/mois, utilisez un outil de capture/application des données de changement pour un temps d'indisponibilité proche de zéro. Soyez prêt à payer $$$. J'ai utilisé l'outil de Golden Gate Software capable d'exploiter les journaux Oracle redo et de fournir des instructions insert/update à une base de données MySQL. Vous pouvez migrer la majeure partie des données sans interruption la semaine précédant la mise en production. Ensuite, pendant votre période de mise en service, fermez la base de données source, laissez Golden Gate récupérer les dernières transactions restantes, puis ouvrez l'accès à votre nouvelle base de données cible. Je l'ai utilisé pour des mises à niveau et la période de rattrapage n'a duré que quelques minutes. Nous avions déjà des licences de site pour Golden Gate, donc ce n'était pas rien pour nous. 

Et je jouerai le rôle de DBA Cranky ici et dirai que si vous n'arrivez pas à bien faire fonctionner Oracle, j'aimerais beaucoup savoir comment MySQL corrige vos problèmes particuliers. Si vous avez une application où vous ne pouvez pas toucher le code SQL, il existe encore de nombreux moyens d’optimiser Oracle. /caisse à savon

6
David Mann

J'ai construit une application C # capable de lire un fichier de vidage Oracle (.dmp) et de pomper ses tables de données dans une base de données SQL Server.

Cette application est utilisée quotidiennement en production pour migrer une base de données PeopleSoft vers SQL Server. La base de données PeopleSoft contient plus de 1100 tables et le fichier de vidage Oracle a une taille supérieure à 4,5 Go.

Cette application crée la base de données et les tables SQL Server, puis charge toutes les données de 4,5 Go en moins de 55 minutes sur un serveur Intel à double cœur.

Je ne crois pas qu'il serait trop difficile de modifier cette application pour fonctionner avec d'autres bases de données à condition qu'elles aient un fournisseur ADO.NET.

5
STLDev

oui, Oracle est assez lent. :)

Vous pouvez utiliser un nombre illimité d'outils ETL pour transférer des données d'Oracle vers MySQL. Mon préféré est SQL Server Integration Services.

Si vous avez Oracle9i ou supérieur, vous pouvez implémenter Change Data Capture. Lisez plus ici http://download-east.Oracle.com/docs/cd/B14117_01/server.101/b10736/cdc.htm

Ensuite, vous pouvez appliquer un delta de modifications d'Oracle à votre MySQL ou à Infobright à l'aide de toute technologie ETL.

3
Raj More

Je suis habitué à transférer des données volumineuses entre différentes bases de données, entre 10 et 250 millions d'enregistrements. Par exemple, lorsque j'utilise Pentaho, Talend, Java et Ruby pour transférer 30 millions de disques, mes transferts prenaient toujours plus de 5 heures. Lorsque j'ai essayé Perl, le temps de transfert a été considérablement réduit à 20 minutes. 

Les performances exceptionnelles de Perl pour le transfert de données peuvent s'expliquer par le fait que Perl n'est pas un langage de programmation orienté objet et traite toutes les variables comme des chaînes. Perl ne doit effectuer aucune conversion de type, aucune vérification de type ou création d'objets pour chaque jeu d'enregistrements par lot. Perl est juste une requête, disons 1 000 enregistrements sous forme de chaîne et le déplacement de données sous forme de chaîne le long du fil, puis la conversion en type de données approprié est effectuée par le serveur de base de données de destination dans l'instruction SQL contenant 1 000 instructions d'insertion SQL.

Pentaho, Talend, Ruby, Java vérifient trop le type de données, convertissent les types, créent trop d'objets qui créent des demandes de mémoire sur le système d'exploitation et rendent fou le récupérateur de mémoire, et c'est là que commence la lenteur lorsque je traite des millions d'enregistrements.

J'ai l'habitude de générer 8 processus Perl sur un serveur à 8 CPU qui partagent la position du dernier enregistrement récupéré et le tour est joué. J'ai obtenu MONSTER laid Perl ETL que personne ne peut battre en performance. À ce stade, les performances ne dépendent que des bases de données source et cible. Combien d'enregistrements vous pouvez interroger et insérer par seconde,

Etant donné que Perl prend très peu de cycles d’instruction de l’UC pour traiter chaque requête et chaque insertion, et absorbe rapidement les données d’Oracle, Oracle pense souvent qu’il subit une attaque par déni de service et refuse de recevoir les autres demandes. Ensuite, je dois augmenter les limites de processus et de sessions sur la base de données Oracle pour continuer.

Je suis un développeur Java, mais parfois même la laideur de Perl peut être utilisée dans des endroits où aucun autre langage de programmation moderne ne peut rivaliser. Si vous aimez voir certains de mes propres travaux sur ce dont je parlais, vous pouvez visiter mes deux moteurs de recherche contenant près de 500 millions d’enregistrements sur une base de données MySQL fragmentée et n'hésitez pas à rechercher votre nom.

http://find1friend.com/
http://myhealthcare.com/
2
Kevin Duraj

J'ai utilisé Pentaho Data Integration pour migrer d'Oracle vers MySql (j'ai également migré les mêmes données vers Postresql, ce qui était environ 50% plus rapide, ce qui était dû, en grande partie, aux différents pilotes JDBC utilisés). J'ai suivi les instructions de Roland Bouman presque à la lettre, et j'ai été agréablement surpris de la facilité avec laquelle il a été facile: 

Copier les données de table d'un DB à un autre

Je ne sais pas si cela conviendra à votre chargement de données, mais cela en vaut la peine.

1
davek

On avait le même problème. Nécessaire pour obtenir des tables et des données des dbms Oracle vers mysql dbms.

Nous avons utilisé cet outil trouvé en ligne ... Cela a bien fonctionné.

http://www.sqlines.com/download

Cet outil va essentiellement vous aider:

  1. Connectez-vous à votre SGBD source (Oracle)
  2. Se connecter au SGBD de destination (MySQL)
  3. Spécifiez le schéma et les tables dans le SGBD Oracle que vous souhaitez migrer
  4. Appuyez sur le bouton "Transférer" pour exécuter le processus de migration (exécution de requêtes de migration intégrées).
  5. Obtenez un journal de transfert indiquant le nombre d'enregistrements READ de SOURCE et WRITTEN sur la base de données de destination, les requêtes ayant échoué.

J'espère que cela aidera d'autres personnes qui vont se poser sur cette question.

0
Ruzo Owzy

Vous pouvez utiliser un script Python, SQL * Plus et mysql.exe (client MySQL) pour copier tout le tableau des résultats de requête . Il sera portable car tous ces outils existent sous Windows et Linux.

Quand je devais le faire, j'ai implémenté les étapes suivantes en utilisant Python:

  1. Extrayez les données dans un fichier CSV à l'aide de SQL * Plus. 
  2. Charger le fichier de vidage dans MySQL En utilisant mysql.exe.

Vous pouvez améliorer les performances en effectuant un chargement en parallèle à l'aide de Tables/Partitions/Sous-partitions.

Divulgation: Oracle-to-MySQL-Data-Migrator est le script que j'ai écrit pour l'intégration de données entre Oracle and MySQL sur un système d'exploitation Windows.

0
Alex B

J'ai récemment publié etlalchemy pour accomplir cette tâche. C'est une solution open source qui permet la migration entre 2 bases de données SQL avec 4 lignes de Python et qui avait été initialement conçue pour migrer d'Oracle vers MySQL. Un support a été ajouté pour MySQL, PostgreSQL, Oracle, SQLite et SQL Server.

Cela prendra en charge la migration du schéma (sans doute le plus difficile), des données, des index et des contraintes, avec beaucoup plus d'options disponibles. 

À installer: 

$ pip install etlalchemy

Sur El Capitan: pip install --ignore-installed etlalchemy

Courir: 

from etlalchemy import ETLAlchemySource, ETLAlchemyTarget

orcl_db_source = ETLAlchemySource("Oracle+cx_Oracle://username:password@hostname/Oracle_SID")

mysql_db_target = ETLAlchemyTarget("mysql://username:password@hostname/db_name", drop_database=True)
mysql_db_target.addSource(orcl_db_source)
mysql_db_target.migrate()

En ce qui concerne performance, cet outil utilise les outils d'importation BULK de divers SGBDR, tels que mysqlimport et COPY FROM (postgresql) pour effectuer des migrations efficacement. J'ai été en mesure de migrer une base de données SQL Server de 5 Go avec 33 105 951 lignes dans MySQL en 40 minutes et une base de données Oracle de 3 Go à 7 000 000 lignes en MySQL en 13 minutes.

Pour obtenir plus d'informations sur les origines du projet, consultez ce post. Si vous rencontrez des erreurs lors de l'utilisation de l'outil, ouvrez un problème sur github repo et je le corrigerai en moins d'une semaine!

(Pour installer le pilote Python "cx_Oracle", suivez ces instructions )

0
The Aelfinn