我正在考虑从MySQL切换到PostgreSQL。
使用PostgreSQL有什么提示,技巧和难题?
MySQLer应该注意什么?
另见:How different is PostgreSQL to MySQL?
另见:Migrate from MySQL to PostgreSQL
注意 - 我不认为这是重复的。特别是答案的类型非常不同,这里的答案有更多的实施细节,这正是我所寻找的
答案 0 :(得分:51)
我自己也经历过,好吧我还是......
INSERT IGNORE
和REPLACE
LOAD DATA INFILE
(COPY
已关闭,但距离不够近)autoincrement
更改为SERIAL
INNER JOIN
没有ON
条款是不可能发生的,请使用CROSS JOIN
之类的COUNT(*)
可能会发疯“interval
与Postgres interval
(时间间隔)AS
CALL proc();
;将proc()
重写为函数SELECT proc();
。答案 1 :(得分:9)
这将是一项艰巨的任务,因为您必须测试整个代码库 - 每个地方的每个查询
在操作上,您需要查看:
在考虑此类行动之前,您肯定必须进行大量的性能测试。
这些成本使得移动到不同的数据库对于大多数非常重要的应用而言过于昂贵。仔细考虑 非常 的好处,以及完成上述所有操作的巨大成本。
如果你花了不到三个月的时间,在一个非常重要的应用程序中,我将会感到惊讶,在此期间你将无法继续定期开发。
答案 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。