mysql - 从 Oracle 迁移到 MySQL

标签 mysql oracle import migration dump

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

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

所以,这是我们的情况:

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

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

但是,这里的挑战在于,要实现这一点,我们需要从 Oracle 数据库中导出一份具有一致状态的数据。 (我们不能在周一导出某些表,而在周二导出另一些表,等等)这意味着,至少导出应该在不到一天的时间内完成。

我们的第一个想法是转储架构,但我找不到将 Oracle 转储文件导入 MySQL 的工具。以 CSV 文件形式导出表格可能可行,但恐怕可能需要很长时间。

所以我现在的问题是:

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

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

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

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

最佳答案

Oracle 不提供现成的卸载实用程序。

请记住,如果没有有关您的环境的全面信息(Oracle 版本?服务器平台?有多少数据?什么数据类型?),这里的所有内容都是 YMMV,您可能希望在您的系统上尝试一下它的性能和计时。

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

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

2) 如果您没有任何复杂的数据类型(例如 LOB),那么您可以使用 SQLPLUS 推出您自己的数据类型。如果您一次创建一个表,那么您可以轻松地将其并行化。该网站上的主题可能已被访问过多次,以下是一个示例:Linky

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

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

我将在这里扮演脾气暴躁的 DBA 的角色,并说如果您不能让 Oracle 表现良好,我很乐意看到有关 MySQL 如何解决您的特定问题的文章。如果您的应用程序无法触及 SQL,那么仍​​然有很多可能的方法来调整 Oracle。/肥皂盒

关于mysql - 从 Oracle 迁移到 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24300859/

相关文章:

mysql - mysql中按货币类型按实际值(value)订购价格

mysql - 优化 MySQL 表结构和行大小的影响

Oracle 从 pl/sql 调用 REST 服务

linux - 如何将完整数据库导入 Linux 并查看导入进度?

python - Caffe 未在 python 中导入

php - 获取递归或链接列表(如表)中当前行的级别,

java - 日期操作问题

sql - 使用绑定(bind)变量时如何实现 SQL 注入(inject)?

import - Nim 在哪里搜索要导入的模块?

php - 当当前值和新值相同时,更新查询将受影响的行返回为 0