代码之家  ›  专栏  ›  技术社区  ›  Dan Soap

从Oracle迁移到MySQL

  •  22
  • Dan Soap  · 技术社区  · 15 年前

    我们的oracle数据库遇到了严重的性能问题,我们希望尝试将其迁移到基于mysql的数据库(要么直接迁移到mysql,要么更好地迁移到infobright)。

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

    所以,我们的情况是:

    oracle数据库由多个表组成,每个表有数百万行。白天,有成千上万的语句,我们不能停下来迁移。

    每天早上,新的数据被导入到oracle数据库中,替换了大约数千行。复制这个过程不是问题,所以理论上,我们可以在两个数据库中并行导入。

    但是,这里的挑战在于,要想成功,我们需要从Oracle数据库中导出一个从某一天起具有一致状态的数据。(有些表星期一不能出口,有些表星期二不能出口,等等)这意味着,出口至少要在一天之内完成。

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

    所以我现在的问题是:

    我该怎么办?有没有工具可以将oracle转储文件导入mysql?有没有人有过如此大规模的移民经历?

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

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

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

    8 回复  |  直到 7 年前
        1
  •  6
  •   Community CDub    8 年前

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

    请记住,不要提供有关您的环境的全面信息(Oracle版本?服务器平台?有多少数据?什么数据类型?)这里的一切都是YMMV,你会想让它在你的系统性能和时间。

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

    1)提供第三方公用设施。我已经使用了其中的一些,但最好是你自己检查一下,以达到你的预期目的。下面列出了一些第三方产品: OraFaq . 不幸的是,许多数据库运行在windows上,这会减慢数据卸载过程,除非db服务器在windows上,并且您可以直接在服务器上运行load实用程序。

    2)如果没有像lob这样复杂的数据类型,那么可以使用sqlplus创建自己的数据类型。如果你一次做一个表,那么你可以很容易地将它并行化。此网站上访问过的主题可能不止一次,下面是一个示例: Linky

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

    4)如果您必须让系统并行工作几天/几周/几个月,那么使用一个变更数据捕获/应用工具来实现近乎零的停机时间。准备好支付$$。我使用了golden gate软件的工具,它可以挖掘oracle重做日志,并向mysql数据库提供insert/update语句。您可以在上线前一周迁移大量数据,而无需停机。然后在上线期间,关闭源数据库,让golden gate跟踪最后剩余的事务,然后打开对新目标数据库的访问。我用这个来升级,追赶时间只有几分钟。我们已经有了金门的网站许可证,所以对我们来说这不是什么自掏腰包的事。

    我将在这里扮演一个脾气暴躁的dba角色,如果你不能让oracle表现良好,我希望看到一篇关于mysql如何解决你的特殊问题的文章。如果您的应用程序不能访问sql,那么仍然有很多可能的方法来优化oracle。肥皂盒

        2
  •  5
  •   STLDev    12 年前

    我已经构建了一个c应用程序,它可以读取oracle dump(.dmp)文件并将其数据表泵入sql server数据库。

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

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

    如果其他数据库有ado.net提供程序,我相信修改这个应用程序来使用它们不会太困难。

        3
  •  3
  •   Raj More    15 年前

    是的,甲骨文很慢。:)

    您可以使用任意数量的etl工具将数据从oracle移动到mysql。我最喜欢的是sql server集成服务。

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

    然后,您可以使用任何etl技术从oracle到mysql或infobright进行增量更改。

        4
  •  2
  •   Kevin Duraj    8 年前

    我习惯于在不同的数据库之间传输大数据,在1000-250万条记录之间的任何地方。例如,当我使用PunaHo、TalEnter、Java和Ruby转移30百万条记录时,我的传输总是花费了5个小时。当我尝试Perl时,传输时间大大减少到20分钟。

    Perl在数据传输方面的卓越性能背后的原因可能是Perl不是一种面向对象的编程语言,它将所有变量都视为字符串。Perl不必为每个批记录集进行任何类型转换、任何类型检查或创建对象。Perl只是一个查询,假设1000条记录是字符串,数据是字符串,然后由目标数据库服务器在包含1000条SQL INSERT语句的SQL语句中转换为适当的数据类型。

    PunaHo,TalEnter,Ruby,Java做太多的数据类型检查,类型转换,创建太多对象,创建OS上的内存需求,使垃圾收集器变得疯狂,这就是当我处理数百万条记录时慢度开始的地方。

    我通常在8cpu服务器上生成8个perl进程,这些进程共享上一次检索到的记录的位置。我得到了一个在性能上无人能比的丑陋的Perl ETL。在这一点上,性能只取决于源和目标数据库。每秒可以查询和插入多少条记录,

    因为Perl处理每个请求和插入所需的CPU指令周期非常少,而且从Oracle吸收数据的速度非常快,所以Oracle经常认为它受到拒绝服务攻击,它将关闭以接受进一步的请求。然后我必须增加Oracle数据库上的进程和会话限制才能继续。

    我是一个Java开发人员,但有时甚至Perl的丑陋可以在没有其他现代编程语言可以竞争的地方使用。如果你想看看我自己的一些工作,关于我所说的,你可以访问我的两个搜索引擎持有约5亿条记录的切分MySQL数据库,并随时搜索你的名字。

    http://find1friend.com/
    http://myhealthcare.com/
    
        5
  •  1
  •   Community CDub    8 年前

    我使用pentaho数据集成从oracle迁移到mysql(我也将相同的数据迁移到postresql,大约快50%,我猜这主要是由于使用的jdbc驱动程序不同)。我遵照罗兰·鲍曼的指示来到这里,几乎到了信中所说的那一步,对这是多么容易感到非常惊喜:

    Copy Table data from one DB to another

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

        6
  •  0
  •   Alex B    9 年前

    您可以使用python、sql*plus和 mysql.exe (mysql客户端)复制整个查询结果表的脚本。 它将是可移植的,因为所有这些工具都存在于windows和linux上。

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

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

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

    披露: Oracle-to-MySQL-Data-Migrator 是我为 Oracle and MySQL 在Windows操作系统上。

        7
  •  0
  •   The Aelfinn    9 年前

    我最近被释放了 etlalchemy 完成这项任务。它是一个开源的解决方案,允许在任何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(如 MySql端口 从复制 ( 波斯特雷斯尔 )有效地进行迁移。我能够在40分钟内将一个包含33105951行的5GB SQL Server数据库迁移到MySQL,并在13分钟内将一个3GB 7000000行Oracle数据库迁移到MySQL。

    为了获得更多关于项目起源的背景资料, check out this post. 如果在运行该工具时出现任何错误,请在 github repo 不到一周我就把它修好!

    (要安装“cx_oracle”python驱动程序, follow these instructions )

        8
  •  0
  •   Ruzo Owzy    7 年前

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

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

    http://www.sqlines.com/download

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

    1. 连接到源DBMS(Oracle)
    2. 连接到目标DBMS(MySQL)
    3. 在要迁移的Oracle DBMS中指定架构和表
    4. 按“传输”按钮运行迁移过程(运行内置迁移查询)
    5. 获取一个传输日志,该日志将告诉从源数据库读取和写入目标数据库的记录数,以及哪些查询失败。

    希望这将有助于其他人将土地上的这个问题。