代码之家  ›  专栏  ›  技术社区  ›  Toby Hede

从mysql切换到postgresql-提示、技巧和gotchas?

  •  33
  • Toby Hede  · 技术社区  · 17 年前

    我正在考虑从MySQL到PostgreSQL的转换。

    使用PostgreSQL有哪些技巧、窍门和窍门?

    mysqler应该注意什么?

    参见: How different is PostgreSQL to MySQL?
    参见: Migrate from MySQL to PostgreSQL

    注意-我不认为这是复制品。特别是,答案的类型非常不同,这里的回答有更多的实现细节,这正是我所寻找的。

    6 回复  |  直到 13 年前
        1
  •  50
  •   Dave Jarvis James Eichele    15 年前

    我自己也经历过,我还是…

    • 区分大小写的文本
    • 缺乏 INSERT IGNORE REPLACE
    • 几乎所有地方都需要明确的演员阵容
    • 无底盘
    • LOAD DATA INFILE ( COPY 很近,但不够近)
    • 变化 autoincrement SERIAL
    • 虽然mysql的形式不好,但是在postgres中, INNER JOIN 没有 ON 子句不能发生,使用 CROSS JOIN 诸如此类
    • COUNT(*) 可能会非常慢
    • 数据库是用字符集编码的,而不是用表编码的
    • 您可以有多个数据库,有多个模式(MySQL实际上只有一个数据库和多个模式)
    • 分区不同
    • MySQL interval 与后格雷斯 间隔 (时间间隔)
    • 隐式列重命名,Postgres需要 AS
    • 无法在Postgres中同时更新多个表
    • Postgres函数非常强大。所以没有 CALL proc(); 重写 proc() 作为函数和 SELECT proc(); .
        2
  •  9
  •   MarkR    17 年前

    这将是一项艰巨的任务,因为您必须测试整个代码库——任何地方的每个查询

    • 句法
    • 正确的行为(即返回相同的结果)
    • 性能-例如,是否有任何性能回归/改进,您能处理它们吗?
    • 错误处理-它们在错误条件下的行为不一样,可能您的代码依赖于特定的错误代码。

    在操作上,您需要查看:

    • 备份/还原
    • 磁盘空间利用率
    • 内存利用率
    • 一次性数据迁移-可能是一项耗费大量时间的任务
    • 如果失败,则回滚的计划
    • 监控——你是如何监控你的MySQL的,这些方法能被适应吗?
    • (如果相关)-复制

    在考虑采取这种行动之前,您肯定需要进行大量的性能测试。

    这些成本使得迁移到不同的数据库对于大多数不平凡的应用程序来说过于昂贵。考虑到好处 非常 小心地对付做上述所有事情的巨大、巨大的成本。

    如果在一个非常重要的应用程序中花费您不到三个月的时间,在这段时间内您将无法继续正常的开发,我会感到惊讶。

        3
  •  8
  •   janneb    17 年前

    你可以试试 PostgreSQL gotchas 其中包含最常见的问题。一般来说,PostgreSQL文档也很好,所以也要把它放在枕头下面。

    也, Converting from MySQL to PostgreSQL 在pgsql wiki上。

        4
  •  6
  •   Dahlo    14 年前

    我找到了这个脚本,它将连接到您的MySQL数据库和PostgreSQL数据库,并且只传输内容。这对我来说很有吸引力。

    https://github.com/philipsoutham/py-mysql2pgsql

    由安装

    $ pip install py-mysql2pgsql
    

    $ py-mysql2pgsql
    

    在任何文件夹中,它都会为您创建一个模板设置文件(mysql2pgsql.yml),您可以在其中编辑和输入数据库的详细信息。

    我必须安装argparse才能工作。

    $ pip install argparse
    

    填写数据库详细信息后,只需再次运行即可。

    $py-mysql2pgsql
    

    在与设置文件相同的文件夹中,完成了操作。它没有把任何东西打印到屏幕上,但后来我的数据库被完全复制了。

        5
  •  5
  •   tpdi    17 年前

    在转换之前,通过以下方式启动服务器,将mysql设置为ansi-stricteness:--事务隔离=可序列化--SQL模式=ansi

    确保您没有使用myisam表。

    MySQL允许很多转换,但不应该;PG需要一个强制转换。

    必须重新写入存储的过程、函数和触发器。PG为您提供了这些语言的选择,但是您必须安装这些语言;它不像MySQL那样用户友好。

    pg只允许在选择列表列中使用group by或聚合;如果这样做,mysql将通过选择组中的第一个值来作弊。

    MySQL添加了一系列扩展:不相等的运算符可以是 != 与C中一样,它允许“&&”作为“and”、“”for“或”等的同义词。特别是,pg使用“”表示字符串类别。

    基本上,pg是相当严格的ansi,而mysql不是。我强烈建议在转换为pg之前尽可能严格地遵循ansi,然后在运行应用程序时检查是否有任何警告。

        6
  •  1
  •   Ivka    13 年前

    除了移动数据库结构之外,您不能避免手动调整…

    最可靠的方法 传输数据 (如果结构相同,则逐表列出):

    mysql --default-character-set=utf8 -e "SELECT * FROM mytable" > mytable.txt
    
    psql
    \copy mytable from '/path/to/mytable.txt' WITH NULL AS 'NULL';
    

    最近一直在尝试其他的方法(比如mysqldump中有大量的选项+sed等),但是没有什么比这更好的方法了。

    这种方法还允许在改变结构时有一定的灵活性—只需编写一个适当的选择。