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

时间:2009-04-21 11:18:25

标签: mysql postgresql migration load-data-infile

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

使用PostgreSQL有什么提示,技巧和难题?

MySQLer应该注意什么?

  

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

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

6 个答案:

答案 0 :(得分:51)

我自己也经历过,好吧我还是......

  • 区分大小写的文字
  • 缺少INSERT IGNOREREPLACE
  • 几乎无处不在显式铸造
  • 没有反叛
  • LOAD DATA INFILECOPY已关闭,但距离不够近)
  • autoincrement更改为SERIAL
  • 虽然MySQL格式不好,但在Postgres中,INNER JOIN没有ON条款是不可能发生的,请使用CROSS JOIN之类的
  • COUNT(*)可能会发疯“
  • 数据库使用字符集编码,而不是表格
  • 您可以拥有多个数据库,具有多个模式(MySQL实际上只有一个数据库和多个模式)
  • 分区不同
  • MySQL interval与Postgres interval(时间间隔)
  • 隐式列重命名,Postgres需要AS
  • 无法在Postgres中同时更新多个表
  • Postgres功能很强大。所以没有CALL proc();;将proc()重写为函数SELECT proc();

答案 1 :(得分:9)

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

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

在操作上,您需要查看:

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

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

这些成本使得移动到不同的数据库对于大多数非常重要的应用而言过于昂贵。仔细考虑 非常 的好处,以及完成上述所有操作的巨大成本。

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

答案 2 :(得分:8)

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

另外,pgsql wiki上的Converting from MySQL to PostgreSQL

答案 3 :(得分:6)

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

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

安装
$ pip install py-mysql2pgsql

运行

$ py-mysql2pgsql

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

我必须安装argparse才能工作。

$ pip install argparse

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

$ py-mysql2pgsql

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

答案 4 :(得分: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标准,然后在运行应用程序时检查是否有任何警告。

答案 5 :(得分: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。