从Oracle迁移到MySQL

我们在Oracle数据库中遇到了严重的性能问题,我们希望尝试将其迁移到基于MySQL的数据库(无论是直接MySQL还是更优选Infobright)。

事情是,我们需要让旧系统和新系统在至less几个星期(如果不是几个月)重叠,然后才能真正知道新数据库的所有function是否符合我们的需求。

所以,这是我们的情况:

Oracle数据库由多个表组成,每个数百万行。 白天几乎有成千上万的声明,我们无法阻止移民。

每天早上,新数据被导入到Oracle数据库中,replace成千上万行。 复制这个过程不是一个问题,所以我们可以在理论上同时导入两个数据库。

但是,这里面临的挑战在于,为了实现这个目标,我们需要从Oracle数据库中导出一个一致的状态。 (星期一我们不能出口一些表格,星期二出口一些表格等等)。这意味着至less出口应该在不到一天的时间内完成。

我们的第一个想法是转储模式,但我无法find一个工具来将Oracle转储文件导入到MySQL中。 在CSV文件中导出表格可能会起作用,但是恐怕可能需要很长时间。

所以我现在的问题是:

我该怎么办? 有什么工具可以将Oracle转储文件导入到MySQL中吗? 有没有人有这么大规模的迁移经验?

PS:请不要为Oracle提供性能优化技术,我们已经尝试了很多:-)

编辑:我们之前已经尝试了一些ETL工具,只是发现它们不够快:导出只有一个表已经花费了4个多小时…

第二编辑:来吧人们…没有人试图尽可能快地导出整个数据库,并转换数据,以便它可以导入到另一个数据库系统?

Oracle不提供开箱即用的卸载实用程序。

请记住,没有关于您的环境的全面信息(oracle版本?服务器平台?多less数据?什么数据types?)这里的一切都是YMMV,你会想要在系统上进行性能和时间安排。

我的1-3点只是一般的数据移动想法。 第4点是一种方法,可以减less停机或中断到几分钟或几秒钟。

1)有第三方实用程序可用。 我已经使用了一些这些,但最好为您检查自己的目的。 这里列出了一些第三方产品: OraFaq 。 不幸的是,他们中的很多人在Windows上运行,这将减慢数据卸载过程,除非您的数据库服务器在Windows上,并且您可以直接在服务器上运行装载实用程序。

2)如果你没有像LOB那样的复杂数据types,那么你可以用SQLPLUS来自己推出。 如果你一次做了一个表,那么你可以很容易地将其并行化。 这个网站上的主题可能不止一次,这里是一个例子: Linky

3)如果你是10g +,那么外部表可能是完成这个任务的一个高效的方法。 如果您创build一些与当前表格具有相同结构的空白外部表格并将数据复制到这些表格,则数据将转换为外部表格格式(文本文件)。 再次,OraFAQ来救援 。

4)如果您必须将系统平行保存几天/几周/月,则使用更改数据捕获/应用工具来实现接近零的停机时间。 准备支付$$$。 我已经使用金门软件的工具,可以挖掘Oracle重做日志,并提供插入/更新语句到MySQL数据库。 您可以在上线前的一周内无需停机的情况下迁移大部分数据。 然后,在上线期间,closures源数据库,使Golden Gate赶上最后剩余的事务,然后打开对新目标数据库的访问权限。 我用这个升级,追赶时间只有几分钟。 我们已经拥有了Golden Gate的网站许可证,所以对我们来说这不是什么好事。

我将在这里扮演Cranky DBA的angular色,并说如果你不能让Oracleperformance出色,我很乐意看到MySQL如何解决你的特定问题。 如果您的应用程序无法访问SQL,则仍然有许多可能的方法来调整Oracle。 /肥皂盒

我已经构build了一个C#应用程序,可以读取Oracle转储(.dmp)文件,并将其数据表抽取到SQL Server数据库中。

此应用程序每晚在生产基础上使用,将PeopleSoft数据库迁移到SQL Server。 PeopleSoft数据库有1100多个数据库表,Oracle转储文件的大小大于4.5GB。

此应用程序创buildSQL Server数据库和表,然后在双核英特尔服务器上运行less于55分钟的时间内加载所有4.5GB的数据。

我不相信修改这个应用程序与提供ADO.NET提供程序的其他数据库一起工作会很困难。

是的,Oracle很慢。 🙂

您可以使用任意数量的ETL工具将数据从Oracle移动到MySQL中。 我最喜欢的是SQL Server集成服务。

如果您有Oracle9i或更高版本,则可以实施更改数据捕获。 在此处阅读更多信息http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10736/cdc.htm

然后,您可以使用任何ETL技术从Oracle转换到MySQL或Infobright。

我习惯在不同的数据库之间传输大量数据,任何地方的logging数在10-250万之间。 例如,当我使用Pentaho,Talend,Java和Ruby来传输3千万条logging时,我的传输总是花费了5个小时。 当我尝试Perl时,转换时间大大缩短为20分钟。

Perl在数据传输方面的卓越性能背后的原因可能是Perl不是面向对象的编程语言,而是把所有的variables当作string。 Perl不必做任何types转换,任何types的检查或为每个批logging集创build对象。 Perl只是查询让我们假设1,000条logging为string,并将数据作为string沿着线传输,然后转换为适当的数据types由目标数据库服务器在SQL语句中完成,该语句中包含1,000条SQL插入语句。

Pentaho,Talend,Ruby,Java做了太多的数据types检查,types转换,创build了太多的对象,在操作系统上创build内存需求,使垃圾收集器变得疯狂,这就是当我处理数百万条logging时开始慢的地方。

我通常在8台CPU服务器上生成8个Perl进程,它们共享上次检索到的logging的位置,然后就可以开始了。 我得到了怪物丑陋的Perl ETL,没有人可以在performance中击败。 在这一点上,性能仅取决于源数据库和目标数据库。 每秒可以查询和插入多less条logging,

由于Perl只需要很less的CPU指令周期来处理每个请求和插入操作,并且从Oracle快速获取数据,Oracle经常认为它处于拒绝服务攻击之下,并且会closures接受进一步的请求。 然后我必须增加Oracle数据库的进程和会话限制才能继续。

我是一名Java开发人员,但有时甚至是Perl的丑陋,都可以在没有其他现代编程语言可以竞争的地方使用。 如果你喜欢看我自己的一些关于我在说什么的工作,那么你可以访问我的两个search引擎,在分片MySQL数据库上保存近5亿条logging,随时search你的名字。

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

我已经使用Pentaho数据集成从Oracle迁移到MySql(我也将相同的数据迁移到Postresql,这大约快50%,我猜这主要是由于使用了不同的JDBC驱动程序)。 我跟着罗兰·布曼(Roland Bouman)在这里的指示,差不多就是这封信,对于这件事有多容易感到非常惊喜:

将表格数据从一个DB复制到另一个DB

我不知道这是否适合您的数据加载,但它是值得一试。

您可以使用Python,SQL * Plus和mysql.exe (MySQL客户端)脚本来复制整个查询结果表。 它将是可移植的,因为所有这些工具都存在于Windows和Linux上。

当我不得不这样做时,我使用Python实现了以下步骤:

  1. 使用SQL * Plus将数据提取到CSV文件。
  2. 使用mysql.exe加载转储文件到MySQL。

您可以通过使用表/分区/子分区执行并行加载来提高性能。

披露: Oracle-to-MySQL-Data-Migrator是我在Windows OS上为Oracle and MySQL之间的数据集成编写的脚本。

我最近发布了etlalchemy来完成这个任务。 这是一个开放源代码的解决scheme,允许任何2个SQL数据库与4行Python之间的迁移,最初devise为从Oracle迁移到MySQL。 已经为MySQL,PostgreSQL,Oracle,SQLite和SQL Server添加了支持。

这将负责迁移架构(可以说是最具挑战性的),数据,索引和约束,还有更多的选项。

安装:

 $ pip install etlalchemy 

在El Capitan上pip install --ignore-installed etlalchemy

跑步:

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

关于性能 ,这个工具通过各种RDBMS(如mysqlimportCOPY FROMpostgresql ))利用BULK导入工具有效地执行迁移。 我能够在40分钟内将一个5GB的SQL Server数据库迁移到MySQL中,并在13分钟内将一个3GB的700万行Oracle数据库迁移到MySQL。

要获得更多关于项目起源的背景, 请查看这篇文章。 如果您在运行该工具时遇到任何错误,请在github repo上打开一个问题,我将在不到一周的时间内修复它!

(要安装“cx_Oracle”Python驱动程序,请按照这些说明 )