从 MySQL 迁移到 PostgreSQL 的正确方法
迁移总是很麻烦,无论从哪个系统迁移到哪个系统。本文以从 MySQL 迁移到 PostgreSQL 为例,介绍了一些需要注意的事项。
为什么要迁移?
用户想要迁移的原因有很多,从 MySQL 迁移到 PostgreSQL 的主要原因包括以下几种:
- 性能原因
- 稳定性
- 可靠性
- GIS(地理信息系统)
- 复制问题
- 集群问题
- 高可用性问题
- 本地化/全球化问题
- 需要面向对象关系的特性
- 厌倦了 bug
- 许可证费用(双重许可证,GPL)
- 许可证(BSD 而不是 GPL)
检查迁移的必要性
首先,您应该检查迁移是否真的有必要。
假设您是一名在线游戏的开发者,您在三到五年前使用 MySQL 开发了这款游戏。最初一切运行良好,但现在您拥有超过一百万的用户和每秒 4000 个查询。您已经优化了 MySQL 所有可以优化的内容,但数据库服务器仍然经常出现问题。
请记住,PostgreSQL 也无法直接处理如此巨大的负载。您可能会遇到比 MySQL 更糟糕的问题,但问题仍然存在。您需要付出巨大的努力才能优化 PostgreSQL。这意味着您必须为 PostgreSQL 优化数据库,并为 PostgreSQL 优化整个源代码。这可能需要您花费半年的时间才能获得使用 PostgreSQL 的优势。
现在考虑一下游戏的生命周期。通常这类游戏的生命周期只有几年。您的游戏已经达到了生命周期的顶峰。它今年可能成为顶级的在线游戏,明年也可能,但不会更久了。所以,在这种情况下进行如此巨大的改变没有意义。
最好将旧游戏保留在旧系统上,并直接使用 PostgreSQL 开始新项目(新游戏)。
迁移需要多长时间?
仅仅将数据库转储并更改系统到 PostgreSQL 相关的 SQL 语句,然后将所有内容导入 PostgreSQL 通常是不够的。您可能会遇到与以前相同的问题,或者遇到不同但并不比旧问题更好的问题。如果您想要迁移以提升性能,您可能会发现 PostgreSQL 的性能甚至低于 MySQL。
这意味着您必须更改许多其他内容。我从未见过迁移时间少于 3 个月的。通常,您需要 3 个月到半年的时间才能使所有内容正常运行,并且您需要很幸运才能在新系统上顺利运行。
利用系统的优势
通常,当您想要迁移时,您是想利用系统的优势。PostgreSQL 与 MySQL 的优势不同,如果您想利用这些优势,您必须做一些不同的工作。让我举几个例子:
在 MySQL 中,您经常需要使用糟糕的数据库设计来避免连接和子查询(因为这里的性能很差)。索引只是基本实现。您需要不同的存储引擎来进行全文搜索和事务处理。触发器处理,尤其是触发器之前的处理,很丑陋且有 bug。过程和函数只能在 SQL 中实现。非空行为不熟悉。非 DDL/DCL 事务。没有检查约束。您经常会发现使用已知的 MySQL bug 的优势。
PostgreSQL 通过使用良好的数据库设计也具有出色的性能。连接和子查询运行速度很快。您可以选择几种索引算法,并且索引按预期工作。您在 DDL 索引方面也有很好的性能。您只有一个存储引擎。您不会遇到触发器、过程/函数方面的问题。您还可以用几乎任何语言编写过程/函数。非空行为很熟悉。您将拥有 DDL/DCL 事务和检查约束,并且目前 PostgreSQL 没有已知的 bug。您还可以根据需要创建规则以获得优势。
您会发现两种不同的理念:
MySQL 用户经常会说:将大部分数据库逻辑放入应用程序中。
PostgreSQL 用户经常会说:将数据库逻辑放入数据库中。
我个人的观点是:将数据库逻辑放入数据库中,无论使用哪个系统。不幸的是,由于缺少功能或其他缺点,有时您不得不将数据库逻辑放入 MySQL 应用程序中。
PostgreSQL 拥有许多功能,而 MySQL 甚至没有源代码。因此,如果您想获得迁移到 PostgreSQL 的优势,您应该利用这些功能。
MySQL 层级:数据库/模式 -> 表 -> 列
PostgreSQL 层级:数据库 -> 模式 -> 表 -> 列
如果您问 MySQL 的用户,他们通常会回答:我们的数据库不是真正的数据库。我们所说的数据库在 PostgreSQL 中等同于模式。PostgreSQL 所谓的数据库在 MySQL 中称为实例。
如果您问我或其他 PostgreSQL 用户,我们会回答:他们只是少了一个层级。数据库就是数据库,表就是表,他们只是没有模式层级。
无论如何,当您迁移时,您当然也可以使用这 4 个层级,而不仅仅是 3 个。
由于 MySQL 有很多 bug,您经常会在应用程序代码中找到解决 bug 的方法。当然,如果您想获得 PostgreSQL 的优势,就必须修复这些方法。
数据类型是下一个主题。MySQL 中的 timestamp 和 datetime 的工作方式与 PostgreSQL 中的 timestamp 不同。text/varchar/char 也不同。从性能方面来看,请记住,您无法在 MySQL 中对数据类型 text 使用索引。您可以在 PostgreSQL 中使用它们。同样,text、varchar 和 char 的性能不会有太大区别。
总结
要进行正确的迁移:
- 考虑数据库和设计。独立于现有内容思考。重新设计数据库,利用 PostgreSQL 的优势。
- 重新设计应用程序/软件
大量工作...
但这确实是迁移从 MySQL 到 PostgreSQL 的最佳方法。通常迁移是不划算的,最好留在 MySQL 上,只是用 PostgreSQL 设计新的/即将到来的项目。
如果盈利能力表明迁移有必要,并且您确实做了所有这些工作,那么您会很高兴,并且在不久的将来不会遇到进一步的问题。