从MySQL迁移到PostgreSQL
目前,我们正在将MySQL用于我们正在开发的产品,并且主要出于许可原因,希望尽快迁移到PostgreSQL。
还有其他人做过这样的举动吗?我们的数据库是应用程序的生命线,最终将存储TB的数据,因此我很想听听有关性能改进/损失,转换SQL和存储过程的主要障碍等方面的经验。
编辑:只是向那些问我们为什么不喜欢MySQL许可的人澄清。我们正在开发一种(当前)依赖于MySQL作为数据库后端的商业产品。他们的许可证规定,我们需要向他们支付每安装一次标价的百分比,而不是固定费用。作为一家初创企业,这没有吸引力。
解决方案
回答
史蒂夫,我不得不一直迁移我的旧应用程序,即PgSQL-> MySQL。我必须说,我们应该认为自己很幸运;-)
常见的陷阱是:
- SQL实际上非常接近于语言标准,因此我们可能已经知道了MySQL的方言
- MySQL悄悄地截断了超过最大长度的varchar,而Pg抱怨-快速的解决方法是将这些列作为'text'而不是'varchar'并使用触发器来截断长行
- 使用双引号代替反撇号
- 使用IS和IS NOT运算符比较布尔字段,但是仍然可以使用带有=和<>的MySQL兼容INT(1)
- 没有替换,请使用DELETE / INSERT组合
- Pg在强制执行外键完整性方面非常严格,因此不要忘记在引用上使用ON DELETE CASCADE
- 如果我们将PHP与PDO一起使用,请记住将一个参数传递给lastInsertId()方法-它应该是序列名,通常以这种方式创建:[tablename] _ [primarykeyname] _seq
我希望至少能有所帮助。与Postgres一起玩很开心!
回答
我做了类似的转换,但是出于不同的原因。这是因为我们需要更好的ACID支持,并且需要使Web用户能够通过其他数据库工具看到相同的数据(两个都有一个ID)。
以下是困扰我们的事情:
- MySQL并不像PostgreSQL那样严格执行约束。
- 有不同的日期处理例程。这些将需要手动转换。
- 任何不符合ACID标准的代码都可能是一个问题。
就是说,一旦安装到位并经过测试,它就会变得更好。出于安全原因和大量并发使用正确的锁定,PostgreSQL的性能优于MySQL。在不需要锁定(只读)的情况下,性能虽然不是很好,但是仍然比网卡快,因此这不是问题。
尖端:
- contrib目录中的自动化脚本是进行转换的良好起点,但通常需要对其进行一些操作。
- 我强烈建议我们将可序列化隔离级别用作默认设置。
- pg_autodoc工具可以很好地查看数据结构,并找到忘记定义和执行的任何关系。
回答
我们做了一个从MySQL3到PostgreSQL 8.2再到8.3的转变。 PostgreSQL具有SQL的基本知识以及更多其他知识,因此,如果MYSQL不使用奇特的MySQL东西,我们将可以。
根据我的经验,我们的MySQL数据库(第3版)没有外键... PostgreSQL让我们拥有外键,因此我们必须更改它...这是一件好事,但发现了一些错误。
我们必须更改的另一件事是在MySQL中与众不同的编码(C#)连接器。 MySQL版本比PostgreSQL版本更稳定。 PostgreSQL仍然有一些问题。