我们的Oracle数据库遇到了严重的性能问题,我们想尝试将其迁移到基于MySQL的数据库(MySQL直接或更优选的是Infobright)。
问题是,如果新数据库的所有功能都符合我们的需求,我们需要让新系统和新系统重叠至少几周(如果不是几个月),然后我们才真正知道。
所以,这是我们的情况:
Oracle数据库由多个表组成,每个表包含数百万行。在白天,有数以千计的陈述,我们无法停止迁移。
每天早上,新数据都会导入Oracle数据库,取代数千行。复制此过程不是问题,因此理论上我们可以并行导入两个数据库。
但是,这里面临的挑战是,为了实现这一目标,我们需要从Oracle数据库导出一天的一致状态。 (周一我们不能出口一些表,周二也不能出口其他表等)这意味着,至少出口应该在不到一天的时间内完成。
我们首先想到的是转储架构,但我找不到将Oracle转储文件导入MySQL的工具。以CSV文件导出表可能有效,但我担心这可能需要很长时间。
所以现在我的问题是:
我该怎么办?有没有工具可以将Oracle转储文件导入MySQL?有没有人有这么大规模迁移的经验?
PS:请不要为Oracle建议性能优化技术,我们已经尝试了很多: - )
编辑:我们之前已经尝试了一些ETL工具,但却发现它们不够快:只导出一个表已经花了4个多小时......
第二次编辑:来吧人们......没有人尝试过尽快导出整个数据库并转换数据以便将其导入另一个数据库系统吗?
答案 0 :(得分:6)
Oracle不提供开箱即用的卸载实用程序。
请记住,没有关于您的环境的全面信息(oracle版本?服务器平台?有多少数据?什么数据类型?)这里的所有内容都是YMMV,您可能希望在系统上了解性能和时序。
我的观点1-3只是通用的数据运动思路。第4点是一种将停机时间或中断减少到几分钟或几秒的方法。
1)有第三方实用程序可用。我已经使用了其中的一些,但最适合您自己查看它们的预期目的。此处列出了一些第三方产品:OraFaq。不幸的是,很多它们在Windows上运行会降低数据卸载过程的速度,除非您的数据库服务器在Windows上并且您可以直接在服务器上运行加载实用程序。
2)如果您没有像LOB这样的复杂数据类型,那么您可以使用SQLPLUS自行编写。如果你一次做一个表,那么你可以轻松地并行化它。这个网站上访问的主题可能不止一次,这是一个例子:Linky
3)如果您是10g +那么外部表可能是完成此任务的高效方法。如果创建一些与当前表具有相同结构的空白外部表并将数据复制到它们,则数据将转换为外部表格式(文本文件)。再次,OraFAQ到rescue。
4)如果必须将系统并行保存数天/数周/月,则使用更改数据捕获/应用工具以实现接近零的停机时间。准备支付$$$。我使用了Golden Gate Software的工具,可以挖掘Oracle重做日志并为MySQL数据库提供插入/更新语句。您可以迁移大部分数据,而不会在上线前一周停机。然后在您的上线期间,关闭源数据库,让Golden Gate赶上最后剩余的事务,然后打开对新目标数据库的访问。我用它进行升级,赶上时间只有几分钟。我们已经获得了Golden Gate的站点许可证,因此对我们来说没有什么可以自掏腰包的。
我将在这里扮演Cranky DBA的角色并说如果你不能让Oracle表现良好我很想看到MySQL如何修复你的特定问题。如果您的应用程序无法触及SQL,那么仍有许多方法可以调优Oracle。 /肥皂盒
答案 1 :(得分:5)
我构建了一个C#应用程序,它可以读取Oracle转储(.dmp)文件并将其数据表泵入SQL Server数据库。
此应用程序每晚在生产基础上使用,以将PeopleSoft数据库迁移到SQL Server。 PeopleSoft数据库有1100多个数据库表,Oracle转储文件大小超过4.5GB。
此应用程序创建SQL Server数据库和表,然后在不到55分钟的时间内在双核英特尔服务器上加载所有4.5GB的数据。
我不相信修改此应用程序以与其他数据库一起工作会有太多困难,只要他们有ADO.NET提供程序。
答案 2 :(得分:3)
您可以使用任意数量的ETL工具将数据从Oracle移动到MySQL。我最喜欢的是SQL Server Integration Services。
如果您拥有Oracle9i或更高版本,则可以实施Change Data Capture。在这里阅读更多http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10736/cdc.htm
然后,您可以使用任何ETL技术从Oracle到MySQL或Infobright进行更改。
答案 3 :(得分:1)
我使用Pentaho Data Integration从Oracle迁移到MySql(我也将相同的数据迁移到Postresql,速度提高了约50%,我猜这主要是因为使用了不同的JDBC驱动程序)。我跟着罗兰·鲍曼的指示,几乎到了这封信,并且非常惊讶于它是多么容易:
Copy Table data from one DB to another
我不知道它是否适合您的数据加载,但值得一试。
答案 4 :(得分:0)
您可以使用Python,SQL * Plus和mysql.exe
(MySQL客户端)脚本来复制仅查询结果的整个表。
它是可移植的,因为所有这些工具都存在于Windows和Linux上。
当我必须这样做时,我使用Python实现了以下步骤:
您可以使用表/分区/子分区执行并行加载来提高性能。
披露:Oracle-to-MySQL-Data-Migrator是我在Windows操作系统上为Oracle and MySQL
之间的数据集成编写的脚本。
答案 5 :(得分:0)
我最近发布了etlalchemy来完成这项任务。它是一个开源解决方案,允许在任何2个SQL数据库之间迁移 4行Python ,最初设计用于从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上的BULK导入工具,例如 mysqlimport 和 COPY FROM ( postgresql )有效地进行迁移。我能够在40分钟内将带有33,105,951行的5GB SQL Server数据库迁移到MySQL中,并在13分钟内将3GB 7,000,000行Oracle数据库迁移到MySQL。
要获得有关项目起源的更多背景信息,check out this post.如果您在运行该工具时遇到任何错误,请在github repo上打开一个问题,然后我会在一个星期!
(安装" cx_Oracle" Python驱动程序,follow these instructions)
答案 6 :(得分:0)
我们有同样的问题。需要从oracle dbms到mysql dbms获取表和数据。
我们使用了在网上找到的这个工具……效果很好。
http://www.sqlines.com/download
此工具基本上可以为您提供帮助:
希望这会帮助其他将解决此问题的人。