35

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

您在使用 PostgreSQL 时有哪些提示、技巧和陷阱?

MySQLer 应该注意什么?

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

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

4

6 回答 6

53

我自己刚刚经历过,好吧,我仍然......

  • 区分大小写的文本
  • 缺乏INSERT IGNOREREPLACE
  • 几乎所有地方都需要显式转换
  • 没有反引号
  • LOAD DATA INFILECOPY很接近,但不够接近)
  • 更改autoincrementSERIAL
  • 虽然 MySQL 中的格式不好,但在 Postgres 中,INNER JOIN没有ON子句的情况不会发生,使用CROSS JOIN
  • COUNT(*)可能会很慢
  • 数据库是用字符集编码的,而不是表
  • 您可以拥有多个数据库,具有多个架构(MySQL 确实只有一个数据库和多个架构)
  • 分区不一样
  • MySQL intervalvs. Postgres interval(时间间隔)
  • 隐式列重命名,Postgres 需要AS
  • 无法在 Postgres 中同时更新多个表
  • Postgres 功能强大。所以没有CALL proc();;重写proc()为函数和SELECT proc();.
于 2009-04-21T11:51:37.893 回答
9

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

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

在操作上,您需要查看:

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

在考虑采取这样的举措之前,您肯定必须进行大量的性能测试。

对于大多数重要的应用程序来说,这些成本使得迁移到不同的数据库过于昂贵。非常仔细地考虑与执行上述所有操作的巨大成本相比的好处。

如果您在一个非平凡的应用程序中花费不到三个月的时间,我会感到惊讶,在此期间您将无法继续进行常规开发。

于 2009-04-21T15:56:25.760 回答
8

您可以尝试包含最常见问题的PostgreSQL 陷阱。一般来说,PostgreSQL 文档也很不错,所以也请把它放在枕头底下。

此外,在 pgsql wiki 上从 MySQL 转换为 PostgreSQL 。

于 2009-04-21T11:34:09.807 回答
6

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

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

安装者

$ pip install py-mysql2pgsql

$ py-mysql2pgsql

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

我必须安装 argparse 才能工作。

$ pip install argparse

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

$ py-mysql2pgsql

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

于 2012-04-05T07:58:39.517 回答
5

在转换之前,通过使用以下命令启动服务器,将 MySQL 设置为 ANSI-strictness:--transaction-isolation=SERIALIZABLE --sql-mode=ANSI

确保您没有使用 MyIsam 表。

MySQL 允许大量不应该的转换;pg 将需要演员表。

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

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

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

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

于 2009-04-21T11:36:38.693 回答
1

除了移动数据库结构,您无法避免手动调整......

最可靠的数据传输方法(逐表,前提是结构相同):

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 等),但没有什么比这更好用了。

当结构发生变化时,这种方法还具有一定的灵活性——只需编写适当的 SELECT。

于 2013-03-04T20:25:43.430 回答