Migrazione da Oracle a MySQL

Abbiamo incontrato seri problemi di prestazioni con il nostro database Oracle e vorremmo provare a migrare su un database basato su MySQL (MySQL direttamente o, più preferibilmente, Infobright).

Il fatto è che dobbiamo lasciare che il vecchio e il nuovo sistema si sovrappongano per almeno alcune settimane se non mesi, prima che lo sappiamo, se tutte le caratteristiche del nuovo database corrispondano alle nostre esigenze.

Quindi, ecco la nostra situazione:

Il database Oracle è composto da più tabelle con milioni di righe. Durante il giorno, ci sono letteralmente migliaia di dichiarazioni, che non possiamo fermare per la migrazione.

Ogni mattina, i nuovi dati vengono importati nel database Oracle, sostituendo alcune migliaia di righe. Copiare questo processo non è un problema, quindi potremmo, in teoria, importare in entrambi i database in parallelo.

Ma, e qui la sfida sta nel fatto che, per far funzionare tutto questo, dobbiamo avere un’esportazione dal database Oracle con uno stato coerente da un giorno. (Non possiamo esportare alcuni tavoli il lunedì e altri il martedì, ecc.) Ciò significa che almeno l’esportazione dovrebbe essere terminata in meno di un giorno.

Il nostro primo pensiero era quello di scaricare lo schema, ma non ero in grado di trovare uno strumento per importare un file di dump Oracle in MySQL. Esportare tabelle in file CSV potrebbe funzionare, ma temo che potrebbe richiedere troppo tempo.

Quindi la mia domanda ora è:

Cosa dovrei fare? C’è qualche strumento per importare i file di dump di Oracle in MySQL? Qualcuno ha esperienza con una migrazione così ampia?

PS: Per favore, non suggerire tecniche di ottimizzazione delle prestazioni per Oracle, abbiamo già provato molto 🙂

Modifica: abbiamo già provato alcuni strumenti ETL prima, solo per scoprire che non erano abbastanza veloci: l’esportazione di una sola tabella richiedeva già più di 4 ore …

2 ° Edit: Forza gente … nessuno ha mai provato ad esportare un intero database il più velocemente ansible e convertire i dati in modo che possano essere importati in un altro sistema di database?

Oracle non fornisce un’utilità di scaricamento pronta all’uso.

Tieni a mente senza informazioni esaustive sul tuo ambiente (versione oracle? Piattaforma server? Quanti dati? Quali tipi di dati?) Tutto qui è YMMV e vorresti darci un po ‘sul tuo sistema per prestazioni e tempistiche.

I miei punti 1-3 sono solo idee generiche di movimento dei dati. Il punto 4 è un metodo che riduce i tempi di inattività o l’interruzione a minuti o secondi.

1) Sono disponibili utilità di terze parti. Ho usato alcuni di questi, ma è meglio che tu li controlli personalmente per il tuo scopo. Alcuni prodotti di terze parti sono elencati qui: OraFaq . Sfortunatamente molti di essi girano su Windows, il che rallenterebbe il processo di scaricamento dei dati a meno che il server DB non fosse su Windows e potreste eseguire l’utilità di caricamento direttamente sul server.

2) Se non si dispone di tipi di dati complessi come LOB, è ansible eseguire il rollover con SQLPLUS. Se hai fatto un tavolo alla volta, puoi facilmente parallelizzarlo. L’argomento è stato visitato su questo sito probabilmente più di una volta, ecco un esempio: Linky

3) Se si è 10g +, le tabelle esterne potrebbero essere un modo performante per eseguire questa operazione. Se si creano delle tabelle esterne vuote con la stessa struttura delle tabelle correnti e si copiano i dati su di esse, i dati verranno convertiti nel formato di tabella esterno (un file di testo). Ancora una volta, OraFAQ in soccorso .

4) Se è necessario mantenere i sistemi in parallelo per giorni / settimane / mesi, utilizzare uno strumento di acquisizione / applicazione dei dati di modifica per tempi di fermo quasi nulli. Preparati a pagare $$$. Ho utilizzato lo strumento Golden Gate Software che può estrarre i log di ripristino Oracle e fornire istruzioni di inserimento / aggiornamento a un database MySQL. È ansible migrare la maggior parte dei dati senza tempi di inattività la settimana prima di go-live. Quindi, durante il periodo go-live, chiudi il database di origine, chiedi a Golden Gate di recuperare le ultime transazioni rimanenti, quindi apri l’accesso al tuo nuovo database di destinazione. Ho usato questo per gli aggiornamenti e il periodo di recupero è stato solo pochi minuti. Avevamo già una licenza di sito per Golden Gate quindi non era nulla di scontato per noi.

Qui interpreterò il ruolo di Cranky DBA e dirò che se non riesci a far funzionare bene Oracle, mi piacerebbe vedere una recensione di come MySQL ha risolto i tuoi problemi particolari. Se hai un’applicazione in cui non puoi toccare l’SQL, ci sono ancora molti modi possibili per mettere a punto Oracle. / Soapbox

Ho creato un’applicazione C # in grado di leggere un file di dump Oracle (.dmp) e pompare le sue tabelle di dati in un database SQL Server.

Questa applicazione viene utilizzata ogni notte su base di produzione per migrare un database PeopleSoft su SQL Server. Il database PeopleSoft ha oltre 1100 tabelle di database e il file di dump Oracle ha una dimensione superiore a 4,5 GB.

Questa applicazione crea il database e le tabelle di SQL Server e quindi carica tutti i 4,5 GB di dati in meno di 55 minuti in esecuzione su un server Intel dual-core.

Non credo che sarebbe troppo difficile modificare questa applicazione per lavorare con altri database a condizione che abbiano un provider ADO.NET.

sì, Oracle è piuttosto lento. 🙂

È ansible utilizzare qualsiasi numero di strumenti ETL per spostare i dati da Oracle a MySQL. Il mio preferito è SQL Server Integration Services.

Se hai Oracle9i o versioni successive, puoi implementare Change Data Capture. Leggi di più qui http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10736/cdc.htm

Quindi puoi prendere un delta di modifiche da Oracle a MySQL o Infobright utilizzando qualsiasi tecnologia ETL.

Sono abituato a trasferire grandi quantità di dati tra diversi database, ovunque tra 10 e 250 milioni di record. Ad esempio, quando uso Pentaho, Talend, Java e Ruby per trasferire 30 milioni di record, i miei trasferimenti richiedono sempre più di 5 ore. Quando ho provato Perl il tempo di trasferimento è stato drammaticamente ridotto a 20 minuti.

Il motivo alla base delle eccezionali prestazioni di Perl per il trasferimento dei dati potrebbe essere che Perl non è un linguaggio di programmazione orientato agli oggetti e considera tutte le variabili come stringhe. Perl non deve eseguire alcuna conversione di tipo, alcun tipo di controllo o creazione di oggetti per ciascun set di record batch. Perl è solo una query diciamo 1.000 record come stringa e dati in movimento come una stringa lungo il filo e quindi la conversione al tipo di dati appropriato viene eseguita dal server di database di destinazione nell’istruzione SQL che contiene 1.000 istruzioni di inserimento SQL al suo interno.

Pentaho, Talend, Ruby, Java fanno troppi controlli sui tipi di dati, digita conversioni, creano troppi oggetti che creano richieste di memoria sul sistema operativo e fanno impazzire il garbage collector, ed è qui che inizia la lentezza quando mi occupo di milioni di record.

Generalmente ho generato 8 processi Perl su 8 server CPU che condividono la posizione dell’ultimo record recuperato e ci si va. Ho ottenuto il terribile Perl ETL di MONSTER che nessuno può battere in performance. In quel punto le prestazioni dipendono solo dai database di origine e destinazione. Quanti record puoi interrogare e inserire al secondo,

Poiché Perl impiega pochissimi cicli di istruzione della CPU per elaborare ogni richiesta e inserimento, e risucchiando dati così velocemente da Oracle, Oracle spesso pensa che sia sotto attacco Denial of Service e spegnerà accettando ulteriori richieste. Quindi devo aumentare i limiti del processo e delle sessioni sul database Oracle per continuare.

Sono uno sviluppatore Java, ma a volte anche la bruttezza di Perl può essere utilizzata in luoghi in cui nessun altro linguaggio di programmazione moderno può competere. Se ti piace vedere alcuni dei miei lavori su quello di cui stavo parlando, puoi visitare il mio motore di ricerca con quasi 500 milioni di record su database MySQL e sentirti libero di cercare il tuo nome.

http://find1friend.com/ http://myhealthcare.com/ 

Ho usato Pentaho Data Integration per migrare da Oracle a MySql (ho anche effettuato la migrazione degli stessi dati a Postresql, che era circa il 50% più veloce, il che credo sia dovuto principalmente ai diversi driver JDBC usati). Ho seguito le istruzioni di Roland Bouman qui, quasi alla lettera, e sono rimasto piacevolmente sorpreso di quanto fosse facile:

Copia i dati della tabella da un DB all’altro

Non so se sarà appropriato per il caricamento dei dati, ma vale la pena provare.

È ansible utilizzare lo script Python, SQL * Plus e mysql.exe (client MySQL) per copiare l’intera tabella dei soli risultati della query. Sarà portatile perché tutti questi strumenti esistono su Windows e Linux.

Quando ho dovuto farlo ho implementato i seguenti passaggi usando Python:

  1. Estrai i dati nel file CSV usando SQL * Plus.
  2. Carica il file di dump in MySQL usando mysql.exe.

È ansible migliorare le prestazioni eseguendo il caricamento parallelo utilizzando Tabelle / Partizioni / Sottocartelle.

Disclosure: Oracle-to-MySQL-Data-Migrator è lo script che ho scritto per l’integrazione dei dati tra Oracle and MySQL su sistema operativo Windows.

Recentemente ho rilasciato etlalchemy per portare a termine questo compito. È una soluzione open source che consente la migrazione tra 2 database SQL con 4 linee di Python ed è stata inizialmente progettata per migrare da Oracle a MySQL. È stato aggiunto il supporto per MySQL, PostgreSQL, Oracle, SQLite e SQL Server.

Questo si occuperà della migrazione dello schema (probabilmente il più impegnativo), dei dati, degli indici e dei vincoli, con molte più opzioni disponibili.

Installare:

 $ pip install etlalchemy 

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

Correre:

 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() 

Per quanto riguarda le prestazioni , questo strumento utilizza gli strumenti di importazione BULK su vari RDBMS come mysqlimport e COPY FROM ( postgresql ) per effettuare le migrazioni in modo efficiente. Sono stato in grado di migrare un database SQL Server da 5 GB con 33.105.951 file in MySQL in 40 minuti e un database Oracle da 3 GB a 7.000.000 righe su MySQL in 13 minuti.

Per avere più informazioni sulle origini del progetto, consulta questo post. Se riscontri degli errori nell’esecuzione dello strumento, apri un problema sul repository github e cercherò di correggerlo in meno di una settimana!

(Per installare il driver Python “cx_Oracle”, segui queste istruzioni )

Abbiamo avuto lo stesso problema. Necessario per ottenere tabelle e dati da Oracle dbms a mysql dbms.

Abbiamo usato questo strumento che abbiamo trovato online … Ha funzionato bene.

http://www.sqlines.com/download

Questo strumento ti aiuterà fondamentalmente:

  1. Collegati al tuo DBMS sorgente (ORACLE)
  2. Connetti a destinazione DBMS (MySQL)
  3. Specificare schema e tabelle nel DBMS ORACLE che si desidera migrare
  4. Premi un pulsante “Trasferisci” per eseguire il processo di migrazione (eseguendo query di migrazione integrate)
  5. Ottieni un registro di trasferimento, che indicherà quanti record sono stati LETTITI da SOURCE e WRITTEN nel database di destinazione, quali query hanno avuto esito negativo.

Spero che questo aiuti gli altri che faranno seguito a questa domanda.