Migrer D'Oracle vers MySQL

nous avons rencontré de sérieux problèmes de performance avec notre base de données Oracle et nous aimerions essayer de la migrer vers une base de données basée sur MySQL (soit MySQL directement, soit, de préférence, Infobright).

le fait est, nous devons laisser l'ancien et le nouveau système se chevaucher pendant au moins quelques semaines, sinon des mois, avant que nous sachions réellement, si toutes les caractéristiques de la nouvelle base de données correspondent à nos besoins.

donc, voici notre situation:

La base de données Oracle se compose de plusieurs tableaux avec chaque million de lignes. Pendant 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. Copier ce processus n'est pas un problème, donc nous pourrions, en théorie, importer dans les deux bases de données en parallèle.

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

notre première pensée a été de vider le schéma, mais je n'ai pas été en mesure de trouver un outil pour importer un fichier Oracle dump dans MySQL. Exporter des tables dans des fichiers CSV pourrait fonctionner, mais je crains que cela pourrait prendre trop de temps.

donc ma question maintenant est:

Que dois-je faire? Existe-t-il un outil pour importer des fichiers Oracle dump dans MySQL? Quelqu'un a-t-il l'expérience d'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à essayé beaucoup : -)

Edit: nous avons déjà essayé quelques outils ETL avant, seulement pour découvrir, qu'ils n'étaient pas assez rapides: L'exportation d'une seule table a déjà pris plus de 4 heures ...

2ème Édition: Venez sur les gens ... personne n'a-t-il jamais essayé d'exporter une base de données complète 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
demandé sur Ispirer SQLWays Migrations 2010-03-19 20:59:51
la source

8 ответов

Oracle ne fournit pas un utilitaire de déchargement standard.

gardez à l'esprit sans informations complètes sur votre environnement (version oracle? plate-forme de serveur? la quantité de données? quels types de données? tout ici est YMMV et vous voudriez donner un coup de pouce à votre système pour la performance et le timing.

mes points 1-3 ne sont que des idées génériques de mouvement de données. Le Point 4 est une méthode qui réduit le temps d'arrêt ou d'interruption à quelques minutes ou secondes.

1) des services publics de tiers sont disponibles. J'en ai utilisé quelques-uns, mais il est préférable que vous les examiniez vous-même dans le but visé. Quelques produits tiers sont énuméré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 DB ne soit sous windows et que vous puissiez exécuter l'utilitaire de chargement directement sur le serveur.

2) Si vous n'avez pas de complexe les types de données comme les LOBs alors vous pouvez rouler votre propre avec SQLPLUS. Si vous avez fait une table à la fois alors vous pouvez facilement paralléliser. Sujet a été visité sur ce site probablement plus d'une fois, voici un exemple: Linky

3) Si vous êtes 10g+ Tables externes peuvent être un moyen performant pour accomplir cette tâche. Si vous créez des tables externes Vierges avec la même structure que vos tables actuelles et copiez les données à eux, les données seront converti au format de table externe (un fichier texte). Encore une fois, OraFAQ au sauvetage .

4) Si vous devez garder les systèmes en parallèle pendant des jours, des semaines et des mois, utilisez alors un outil de saisie/application des données de changement pour un temps d'arrêt proche de zéro. Être prêt à payer $$$. J'ai utilisé L'outil du logiciel Golden Gate qui peut extraire les journaux Oracle redo et fournir insert/UPDATE statements à une base de données MySQL. Vous pouvez migrer la majeure partie des données sans temps d'arrêt la semaine précédente le go-live. Puis pendant votre période de démarrage, fermez la base de données source, demandez à Golden Gate de rattraper les dernières transactions restantes, puis ouvrez l'accès à votre nouvelle base de données cible. J'ai utilisé ceci pour des améliorations et la période de rattrapage était seulement quelques minutes. Nous avions déjà une licence de site pour Golden Gate donc ce n'était pas de notre poche pour nous.

et je jouerai le rôle de grincheux DBA ici et dire que si vous ne pouvez pas obtenir Oracle performing bien je voudrais voir un écrire de la façon dont MySQL a corrigé vos problèmes particuliers. Si vous avez une application où vous ne pouvez pas toucher le SQL, il y a encore beaucoup de façons possibles d'accorder Oracle. / boîte de savon

6
répondu David Mann 2017-05-23 15:26:00
la source

j'ai construit une application C# qui peut lire un Oracle dump (.dmp) du fichier et de la pompe, c'est des tables de données dans une base de données SQL Server.

cette application est utilisée chaque nuit sur une base de production pour migrer une base de données PeopleSoft vers le serveur SQL. La base de données PeopleSoft contient plus de 1100 tables de base de données et le fichier Oracle dump est de plus de 4,5 Go.

cette application crée la base de données et les tables SQL Server et charge ensuite toutes les 4.5 Go de données en moins de 55 minutes sur un serveur Intel à double noyau.

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

5
répondu STLDeveloper 2013-06-06 18:23:05
la source

Oui, Oracle est plutôt lent. :)

vous pouvez utiliser n'importe quel nombre d'outils ETL pour déplacer des données D'Oracle dans MySQL. Mon préféré est SQL Server Integration Services.

si vous avez Oracle9i ou plus, vous pouvez implémenter la Capture de données de changement. Lire la suite ici http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10736/cdc.htm

, Alors vous pouvez prendre un delta de changements d'Oracle à votre MySQL ou Infobright utilisant n'importe quelle technologie ETL.

3
répondu Raj More 2010-03-19 21:34:25
la source

j'ai l'habitude de transférer des données importantes entre différentes bases de données, entre 10 et 250 millions d'enregistrements. Par exemple, quand J'utilise Pentaho, Talend, Java et Ruby pour transférer 30 millions d'enregistrements, mes transferts prennent toujours plus de 5 heures. Quand J'ai essayé Perl le temps de transfert a été dramatiquement réduit à 20 minutes.

la raison derrière Perl performance exceptionnelle pour le transfert de données pourrait être que Perl n'est pas un langage de programmation orienté objet et traite tous les variables comme chaînes. Perl n'a pas à effectuer de conversion de type, de vérification de type ou de création d'objets pour chaque jeu d'enregistrements par lots. Perl est juste requête disons que 1000 enregistrements comme chaîne et le déplacement de données comme chaîne le long du fil et puis la conversion au type de données approprié est fait par le serveur de base de données de destination dans la déclaration SQL qui a 1.000 déclarations SQL insert à l'intérieur d'elle.

Pentaho, Talend, Ruby, Java faire trop de type de données de la vérification, les conversions de type, la création d' trop d'objets qui créent des demandes de mémoire sur OS et faire collecteur de déchets devenir fou, et c'est là que la lenteur commence quand je traite avec des millions de disques.

je lance habituellement 8 Processus Perl sur 8 serveurs CPU qui partagent la position du dernier enregistrement récupéré et voilà. J'ai des personnages monstrueux et moches que personne ne peut battre en performance. Dans ce point la performance dépend seulement des bases de données de source et de destination. Combien d'enregistrements Vous pouvez interroger et insérer par deuxièmement,

parce que Perl prend très peu de cycles D'instruction CPU pour traiter chaque requête et inserts, et aspirant des données si rapidement à partir D'Oracle, Oracle pense souvent que c'est sous attaque de déni de service et qu'il va fermer en acceptant d'autres requêtes. 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é dans des endroits où aucune autre programmation moderne la langue peut rivaliser. Si vous aimez voir certains de mes propres travaux sur ce que je parlais, vous êtes pouvez visiter mon moteur de recherche deux contenant près de 500 millions d'enregistrements sur la base de données MySQL sharded et vous sentir libre de rechercher votre nom.

http://find1friend.com/
http://myhealthcare.com/
2
répondu Kevin Duraj 2017-01-04 02:21:02
la source

j'ai utilisé L'intégration de données Pentaho pour migrer D'Oracle vers MySql (j'ai également migré les mêmes données vers Potresql, 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 ici, presque à la lettre, et j'ai été très agréablement surpris de voir à quel point c'était facile:

copier les données D'un DB à un autre

Je ne sais pas si ça va être approprié pour votre charge de données, mais il vaut la peine d'un coup.

1
répondu davek 2017-05-23 14:47:07
la source

vous pouvez utiliser Python, SQL*Plus et le script mysql.exe (client MySQL) pour copier la table entière des résultats de requête. Il sera portable car tous ces outils existent sous Windows et Linux.

quand j'ai dû le faire, j'ai implémenté les étapes suivantes en utilisant Python:

  1. extraire des données dans un fichier CSV en utilisant SQL*Plus.
  2. charger le fichier dump dans MySQL l'utilisation de mysql.EXE.

vous pouvez améliorer performance en exécutant une charge parallèle à L'aide de Tables/Partitions/sous-partitions.

Divulgation: Oracle-MySQL-Data-Migrator est le script que j'ai écrit pour l'intégration de données entre les Oracle and MySQL sur Windows OS.

0
répondu Alex B 2016-07-01 01:22:33
la source

j'ai récemment publié etlalchemy pour accomplir cette tâche. C'est une solution open-sourced qui permet la migration entre n'importe quelles bases de données 2 SQL avec 4 lignes de Python , et a été initialement conçu pour migrer D'Oracle à MySQL. Le Support a été ajouté pour MySQL, PostgreSQL, Oracle, SQLite et SQL Server.

cela permettra de gérer le schéma de migration (sans doute le plus difficile), les données, les indices et les contraintes, avec beaucoup plus d'options disponibles.

à installer:

$ pip install etlalchemy

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

:

from etlalchemy import ETLAlchemySource, ETLAlchemyTarget

orcl_db_source = ETLAlchemySource("oracle+cx_oracle://username:[email protected]/ORACLE_SID")

mysql_db_target = ETLAlchemyTarget("mysql://username:[email protected]/db_name", drop_database=True)
mysql_db_target.addSource(orcl_db_source)
mysql_db_target.migrate()

concernant performance , cet outil utilise des outils D'importation en vrac à travers divers RDBM tels que mysqlimport et copie de ( postgresql ) à effectuer des migrations efficacement. J'ai pu migrer une base de données de Serveur SQL de 5 Go avec 33 105 951 lignes dans MySQL en 40 minutes, et une base de données Oracle de 3 Go avec 7 000 000 de lignes vers MySQL en 13 minutes.

Pour obtenir plus d'informations sur les origines du projet, consultez ce post. si vous avez des erreurs avec l'outil, ouvrez un problème sur le GitHub repo et je le corrigerai en moins d'une semaine!

(To installez le pilote Python "cx_Oracle", suivez ces instructions )

0
répondu The Aelfinn 2016-08-03 19:48:10
la source

nous avions le même problème. Nécessaire pour obtenir des tables et des données des SGBD oracle à des SGBD mysql.

nous avons utilisé cet outil que nous avons trouvé en ligne... Il a bien fonctionné.

http://www.sqlines.com/download

cet outil vous aidera essentiellement:

  1. se Connecter à votre source de SGBD(ORACLE)
  2. se Connecter à destination de SGBD(MySQL)
  3. Spécifiez le schéma et les tables dans le SGBD ORACLE que vous voulez migrer
  4. appuyez sur le bouton" Transfert "pour exécuter le processus de migration(exécution des requêtes de migration intégrées)
  5. Obtenir un journal de transfert qui vous permettra de connaître le nombre d'enregistrements qui ont été LUS à partir de la SOURCE et ÉCRIT sur la base de données de destination, quelles requêtes ont échoué.

Espère que cela aidera d'autres personnes qui vont atterrir sur cette question.

0
répondu Ruzo Owzy 2018-08-29 17:40:46
la source

Autres questions sur