从MySQL切换到PostgreSQL - 提示,技巧和陷阱?

Tob*_*ede 35 mysql migration postgresql load-data-infile

我正在考虑从MySQL切换到PostgreSQL.

使用PostgreSQL有什么提示,技巧和陷阱?

MySQLer应该注意什么?

另请参阅:PostgreSQL与MySQL有何不同?
另请参见:从MySQL迁移到PostgreSQL

注意 - 我不认为这是重复的.特别是答案的类型非常不同,这里的响应有更多的实现细节,这正是我所寻求的

rfu*_*sca 51

刚刚经历过这个,我还是......

  • 区分大小写的文本
  • 缺乏INSERT IGNOREREPLACE
  • 几乎所有地方都需要显式铸造
  • 没有反叛
  • LOAD DATA INFILE(COPY很近,但不够近)
  • 更改autoincrementSERIAL
  • 虽然MySQL中的形式不好,但在Postgres中,INNER JOIN没有ON条款就不会发生,使用CROSS JOIN等等
  • COUNT(*) 可能是疯狂的慢
  • 数据库使用字符集编码,而不是表
  • 您可以拥有多个数据库,具有多个模式(MySQL实际上只有一个数据库和多个模式)
  • 分区是不同的
  • MySQL interval与Postgres interval(时间间隔)
  • Postgres需要隐式列重命名 AS
  • 无法在Postgres中同时更新多个表
  • Postgres功能很强大.所以没有CALL proc();; 重写proc()为一个功能和SELECT proc();.


Mar*_*rkR 9

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

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

在操作上你需要看看:

  • 备份/恢复
  • 磁盘空间利用率
  • 内存利用率
  • 一次性数据迁移 - 可能是一项很大/耗时的任务
  • 如果失败则回滚计划
  • 监控 - 您如何监控MySQL,并且可以调整这些方法
  • (如果相关) - 复制

在考虑此类举措之前,您肯定必须进行大量的性能测试.

这些成本使得迁移到不同的数据库对于大多数非常重要的应用而言过于昂贵.考虑一下非常小心的好处,以及完成上述所有工作的巨大成本.

如果你花了不到三个月的时间,在一个非常重要的应用程序中,我会感到惊讶,在此期间你将无法继续定期开发.

  • 这是一个新项目,因此在此阶段迁移不需要任何费用.但这都是值得考虑的好建议. (4认同)

jan*_*neb 8

您可以尝试包含最常见问题的PostgreSQL陷阱.一般来说,PostgreSQL文档也非常好,所以请将它放在枕头下.

另外,在pgsql wiki上从MySQL转换为PostgreSQL.


小智 6

我发现这个脚本将连接到你的MySQL数据库和你的PostgreSQL数据库,只是传输内容.它对我来说就像一个魅力.

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

安装者

$ pip install py-mysql2pgsql
Run Code Online (Sandbox Code Playgroud)

$ py-mysql2pgsql
Run Code Online (Sandbox Code Playgroud)

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

我必须安装argparse才能工作.

$ pip install argparse
Run Code Online (Sandbox Code Playgroud)

填写数据库详细信息后,再次运行它

$ py-mysql2pgsql
Run Code Online (Sandbox Code Playgroud)

在与设置文件相同的文件夹中,wham,你就完成了.它没有在屏幕上打印任何内容,但之后我的数据库被完全复制了.


tpd*_*pdi 5

在转换之前,通过启动服务器将MySQL设置为ANSI严格性: - transaction-isolation = SERIALIZABLE --sql-mode = ANSI

确保您没有使用MyIsam表.

MySQL允许很多转换它不应该; pg将需要演员.

您的存储过程,函数和触发器必须重写.pg为您提供了这些语言的选择,但您必须安装这些语言; 它不像MySQL那样友好.

pg只允许在一个选择列表中允许组中的列或聚合; 如果你这样做,MySQL将通过选择组中的第一个值来作弊.

MySQL添加了一堆扩展:不等于运算符可以!=像在C中一样,它允许'&&'作为'和'的同义词,'||' '或'等等.特别是,pg使用'||' 表示字符串连接.

基本上,pg非常严格ANSI,而MySQL则不是.我强烈建议在转换为pg之前让MySQL尽可能严格遵守ANSI标准,然后在运行应用程序时检查是否有任何警告.