2010-03-19 19 views
21

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

Lo que pasa es que tenemos que dejar que el sistema antiguo y el viejo se superpongan durante al menos algunas semanas o incluso meses, antes de que realmente sepamos, si todas las características de la nueva base de datos coinciden con nuestras necesidades.

Por lo tanto, aquí está nuestra situación:

La base de datos de Oracle consiste en múltiples tablas con millones de filas cada una. Durante el día, hay literalmente miles de declaraciones, que no podemos detener para la migración.

Cada mañana, los datos nuevos 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í el desafío radica, para que esto funcione debemos exportar desde la base de datos Oracle con un estado constante desde 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.

Nuestra primera idea 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.

Así que mi pregunta ahora es:

¿Qué debo 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 sugieren técnicas de optimización de rendimiento de Oracle, que ya probado un montón :-)

Editar: Ya hemos probado algunas herramientas ETL antes, sólo para descubrir, que eran no lo suficientemente rápido: exportar solo una tabla ya tomó más de 4 horas ...

2da Edición: Vamos amigos ... nunca nadie intentó exportar una base de datos completa lo más rápido posible y convertir los datos para que se puede importar a otro sistema de base de datos?

+4

Así que Oracle no puede manejar la carga de trabajo por lo que está cambiando a MySQL? ¿Esto es una broma? Si no es así, creo que Larry necesita saberlo de inmediato para poder detenerlo. La respuesta de Larry sería que necesitas gastar más dinero añadiendo equilibrio de carga, etc. Pero en serio, creo que tu primera prioridad sería asegurarme de que MySQL pueda manejar la carga de trabajo. –

+6

Nunca dije que Oracle no pudiera manejarlo, Oracle simplemente tiene sus limitaciones. Y como dije, queremos probar alternativas. Para nuestras tareas, Oracle podría no ser el sistema de base de datos más apropiado, un sistema optimizado de "depósito de datos" podría funcionar mejor. Probamos con Sand hace algunos años y nos sorprendió la ganancia de rendimiento, pero fue simplemente demasiado caro. Infobright funciona de la misma manera (organización de datos centrada en la columna) y es mucho más económico. Lo que estamos intentando aquí es simplemente comparar estos dos enfoques bajo las mismas condiciones previas. –

+3

Si esto sucede y usted realmente migra Y tiene mejoras de rendimiento, debe escribir una larga publicación en el blog con muchos detalles. Me encantaría poder reproducir esto. – jva

Respuesta

6

Oracle no proporciona una utilidad de descarga lista para usar.

Tenga en cuenta sin información exhaustiva sobre su entorno (plataforma de servidor de la versión Oracle, ¿cuántos datos? ¿Qué tipos de datos?) Aquí todo es YMMV y le gustaría probar el rendimiento y el tiempo.

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 rescue.

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./soapbox

3

Sí, Oracle es bastante lento. :)

Puede utilizar 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 su MySQL o Infobright usando cualquier tecnología ETL.

+0

Las herramientas de ETL que ya probamos eran demasiado lentas. Mientras escribía, necesitamos exportar la base de datos completa en menos de un día. Enmendado mi pregunta, pero aún así, ¡gracias por la sugerencia! –

+0

@Cassy respuesta editada –

+0

Enfoque interesante, gracias por el enlace. Esto todavía deja abierta la pregunta de cómo exportar e importar los datos iniciales ... –

1

He utilizado Pentaho Data Integration para migrar de Oracle a MySql (también migré los mismos datos a Postresql, que fue aproximadamente un 50% más rápido, lo que creo que se debió principalmente a los diferentes controladores JDBC utilizados).Seguí las instrucciones de Roland Bouman aquí, casi a la carta, y estaba muy gratamente sorprendido por lo fácil que era:

Copy Table data from one DB to another

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

5

He creado una aplicación C# que puede leer un archivo de volcado de Oracle (.dmp) y bombear 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 tablas de SQL Server y luego carga todos los 4.5GB de datos en menos de 55 minutos corriendo 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.

+0

Eso suena prometedor. Tristemente no consigo probar eso, ya que me he mudado a otra compañía donde ya no tengo el problema. Sin embargo, ¿tal vez podría publicar sus resultados como una publicación de blog? Me encantaría ver algunas estadísticas. –

+0

Bien de ti para comentar una respuesta a una publicación antigua, Dan. Aprecio mucho la votación. Espero que en algún momento en el futuro cercano, alguien más pueda ver esto y pueda usarlo. – STLDeveloper

+0

@STLDeveloper Fuera de interés, ¿cómo se encuentra el rendimiento de SQL Server en comparación con Oracle. He usado ambos, pero nunca en una base de datos lo suficientemente similar como para comparar me gusta. – ChrisProsser

2

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 del rendimiento excepcional de Perl para la transferencia de datos podría ser que Perl no es un lenguaje de programación orientado a objetos y trata todas las variables como cadenas. Perl no tiene que hacer ninguna conversión de tipo, ningún tipo de comprobación o creación de objetos para cada conjunto de registros de lotes. 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 declaración SQL que tiene 1,000 declaraciones SQL insertadas.

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

Normalmente 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. Cuántos registros puede consultar e insertar por segundo,

Dado que Perl toma muy pocos ciclos de instrucciones de la CPU para procesar cada solicitud e inserciones, y absorbe datos tan rápido de Oracle, Oracle a menudo piensa que está bajo ataque de denegación de servicio y se cerrará aceptando solicitudes adicionales. Entonces debo aumentar 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 programació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/ 
0

Usted puede usar Python, SQL * mysql.exe guión (cliente de MySQL) Plus y para copiar toda la tabla de resultados de la consulta solo. Será portátil porque todas esas herramientas existen en Windows y Linux.

Cuando tuve que hacerlo yo implementado siguientes pasos utilizando Python: los datos

  1. extracto en archivo CSV utilizando 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 la secuencia de comandos que escribí para la integración de datos entre Oracle and MySQL en el sistema operativo Windows.

0

Recientemente lancé etlalchemy para realizar 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), datos, índices y restricciones, con muchas más opciones disponibles.

Para instalar:

$ pip install etlalchemy 

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

Para ejecutar:

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

En cuanto rendimiento, esta herramienta utiliza las herramientas de importación masiva a través de diversos RDBMS como mysqlimport y COPIA DE (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, check out this post. Si obtiene algún error al ejecutar la herramienta, abra un problema en el github repo y lo remendaré en menos de una semana.

(Para instalar el controlador "cx_Oracle" Python, follow these instructions)

+0

Hola, probé con tu script, pero obtuve el siguiente error. Soy nuevo en Python Scripting, he instalado Python y creado un script con el nombre 'abc.py', cuando ejecuto el script, muestra un error como' 'ModuleNotFoundError: No hay un módulo llamado 'ETLAlchemySource'' – Swaraj

+0

Asegúrese de estar utilizando python2.7 –

+0

Estoy usando Python 3.6.3. – Swaraj