如何将mysql转换为postgresql?

hbp*_*hbp 14 mysql postgresql linux

我正在拼命寻找一种转换工具来将大型 mysql 数据库转换为 postgresql。我需要的工具/脚本是:

  • 自由
  • 在 Linux 下工作
  • 使用简单,没有问题
  • 您实际上尝试并确认有效
  • 最好不是用 Java 或 Ruby 编写的

我尝试了此处列出的不同工具,但没有一个对我有用。

先感谢您。

a_h*_*ame 7

两种截然不同的数据库管理系统之间迁移需要大量的不仅仅是迁移数据。但是数据的迁移通常是最简单的部分。

我尝试过的方法是免费的,我可以确认它有效:

  • 创建一个 mysql 模式只转储
  • 使用文本编辑器和大量搜索和替换调整 SQL
  • 在 Postgres 中运行转换后的 SQL
  • 从 MySQL 创建纯文本转储(例如 CSV,或其他一些分隔格式)
  • 使用 PostgreSQL 的 COPY 命令导入数据

如果您依赖 MySQL 的行为来接受非法数据(例如 2 月 31 日),导入数据实际上可能会很困难

我的猜测是,这比搜索工具、评估一堆工具然后尝试理解您选择的工具要快。但这取决于您指的是哪种“大”。如果大是数百个表,这可能不可行。如果 big 仅指行数,那么这可能是最快的方法。

有一些工具可以以 DBMS 独立 (XML) 格式转储数据库模式,例如LiquibaseSchemaSpyWbSchemaReport。Liquibase 可能是最容易使用的。其他人将需要一些手动工作编写/扩展 XSLT 来转换生成的 XML。

如果您在 MySQL 中使用触发器和存储过程,我不相信会有任何自动化工具可以转换它们而无需事后进行重大的手动修复 - 然后生成的过程可能不会使用目标 DBMS 的任何高级功能.


DrC*_*sos 6

最近不得不这样做,因为寻找工具并能够用它做事需要很长时间,所以我用vim和substitution-foo手工完成了

  • 替换INT NOT NULL AUTO_INCREMENT(或类似的东西)SERIAL
  • 改变相关成everythig串TEXT(无速度差在使用TEXTVARCHAR或类似的)
  • 摆脱那些他妈的反引号`
  • Postgres 中没有存储引擎,所以删除ENGINE InnoDB(或其他)
  • 消除 UNSIGNED
  • 每个 BLOB 字段都是 BYTEA
  • 字符串使用单引号',没有别的
  • 如果你在某处使用字符串连接,请小心,从 9.1 开始,Postgres 支持CONCAT作为非标准字符串连接的后备,在 9.1 之前它是使用完成的 'string' || ' string'
  • 重新编写任何程序代码...
  • 注意保留的名称(例如表、名称等)以及大写名称。他们需要双引号"
  • 索引应该几乎相同,因为语法没有变化
  • 对于我忘记的所有内容,请查看有关此主题的 wikibooks

这些子弹中的每一个都应该用一个替换来完成。

我出口的模式和数据seperatly。确保使用INSERTs 而不是COPY. 如果没有花哨的东西,数据应该(几乎)不需要清理。确保一切正常UTF-8。使用 2 个单独的文件,架构变得更易于管理,您无需编辑 1GB 文件。

加载模式时,您会获得非常详细的错误信息,因此调试应该非常简单。