最近做的项目遇到一个问题,需要在Linux主机或者容器内(内网环境,无法联网下载postgresql资源),访问远程环境上主机或者容器部署的postgresql数据库,进行数据库数据备份和恢复。
我们知道,直接在部署了postgresql数据库的主机或者容器内,通过psql -U dbuser -d database就可以连接pg数据库,也可以直接使用pg_dump命令对数据库进行备份,以及其他数据库操作。但是在远程环境(未部署postgresql)使用psql、pg_dump命令则会报错:command not found。
下面介绍的方法是这几天为了解决这个问题找到最简单的方法,如果大家什么更好的方法欢迎评论区一起交流!
检查Linux和postgresql数据库版本
查看需要远程访问数据库的Linux主机版本:
cat /etc/system-release
在部署了postgresql的主机或者容器内连接数据库并查看版本号:
psql -U antdb -d postgres
select version();
下载rpm包
因为没办法联网下载安装,通过手工下载rpm包的方式来安装。
Postgresql-13 redhat Linux CentOS-8 x86的安装包地址:
https://download.postgresql.org/pub/repos/yum/13/redhat/rhel-8-x86_64/
不需要选太新的版本,避免和当前使用的版本不兼容。
我下载的是这个rpm包:postgresql13-13.3-1PGDG.rhel8.x86_64.rpm
按需安装
解压rpm包postgresql13-13.3-1PGDG.rhel8.x86_64.rpm:
rpm2cpio postgresql13-13.3-1PGDG.rhel8.x86_64.rpm | cpio -idmv
得到一个usr目录,拷贝其中的可执行文件psql和pg_dump到无法联网的Linux主机或者容器的/usr/local/bin目录:
cp usr/psql-13/bin/psql
试一下连接:
成功!
也可以通过下面命令远程连接数据库:
psql -U dbuser -d database -h ipaddr -p port
没问题哒!
试一下远程备份数据库:
pg_dump -U [用户名] -d [数据库名称] -t “[表名]” -f [备份文件名].dmp -h [ip] -p [port]
成功啦!
同理,Postgresql-13 redhat Linux CentOS-8 arm的安装包地址:
https://download.postgresql.org/pub/repos/yum/13/redhat/rhel-8-aarch64/
远程访问数据库免输密码
若数据库服务端的pg_hba.conf配置文件认证方式为”md5”或者”password”
则客户端连接数据库或者备份/恢复操作均需手动输入数据库密码:
访问数据库可以不输入密码进行操作的方法:
- 通过配置pg_hba.conf文件实现
增加一行:host all all 127.0.0.1/32 trust, 127.0.0.1替换成自己备份服务器的ip即可(trust认证方式表示无条件地允许联接,这个方法允许任何可以与PostgreSQL数据库联接的用户以他们期望的任意PostgreSQL数据库用户身份进行联接,而不需要口令) - 配置~/.pgpass
在~/目录下创建.pgpass文件并确保文件权限正确chmod 600 ~/.pgpass,按照host:port:dbname:username:password格式输入数据库所在服务器ip,端口号,数据库名称,用户名,密码。可以多行配置多个数据库连接信息(前提是该备份服务器ip已经按照1中的配置文件配置了允许访问数据库,认证方式为md5或者password) - 使用环境变量
在执行pg_dump命令之前,可以通过设置环境变量PGPASSWORD来提供密码:
export PGPASSWORD=“your_password”
pg_dump -U username -d database -h host -p port -f backup.dmp
1和2均需要修改pg_hba.conf配置文件,实际操作比较繁琐。
我们采用第3种通过在主机或者容器中设置环境变量的方法设置数据库密码,如下图所示:
到这里,我就可以在无法连接外网的Linux主机或者容器内部,无需输入数据库密码就可以远程连接postgresql数据库并且进行备份恢复操作了!