环境:
数据库版本:postgresql 9.5
操作系统A:linux 4
操作系统B:linux 5.8
操作内容:
将部署在服务器A(*.*.201.210)上的PG9.5软件及数据库数据,迁移到服务器B(*.*.188.197)的相同目录。
步骤:
一、源端PG软件及数据库处理
1、停源端服务
首先关闭A中的postgresql服务
[postgres@Amdocs1 ~]$ pg_ctl stop -m fast
2、压缩PGHOME和PGDATA
关闭服务器之后返回root目录直接将PGHOME(软件) 和PGDATA(数据库)进行压缩
[root@Amdocs1 app]# tar zcvf appbackup.tar.gz /app/postgresql/pg951
[root@Amdocs1 app]# tar zcvf databackup.tar.gz /app/pgdata/pg951date
3、复制至目标端
将两个压缩包上传到服务器B上即可:
[root@Amdocs1 app]# scp appbackup.tar.gz root@*.*..188.197:/xxxx
[root@Amdocs1 app]# scp databackup.tar.gz root@*.*..188.197:/xxxx
4、复制类库
PG源码安装时会编译类库libreadline.so.4至OS层的/usr/lib64(注意区分32位或64位),直接复制安装时需要复制此类库,否则数据库无法启动见后报错处理部分
#cd /usr/lib64
#scp libreadline.so.4.3 libreadline.so.4 root@*.*.188.197:/usr/lib64/
二、目标端服务器操作
1、创建用户
在服务器B上创建postgres用户
#useradd postgres
2、设置用户环境变量
登录postgres用户配置环境变量
#vi .bash_profile (内容配成和服务器A一样,注意路径)
3、压缩包解压
将两个压缩包解压(注意目录结构与源服务器相同)
#tar zxvf appbackup.tar.gz
#tar zxvf databackup.tar.gz
注意相关文件用户权限与源端保持一致
4、PG启动服务
[postgres@lsrac97 ~]$#pg_ctl start
[postgres@lsrac97 ~]$ psql
psql (9.5.1)
Type "help" for help.
postgres=#
成功启动服务,至此常规PG9.5迁移完成。
附录:
一、报错处理
1、PG启动服务报错
[postgres@lsrac97 ~]$#pg_ctl start
Pg_ctl:error while loading shared libraies:libreadline.so.4 :cannot open share.....
缺少PG类库在PG源码安装时,编译至OS层的/usr/lib64,注意区分32位或64位。
解决方法:服务器A中把这个有问题的文件直接复制过来即可
#scp libreadline.so.4.3 libreadline.so.4 root@172.19.188.197:/usr/lib64/
#pg_ctl start
[postgres@lsrac97 ~]$ psql
psql (9.5.1)
Type "help" for help.
postgres=#
成功启动服务
二、PYTHON扩展的处理(可选)
1、PYTHON语言扩展
迁过来之后编译数据库中的plpython函数发现plpython函数无法使用报错
ERROR: could not load library "/app/postgresql/pg951/lib/plpython2.so": libpython2.3.so.1.0:无法打开共享对象文件:没有那个文件或目录
解决方法:将服务器A中的libpython2.3.so.1.0 cp到服务器B对应目录当中
Copy过来之后重新编译函数 报错
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
并且提示找不到相关python模块
此时服务器A上面的python是2.3.4的服务器B的版本是2.7.10的 编译plpython插件的时候使用的是2.3.4移到2.7.10可能因为版本不同出现问题
解决方法: 重装目标B服务器python和pl/python插件
重装python:
在官网上下载了python2.7.12
地址:https://www.python.org/getit/
将安装包上传到服务器B中并解压 解压后会生成目录Python-2.7.12
进入目录编译安装
#./comfigure --prefix=/opt/python2.7.12 --enable-shared #注意这个参数一定要带
#make
#make install
---完成。
如果在编译postgresql源码包./configure --prefix=xxxxx --with-python时候报错如下的时候则必须要重装python,否则不用重装,报错如下:
Error:cannot build pl/python because libpython is not a shared library(原因是python安装编译时候没有带参数--enable-shared 这个参数是./configure的一个参数表示启用动态库版本)
重装plpythonu
1、删除原有plpythonu扩展
接着登录pgadmin直接把这个扩展给删除
然后
[root@lsrac97 plpython]# cd /app/postgresql/pg951/lib
把 plpython2.so 文件给删除
做完这几步操作之后进入plpython源码目录
2、下载安装plpythonu扩展
下载postgresql源码包
地址:https://www.postgresql.org/download/
解压后进入与源码目录
[root@lsrac97 app]# cd postgresql-9.5.1
编译:
#./configure --prefix=/app/postgresql/pg951 --with-python
#make
[root@lsrac97 app]# cd postgresql-9.5.1/src/pl/plpython/
#make install
然后psql登录数据库创建扩展
# create extension plpythonu;
最后成功编译plpython函数
oracle_fdw扩展修复
由于oracle_fdw使用了oracle的动态库 ,而在服务器A中ORACLE的版本是10G的服务器B中的ORACLE版本是11g的所以在使用的时候后有以下错误
ERROR: could not load library "/app/postgreSQL/lib/oracle_fdw.so": libclntsh.so.11.1: cannot open shared object file: No such file or directory
这个时候到服务器B的ORACLE_HOME/lib目录下把libclntsh.so.11.1拷贝到PGHOME/lib目录下面并将libclntsh.so.11.1 属主chown为postgres
修复后查询外部表
postgres=# select * from PGTEST;
ERROR: error connecting to Oracle: OCIEnvCreate failed to create environment handle
DETAIL:
此时检查postgres用户环境变量里面有没有配有oracle的环境变量
检查发现已配置。
后将postgres用户所属组改为和oracle同组oinstall即可
[postgres@lsrac97 ~]$ id
uid=54326(postgres) gid=26(postgres) groups=26(postgres)
[root@lsrac97 ~]# usermod -g oinstall postgres
[root@lsrac97 ~]# su - postgres
[postgres@lsrac97 ~]$ id
uid=54326(postgres) gid=54321(oinstall) groups=54321(oinstall)
登录查询外部表即可