阿里云在三个月前上线了postgreSQL的rds,我一直用python做后端,python社区中,尤其DJango的官方推荐psql;而且之前也对mysql的不同的引擎颇为不耐烦,经过一些尝试之后,我打算基本上一直使用psql来做数据库。
话说在墙的影响下,AWS的rds的速度实在是有影响,再加上国内的AWS的技术支持体系还不是太了解,我当时已经倾向于把服务器全部使用阿里云。AWS给我的印象其实是很好的,但是有次跟国内的AWS技术服务团队沟通过一次之后,发现可能他们还没有完全的本地化,我说的本地化是指那种贴心的客户服务、快速的响应时间、以及合理的市场推广模式。经过一些对比之后,我已经把AWS的服务器停掉了,换成了阿里云的。唯一的问题是rds,我不希望使用当时阿里云仅有的mysql,于是后来阿里云上了postgreSQL的rds之后,我就把AWS的rds迁移过来了。
当时迁移的方法是用了pg_dump, 把所有的数据库关系转换为文本结构的sql语句,之后再导入到aliyun rds上。
那么接着是经过了一些权衡,我认为aliyun rds的价格有些高,基础的配置每月要160元,于是准备停掉一台这样的rds。问题是我的aliyun ecs里面的psql是8.4版本的,aliyun rds上的psql是9.4版本的,我自己的本地的电脑里面有9.3版本的,结果是两个低版本的pg_dump都无法备份高版本的数据。那么我开始找方法去解决问题。
没有谷歌的情况下,只能将就着用bing,极其无奈,效果并不好。
1. 首先查到的思路是可以给pg_dump命令增加--ignore-version来忽略不同版本间的差异。尝试去用了却报错,查了文档后发现这个选项已经过期作废掉了。
2. 接着,就只好往新安装psql到电脑上的思路去走。年月久远,都不知道自己的电脑上的postgreSQL当初是怎样安装的,后来发现果然其中有曲折。我先dump出来自己之前建立的本地的一个pg的数据库,以免升级时出问题。
接着从搜索安装pg的思路,发现在mac下最好的方式是下载postgresql.app, 看了文档后决定替换掉原来的9.3,于是替换之后,发现旧的app的文件夹全部删除,竟然也没有经过Trash,估计是在内部替换时直接rm -rf掉了。也庆幸之前dump过本地的那个数据库,否则就完全没有痕迹了。
假如当时保留了两个app,我其实可以通过pg_upgrade把9.3的数据转换为9.4的数据,只是现在没有这个机会了。
接着增加了系统的PATH,把9.4的bin的路径添加了进去。发现竟然系统里面的psql命令还是指向9.3的版本的。根据我对Linux的理解,一定是在某个地方有着明确的设置的,同时也有明确的9.3版本的程序还存在。于是查看了psql指向的地址/usr/local/bin/psql, 发现它是链接到Cellar这个文件夹下面文件。查询Cellar发现是homebrew的安装文件夹。
好了,原来我的系统里面曾经装过两个psql,一个是通过brew安装的,另外一个是通过postgresql app安装的,而我系统里面一直在用的是brew安装的那个。那么接着就开始卸载brew的这个版本里面的pg。
第一次没有成功,发现是brew的script里面的ruby的路径出错了,可能是之前某次系统更新,某个路径发生了变化,改了之后就好用了。于是brew uninstall postgresql,之后因为PATH中已经添加过的路径,新版的9.4的pg已经可以使用了。
当然,为了赶在aliyun rds关停我的数据库前尽快解决问题(当时还剩一小时到期),在处理两个pg版本之前,已经通过绝对路径使用了新版的9.4的pg_dump先把数据备份了下来,之后就可以放心地去配置自己的电脑了。
涉及到的主要命令:
/Applications/Postgres.app/Contents/Versions/9.4/bin/pg_dump --file=ali-rds-dump-v1.sql --host=xxx.pg.rds.aliyuncs.com -i --port=3432 --username=xxx dbname