25

我们的 Oracle 数据库遇到了严重的性能问题,我们想尝试将其迁移到基于 MySQL 的数据库(直接使用 MySQL,或者最好是 Infobright)。

问题是,在我们真正知道新数据库的所有功能是否符合我们的需求之前,我们需要让新旧系统至少重叠几周甚至几个月。

所以,这是我们的情况:

Oracle 数据库由多个表组成,每个表都有数百万行。白天,实际上有成千上万的语句,我们不能停止迁移。

每天早上,都会将新数据导入 Oracle 数据库,替换数千行。复制这个过程不是问题,所以理论上我们可以并行导入两个数据库。

但是,挑战就在这里,要使其工作,我们需要从 Oracle 数据库中导出具有从某一天开始的一致状态。(我们不能在星期一导出一些表,在星期二导出一些表,等等。)这意味着,至少导出应该在不到一天的时间内完成。

我们的第一个想法是转储模式,但我找不到将 Oracle 转储文件导入 MySQL 的工具。导出 CSV 文件中的表格可能会奏效,但恐怕需要的时间太长。

所以我现在的问题是:

我应该怎么办?是否有任何工具可以将 Oracle 转储文件导入 MySQL?有没有人经历过如此大规模的迁移?

PS:拜托,不要建议Oracle的性能优化技术,我们已经尝试了很多:-)

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

第二次编辑:来吧,伙计们......没有人尝试过尽可能快地导出整个数据库并转换数据以便可以将其导入另一个数据库系统吗?

4

7 回答 7

7

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

请记住,如果没有关于您的环境的全面信息(oracle 版本?服务器平台?多少数据?什么数据类型?)这里的一切都是 YMMV,您可能希望在您的系统上试一试以提高性能和时间。

我的第 1-3 点只是通用的数据移动想法。第 4 点是将停机时间或中断减少到几分钟或几秒的方法。

1) 有 3rd 方实用程序可用。我已经使用了其中的一些,但最适合您自己检查它们是否符合您的预期目的。此处列出了一些第 3 方产品:OraFaq。不幸的是,它们中的很多都在 Windows 上运行,这会减慢数据卸载过程,除非您的数据库服务器在 Windows 上,并且您可以直接在服务器上运行加载实用程序。

2) 如果您没有像 LOB 这样的复杂数据类型,那么您可以使用 SQLPLUS 自行开发。如果你一次做一个表,那么你可以很容易地并行化它。主题可能已在此站点上访问过不止一次,这里是一个示例:Linky

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

4) 如果您必须保持系统并行数天/数周/数月,请使用变更数据捕获/应用工具来实现近乎零的停机时间。准备好支付$$$。我使用了 Golden Gate Software 的工具,该工具可以挖掘 Oracle 重做日志并向 MySQL 数据库提供插入/更新语句。您可以在上线前一周迁移大量数据而无需停机。然后在您上线期间,关闭源数据库,让 Golden Gate 赶上最后剩余的事务,然后打开对新目标数据库的访问。我已将其用于升级,并且追赶期只有几分钟。我们已经获得了 Golden Gate 的网站许可证,所以这对我们来说并不是什么现金。

我将在这里扮演 Cranky DBA 的角色,并说如果你不能让 Oracle 表现良好,我很想看到一篇关于 MySQL 如何解决你的特定问题的文章。如果您的应用程序无法使用 SQL,那么仍​​有许多可能的方法来调整 Oracle。/肥皂盒

于 2010-03-24T21:30:46.087 回答
5

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

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

此应用程序创建 SQL Server 数据库和表,然后在不到 55 分钟的时间内加载所有 4.5GB 数据,该应用程序在双核 Intel 服务器上运行。

我不相信修改这个应用程序以与其他数据库一起工作,只要他们有一个 ADO.NET 提供程序。

于 2013-06-06T14:23:05.830 回答
3

是的,甲骨文很慢。:)

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

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

然后,您可以使用任何 ETL 技术从 Oracle 到 MySQL 或 Infobright 进行增量更改。

于 2010-03-19T18:03:55.847 回答
1

我使用 Pentaho 数据集成从 Oracle 迁移到 MySql(我还将相同的数据迁移到 Postresql,这大约快 50%,我猜这主要是由于使用了不同的 JDBC 驱动程序)。我在这里按照 Roland Bouman 的指示进行了操作,几乎是信手拈来,并且对它的简单程度感到非常惊喜:

将表数据从一个数据库复制到另一个数据库

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

于 2010-03-19T20:28:46.990 回答
1

我最近发布了etlalchemy来完成这项任务。它是一个开源解决方案,允许使用4 行 Python在任意 2 个 SQL 数据库之间迁移,最初设计用于从 Oracle 迁移到 MySQL。已添加对 MySQL、PostgreSQL、Oracle、SQLite 和 SQL Server 的支持。

这将负责迁移模式(可以说是最具挑战性的)、数据、索引和约束,并提供更多选项。

安装:

$ pip install etlalchemy

在埃尔卡皮坦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 导入工具,例如mysqlimportCOPY FROM ( postgresql ) 来有效地执行迁移。我能够在 40 分钟内将具有 33,105,951 行的 5GB SQL Server 数据库迁移到 MySQL,并在 13 分钟内将 3GB 7,000,000 行的 Oracle 数据库迁移到 MySQL。

要了解有关项目起源的更多背景信息,请查看这篇文章。如果您在运行该工具时遇到任何错误,请在github 存储库上打开一个问题,我会在不到一周的时间内对其进行修补!

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

于 2016-08-03T16:48:10.613 回答
1

我们有同样的问题。需要从 oracle dbms 到 mysql dbms 获取表和数据。

我们使用了我们在网上找到的这个工具……效果很好。

http://www.sqllines.com/download

这个工具基本上可以帮助你:

  1. 连接到您的源 DBMS(ORACLE)
  2. 连接到目标 DBMS(MySQL)
  3. 指定要迁移的 ORACLE DBMS 中的模式和表
  4. 按“转移”按钮运行迁移过程(运行内置迁移查询)
  5. 获取一个传输日志,它将告诉有多少条记录从 SOURCE 读取并在目标数据库上写入,哪些查询失败了。

希望这会帮助其他将解决这个问题的人。

于 2018-08-29T14:40:46.337 回答
0

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

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

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

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

披露:Oracle-to-MySQL-Data-MigratorOracle and MySQL是我为Windows 操作系统之间的数据集成编写的脚本。

于 2016-06-30T22:22:33.237 回答