11月27, 2013

emlog从mysql转到pgsql的几点经验

小博是采用了emlog(php+mysql),最近一段时间打算使用postgres,所以决定把数据库从mysql转换到postgres。博客数据转换 过程比较简单,我会就过程碰到的问题 记录下来。

首先要安装postgres。我vps是centos6,官方源是9.1,这个版本足够体验。虽然默认安装了,但是需要配置一番,首先是把datadir放到数据盘上。所以要修改postgres.conf。还有一个是转换过程中需要支持远程用户连接,所以要改成支持远程用户连接到postgesql,建议新建一个用户支持远程连接。

下一步是如何把mysql的数据库的结构和数据转到postgres。这里我推荐一个收费软件(有试用期,也足够了),google下“DBConvert ”,官方下载连接:http://dbconvert.com/convert-mysql-to-postgresql-pro.php?DB=3。 其他工具可以参考:http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL

若要手工修改导入sql语句格式,工作量比较大,但可以研究下。使用工具转换数据很顺利,没有一点报错。接下来就是要修改一些程序。比如替换数据库实例,和limit语句。

emlog用的是mysql原生函数库,而且实例化是MySql::getInstance,不利于切换其他数据库。我很早就想使用PDO库做DAO,一来是方便切换到其他数据库,不用做太多修改,二是php5.5已经默认使用PDO了。

接触Postgres,才知道MySql也有它的局限性。Mysql的limit语句是limit start, num,而postgres 是limit num offset start,所以修改一些文件的查询语句 所在难免,工作量不大。Postgres支持复杂查询,字段值类型支持数组形式,是吸引我使用postgres的地方。

另外使用PDO中也觉得有些地方值得注意。使用Mysql查询的时候,想知道限定条件的查询返回的结果行数,即符合条件查询的行数,可以用 开启sql_cals_found_rows 进行select found_rows。参考

认真研究PDO类的用法(比如php手册下面的评论)总会有收获。

【更新】关于在pgsql插入的字符串含有转义符的数据,pgsql会报warning,而且会建议在值前面加个E,比如(e'xxx\'x',..。加个e固然好,但是不兼容其他数据库格式,所以只能从pg的设置入手。网上资料讲到:牵涉到参数+版本的问题。 有个参数standard_conforming_strings,说明大概意思如下:该参数如果为OFF,则PG认为不论在普通字符串还是转义字符串(e'...')中,\都是转义符。而 9.1版本及以后,该参数默认为on。所以解决以上的问题,可以设置set standard_conforming_strings=off;另外还有2个相关参数:backslash_quote--->单引号的转义escape_string_warning--->\的告警设置 值得注意。具体参考官方文档。