Migrar de Oracle a MySQL

Nos encontramos con serios problemas de rendimiento con nuestra base de datos Oracle y nos gustaría tratar de migrarlo a una base de datos basada en MySQL (ya sea MySQL directamente o, más preferiblemente, Infobright).

La cuestión es que tenemos que permitir que el sistema antiguo y el nuevo se superpongan durante al menos algunas semanas, si no meses, antes de que sepamos realmente, si todas las características de la nueva base de datos coinciden con nuestras necesidades.

Entonces, aquí está nuestra situación:

La base de datos Oracle consta de varias tablas con cada millón de filas. Durante el día, hay literalmente miles de declaraciones, que no podemos detener para la migración.

Todas las mañanas, los nuevos datos se importan a la base de datos Oracle, reemplazando algunos miles de filas. Copiar este proceso no es un problema, por lo que podríamos, en teoría, importar en ambas bases de datos en paralelo.

Pero, y aquí está el desafío, para que esto funcione necesitamos tener una exportación de la base de datos Oracle con un estado constante de un día. (No podemos exportar algunas tablas el lunes y algunas otras el martes, etc.) Esto significa que, al menos, la exportación debería finalizar en menos de un día.

Nuestro primer pensamiento fue volcar el esquema, pero no pude encontrar una herramienta para importar un archivo de volcado de Oracle en MySQL. Exportar tablas en archivos CSV podría funcionar, pero me temo que podría llevar demasiado tiempo.

Entonces mi pregunta ahora es:

¿Que debería hacer? ¿Hay alguna herramienta para importar archivos de volcado de Oracle en MySQL? ¿Alguien tiene alguna experiencia con una migración a gran escala?

PD: Por favor, no sugiera técnicas de optimización de rendimiento para Oracle, ya lo intentamos mucho 🙂

Editar: Ya probamos algunas herramientas de ETL antes, solo para descubrir que no eran lo suficientemente rápidas: exportar solo una tabla ya llevaba más de 4 horas …

2da Edición: Vamos amigos … ¿alguna vez nadie intentó exportar una base de datos completa lo más rápido posible y convertir los datos para que puedan ser importados a otro sistema de base de datos?

Oracle no proporciona una utilidad de descarga lista para usar.

Tenga en cuenta que sin información completa sobre su entorno (plataforma de Oracle versión? Servidor? ¿Cuántos datos? ¿Qué tipos de datos?) Aquí todo es YMMV y le gustaría probar el rendimiento y el tiempo de su sistema.

Mis puntos 1-3 son solo ideas genéricas de movimiento de datos. El punto 4 es un método que reducirá el tiempo de inactividad o la interrupción a minutos o segundos.

1) Hay servicios de terceros disponibles. He usado algunos de estos, pero lo mejor es que los revises tú mismo para tu propósito previsto. Algunos productos de terceros se enumeran aquí: OraFaq . Desafortunadamente, muchos de ellos se ejecutan en Windows, lo que ralentizaría el proceso de descarga de datos a menos que tu servidor de bases de datos estuviera en Windows y pudieras ejecutar la utilidad de carga directamente en el servidor.

2) Si no tiene ningún tipo de datos complejos como LOB, entonces puede hacer los suyos propios con SQLPLUS. Si hiciste una tabla a la vez, entonces puedes paralelizarla fácilmente. El tema ha sido visitado en este sitio, probablemente más de una vez, aquí hay un ejemplo: Linky

3) Si tiene 10g +, las Tablas externas pueden ser una forma efectiva de realizar esta tarea. Si crea algunas tablas externas en blanco con la misma estructura que sus tablas actuales y copia los datos en ellas, los datos se convertirán al formato de tabla externa (un archivo de texto). Una vez más, OraFAQ al rescate .

4) Si debe mantener los sistemas en paralelo durante días / semanas / meses, utilice una herramienta de captura / aplicación de datos de cambio para un tiempo de inactividad casi nulo. Prepárate para pagar $$$. He utilizado la herramienta de Golden Gate Software que puede extraer los registros de rehacer de Oracle y proporcionar instrucciones de inserción / actualización en una base de datos MySQL. Puede migrar la mayor parte de los datos sin tiempo de inactividad la semana anterior a la puesta en marcha. Luego, durante el período de activación, cierre la base de datos de origen, haga que Golden Gate ponga al día las últimas transacciones restantes y luego abra el acceso a su nueva base de datos de destino. Lo he usado para actualizaciones y el período de recuperación fue de solo unos minutos. Ya teníamos una licencia de sitio para Golden Gate, así que no era nada de dinero para nosotros.

Y haré el papel de Cranky DBA aquí y diré si no puede lograr que Oracle se desempeñe bien, me encantaría ver un resumen de cómo MySQL solucionó sus problemas particulares. Si tiene una aplicación en la que no puede tocar el SQL, todavía hay muchas maneras posibles de sintonizar Oracle. /plataforma improvisada

Creé una aplicación de C # que puede leer un archivo de volcado de Oracle (.dmp) y extraer sus tablas de datos en una base de datos de SQL Server.

Esta aplicación se usa cada noche en una base de producción para migrar una base de datos PeopleSoft a SQL Server. La base de datos de PeopleSoft tiene más de 1100 tablas de base de datos y el archivo de volcado de Oracle tiene más de 4,5 GB de tamaño.

Esta aplicación crea la base de datos y las tablas de SQL Server y luego carga todos los 4.5 GB de datos en menos de 55 minutos en un servidor Intel de doble núcleo.

No creo que sea demasiado difícil modificar esta aplicación para que funcione con otras bases de datos, siempre que tengan un proveedor ADO.NET.

Sí, Oracle es bastante lento. 🙂

Puede usar cualquier cantidad de herramientas ETL para mover datos de Oracle a MySQL. Mi favorito es SQL Server Integration Services.

Si tiene Oracle9i o superior, puede implementar Change Data Capture. Lea más aquí http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10736/cdc.htm

Luego puede tomar un delta de cambios de Oracle a MySQL o Infobright usando cualquier tecnología ETL.

Estoy acostumbrado a transferir datos grandes entre diferentes bases de datos, en cualquier lugar entre 10-250 millones de registros. Por ejemplo, cuando uso Pentaho, Talend, Java y Ruby para transferir 30 millones de registros, mis transferencias siempre llevaban más de 5 horas. Cuando probé Perl, el tiempo de transferencia se redujo drásticamente a 20 minutos.

La razón detrás del rendimiento excepcional de Perl para la transferencia de datos podría ser que Perl no es un lenguaje de progtwigción orientado a objetos y trata todas las variables como cadenas. Perl no tiene que hacer ninguna conversión de tipo, ninguna comprobación de tipo o crear objetos para cada conjunto de registros de lote. Perl solo consulta, digamos 1,000 registros como cadena y moviendo datos como una cadena a lo largo del cable y luego la conversión al tipo de datos apropiado es realizada por el servidor de la base de datos de destino en la statement SQL que tiene 1,000 declaraciones SQL insertadas.

Pentaho, Talend, Ruby, Java hacen demasiadas comprobaciones de tipos de datos, escriben conversiones, crean demasiados objetos que crean demandas de memoria en el SO y hacen que el recolector de basura se vuelva loco, y ahí es donde comienza la lentitud cuando trato con millones de registros.

Usualmente genero 8 procesos Perl en 8 servidores de CPU que comparten la posición del último registro recuperado y listo. Tengo MONSTER feo Perl ETL que nadie puede vencer en rendimiento. En ese punto, el rendimiento depende solo de las bases de datos de origen y destino. Cuantos registros puede consultar e insertar por segundo,

Debido a que Perl toma muy pocos ciclos de instrucciones de la CPU para procesar cada solicitud e inserto, y absorbe datos tan rápido de Oracle, Oracle a menudo piensa que está bajo un ataque de denegación de servicio y se cerrará al aceptar más solicitudes. Entonces debo boost los límites de procesos y sesiones en la base de datos Oracle para continuar.

Soy un desarrollador de Java, pero a veces incluso la fealdad de Perl se puede usar en lugares donde ningún otro lenguaje de progtwigción moderno puede competir. Si le gustaría ver algo de mi propio trabajo sobre lo que estaba hablando, puede visitar mi motor de búsqueda con casi 500 millones de registros en una base de datos MySQL fragmentada y no dude en buscar su nombre.

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

Utilicé Pentaho Data Integration para migrar de Oracle a MySql (también migré los mismos datos a Postresql, que era aproximadamente un 50% más rápido, lo que creo que se debió en gran medida a los diferentes controladores JDBC utilizados). Seguí las instrucciones de Roland Bouman aquí, casi al pie de la letra, y me sorprendió gratamente lo fácil que era:

Copie los datos de la tabla de una base de datos a otra

No sé si será apropiado para su carga de datos, pero vale la pena intentarlo.

Puede utilizar secuencias de comandos Python, SQL * Plus y mysql.exe (cliente MySQL) para copiar toda la tabla de resultados de consultas. Será portátil porque todas esas herramientas existen en Windows y Linux.

Cuando tuve que hacerlo, implementé los siguientes pasos usando Python:

  1. Extraiga datos en un archivo CSV usando SQL * Plus.
  2. Cargue el archivo de volcado en MySQL usando mysql.exe.

Puede mejorar el rendimiento realizando cargas paralelas utilizando Tablas / Particiones / Subparticiones.

Divulgación: Oracle-to-MySQL-Data-Migrator es el script que escribí para la integración de datos entre Oracle and MySQL en el sistema operativo Windows.

Recientemente liberé etlalchemy para lograr esta tarea. Es una solución de fuente abierta que permite la migración entre 2 bases de datos SQL con 4 líneas de Python , y se diseñó inicialmente para migrar de Oracle a MySQL. Se ha agregado soporte para MySQL, PostgreSQL, Oracle, SQLite y SQL Server.

Esto se ocupará de la migración del esquema (posiblemente el más desafiante), los datos, los índices y las restricciones, con muchas más opciones disponibles.

Instalar:

 $ pip install etlalchemy 

En El Capitán : pip install --ignore-installed etlalchemy

Correr:

 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 cuanto al rendimiento , esta herramienta utiliza herramientas de importación BULK en varios RDBMS como mysqlimport y COPY FROM ( postgresql ) para llevar a cabo migraciones de manera eficiente. Pude migrar una base de datos SQL Server de 5GB con 33,105,951 filas a MySQL en 40 minutos, y una base de datos Oracle de fila 3,000 y 7,000,000 a MySQL en 13 minutos.

Para obtener más información sobre los orígenes del proyecto, consulte esta publicación. Si tiene algún error al ejecutar la herramienta, abra un problema en el repository github y lo remendaré en menos de una semana.

(Para instalar el controlador Python “cx_Oracle”, siga estas instrucciones )

Tuvimos el mismo problema. Necesario para obtener tablas y datos de Oracle DBMS a MySQL DBMS.

Usamos esta herramienta que encontramos en línea … Funcionó bien.

http://www.sqlines.com/download

Esta herramienta básicamente te ayudará a:

  1. Conéctese a su fuente DBMS (ORACLE)
  2. Conéctese a DBMS de destino (MySQL)
  3. Especifique el esquema y las tablas en el DBMS ORACLE que desea migrar
  4. Presione el botón “Transferir” para ejecutar el proceso de migración (ejecutar consultas de migración incorporadas)
  5. Obtenga un registro de transferencia, que indicará cuántos registros se leyeron de SOURCE y WRITTEN en la base de datos de destino, qué consultas fallaron.

Espero que esto ayude a otros que aterrizarán en esta cuestión.