从Oracle过渡到MySQL的注意事项

时间:2018-04-10 19:43:23

标签: mysql sql database oracle

我们使用Oracle构建和维护一个相当大规模的企业Web应用程序,以满足我们的数据库需求,现在正在转换到MySQL。我知道两者之间存在一些语法差异。但除此之外,我还应该记住其他什么?

例如,我知道MySQL不支持存储过程,这就是我们将程序转换为Java代码的原因。

我在问我们可能遇到的潜在障碍,以及为那些人提供哪些解决方案?

请不要建议不使用MySQL,因为我们已修复此问题。

3 个答案:

答案 0 :(得分:4)

虽然"我知道MySQL并不支持存储过程"有点麻烦,你是对的:MySQL没有一种编程语言,比如他们的DBMS中嵌入了Oracle的PL / SQL,这极大地限制了存储过程和触发器。如果您使用了许多触发器,甚至可能是复合触发器,那么您可能很难以某种方式替换它们。

除此之外,还有一些想到的事情:

  • 空字符串和空字符串在Oracle中是相同的。在MySQL中,这是两个不同的东西。找到您必须考虑的所有事件可能会很繁琐。
  • MySQL没有 Windows功能,例如ROW_NUMBER。重写查询可能很难,而且容易出错。
  • MySQL没有序列,因此您可能需要更改内容(例如,应用首先获取序列值以插入父记录和子记录)。
  • MySQL没有功能索引。所以使用这些非常快的查询可能会在MySQL中变慢。
  • 如果您来自Oracle 12c:MySQL的LIMIT子句没有tie子句,这可以使编写查询更加难以理解。

然后某些功能可能有点不同甚至缺失,必须重写

  • concat运算符||缺席。 MySQL有一个函数CONCAT。没什么大不了的,但还是要改写很多。
  • MySQL没有ORDER BY NULLS FIRST / LAST子句。
  • ROWNUM可以通过LIMIT以某种方式进行模拟,但前者适用于WHERE,后者适用于后者。因此在重写时要小心。
  • TRANSLATEDECODE,...

还有一件事:在MySQL中执行update table 1 ...; update table2 ...; rollback;时,默认情况下只会回滚第二次更新!您必须将 system autocommit 变量设置为零以避免这种情况,并切换到Oracle中的事务行为。

答案 1 :(得分:3)

为了补充其他答案,您需要重新学习查询优化。

MySQL的SQL优化器要简单得多。这意味着:

  • MySQL的优化提示比Oracle的限制更为有限。
  • MySQL的算法和选项较少。
  • 在制定执行计划时,MySQL优化器不太全面。
  • 与甲骨文相比,EXPLAIN PLAN为您提供的信息非常有限。例如,它先排序然后过滤,还是反过来? - 不清楚。

当您发现查询速度缓慢并且您需要重新学习查询优化时,时间将会到来(当然),因为它非常不同。

答案 2 :(得分:2)

是的,

最重要的是,

  1. 设置SQL_MODE

    • Oracle's SQL_MODE
    • 类似
    • 默认情况下,MySQL仅限制您更改现有表的引擎。
    • 这使您可以做任何其他事情。就像将NULLS插入NOT NULL列一样。
      • 因为它只会自动转换为空字符串&放大处理时间。
  2. 设置TX_ISOLATION Level

      

    此语句指定事务特征。它采用逗号分隔的一个或多个特征值的列表。这些特性设置事务隔离级别或访问模式。隔离级别用于InnoDB表上的操作。可以指定访问模式以确定事务是以读/写还是以只读模式操作。

  3. 设置COLLATION

    • 设置字符集的默认设置,如果您没有转换可能会损坏您的数据,或者是从拉丁语转换为UTF8的噩梦。

    示例:

    SHOW COLLATION;

    SHOW CHARACTER SET;

    SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

  4. 利用Performance Reports

    • 在开发设置时,这对可伸缩性至关重要。
      • 如果您使用的是AWS
      • 请注意,我使用RDS Instances遇到了设置问题,建议您管理自己安装了MySQL的EC2实例。自己管理。
      • 我见过的问题
      • 无法使用效果架构
      • 无法设置某些全局设置(不确定这仍然是一个问题,但2年前是我的。)
  5. 最后,致Thorsten Kettner的评论

      

    concat运算符||缺席。 MySQL有一个函数CONCAT。没什么大不了的,但还是要重写一遍。

  6. 这是真的但是可以由SQL_MODE PIPES_AS_CONCAT控制 作为一个例子,这是我个人过去使用过的一个设置。这只是一个例子,可以让您 - 您的团队了解要查找的内容。

    SET @@SESSION.TRANSACTION_ALLOW_BATCHING=1;
    SET @@SESSION.INNODB_STRICT_MODE = 1;
    SET @@SESSION.SQL_WARNINGS = 1;
    SET @@SESSION.OPTIMIZER_SEARCH_DEPTH = 12;
    SET @@SESSION.SQL_MODE = "TRADITIONAL,ANSI";
    -- sets the following: REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    SET @@SESSION.TX_ISOLATION = "READ-COMMITTED";
    SET @@SESSION.BULK_INSERT_BUFFER_SIZE = 1024*1024*4096;
    SET @@SESSION.JOIN_BUFFER_SIZE = 1024*1024;
    SET @@SESSION.INNODB_LOCK_WAIT_TIMEOUT = 84600;
    SET @@SESSION.INTERACTIVE_TIMEOUT = 84600;
    SET @@SESSION.LOCK_WAIT_TIMEOUT = 84600;
    SET @@SESSION.WAIT_TIMEOUT = 84600;
    

    如果您对我发布的内容有任何疑问,请与我们联系。