如果有一个列,如何从MySQL数据库迁移到PostgreSQL?

时间:2017-05-09 23:58:29

标签: mysql database postgresql

从最近几天起,我一直在尝试将MySQL数据库迁移到PotsgreSQL,但是有一个问题不能让我成功:有点专栏。

我尝试过不同的方法:首先我尝试使用pgloader,因为它看起来最简单,但我不知道如何为此编写脚本,所以我从网上做了一个例子:

load database
     from      mysql://dbu1:password@localhost/openbill
     into postgresql://dbu1:password2@localhost/openbill

 WITH include drop, create tables, no truncate,
      create indexes, reset sequences, foreign keys

  SET maintenance_work_mem to '128MB', work_mem to '12MB', search_path to 'openbill'

 CAST type datetime to timestamptz
                drop default drop not null using zero-dates-to-null,
      type date drop not null drop default using zero-dates-to-null

 -- Create the database in postgresql to import into. If your db already exist this can be skipped
 BEFORE LOAD DO
 $$ create schema if not exists openbill; $$

;

这个问题,是最后一行,我不知道如何更改openbill,并给了我错误,所以我试着删除它,但当然,因为它没有为导入创建了表。

经过很多麻烦之后,我尝试使用转储,为此,我认为有必要将sintaxis更改为与postgresql兼容,所以我找到了这样做的代码:https://github.com/lanyrd/mysql-postgresql-converter但是某种原因,当它到达带有位列的第一个表时会失败,更确切地说,不是在创建它时,而是在插入数据时,因为出于某种原因,这个位看起来像在sql上,它给了我错误

ERROR:  invalid byte sequence for encoding "UTF8": 0x00

我用:

生成了转储
mysqldump -h ip -u root -p --compatible=postgresql --default-character-set=utf8 database > database.sql

有谁知道如何解决这个问题?或者,如果有更好的方法进行迁移?

2 个答案:

答案 0 :(得分:0)

您应该将MySQL的bit类型转换为PostgreSQL的bit varying类型。

在MySQL中选择bit值时,它们默认显示为字符串(!),这可能会导致您看到错误消息:

root@lau56> SELECT id, val FROM bittest;
+----+-----+
| id | val |
+----+-----+
|  1 | ▒   |
|  2 |  ▒   |
+----+-----+
2 rows in set (0.00 sec)

您可以使用bin函数以二进制表示法显示它们:

root@lau56> SELECT id, bin(val) FROM bittest;
+----+------------+
| id | bin(val)   |
+----+------------+
|  1 | 1111111111 |
|  2 | 10101010   |
+----+------------+
2 rows in set (0.00 sec)

这将为PostgreSQL的bit varying数据类型生成有效输入。

答案 1 :(得分:0)

好吧,经过一些帮助,我找到了解决这个问题的方法。主要的问题是@Laurenz说的,它返回字符串而不是位,所以我使用了--hex-blob选项,并使用十六进制格式0x00而不是字符串生成转储。这有帮助,因为我没有看到很多正方形,而是能够看到十六进制,所以我使用了崇高的文本,选择了所有的0x00,并将其更改为各自的B'0',然后它没有问题。

这是我最后的转储字符串:

mysqldump -h ip -u root -p --compatible=postgresql --hex-blob --default-character-set=utf8 database > database.sql