一、需求:postgresql 多台服务器: 10.x.x.162-168、10.x.x.13-16 等,由于资源有限,没有主备机制,所以要对SQL服务器的数据备份到另外的服务器保存。
二、解决问题
1、PostgreSQL 自带一个pg_dump的客户端,pg_dump和psql 命令都是先切换到postgres用户之后才能操作,使用 pg_dump 指令进行远程(10.x.x.162)备份:
pg_dump -a -t ${table} "host=10.x.x.162 hostaddr=10.x.x.162 port=5448 user=user password=password dbname=dbname " > ${bak_path}/${table}.sql.`date --date " -1 day " +%F` 2>&1 &
2、但是,会出现这样的问题:pg_dump客户端和 PostgreSQL 服务版本不一致,导致不能远程备份或者备份之后不能还原,加之我们 PostgreSQL 的服务器有很多台,并且版本不一,总不能为了每台SQL服务器去安装不同版本的pg_dump客户端吧。
3、后面想出一种办法,执行pg_dump的备份脚本可直接在SQL服务器上定时操作,备份下载的数据文件 scp 到另外一台服务器上保存着。由于是靠定时器操作的,scp 指令每次都要输入密码,从网上找了一些scp免密操作的方法,选择了sshpass工具来解决这一问题。
在SQL服务器上执行pg_dump,大致脚本:
#!/bin/bash bak_table_ary=(table1 table2) airport_code_ary=(pek pvg can szx kmg xiy sha ckg hgh nkg cgo pkx xmn tao wuh hak tsn hrb kwe syx she dlc tna nng foc lhw tyn khn cgq sjw hfe inc kwl ynt jjn xnn bav krl rlk wnz jhg ljg) function start_dump(){ code=${1} bak_path="/DATA/DataBackup/${code}" mkdir -p ${bak_path} echo "创建目录${bak_path}" for table in ${bak_table_ary[@]}; do echo "备份${code} ${table}" /usr/pgsql-10/bin/pg_dump -U ${code} -h 127.0.0.1 -p 5448 -t ${table} -f ${bak_path}/${table}.sql transfer_${code} done } #备份162 for code in ${airport_code_ary[@]}; do start_dump ${code} done
4、安装sshpass:
(1)sshpass下载
地址:http://sourceforge.net/projects/sshpass/
(2)上传到服务器,解压:tar -zxvf sshpass-1.06.tar.gz
(3)安装
cd sshpass-1.06
./configure --prefix=/opt/app/sshpass #指定安装目录
make
make install
sudo cp /opt/app/sshpass/bin/sshpass /usr/bin/ # sudo 输入当前登录账号的密码,避免直接使用root
(4)scp免密操作示例
远程文件复制到本机:sshpass -p ‘xxxxxx‘ scp -r devops@10.x.x.164:/DATA/DataBackup/* /DATA/DataBackup_162/2020-05-21/
本机文件复制到远程:sshpass -p ‘xxxxxx‘ scp -r /DATA/DataBackup_162/* devops@10.x.x.164:/DATA/app/
5、这里的定时需要在SQL服务器备份完成之后再进行操作,可估算时间操作。定时器和任务一致性我使用jenkins来控制,相比较crontab也方便很多。jenkins的配置很简单,创建一个任务,使用multijob 顺序执行就可以了。
定时器执行的scp脚本:
#!/bin/bash old_path="/DATA/DataBackup_162/`date -d "-7 days" "+%Y%m%d"`" new_path="/DATA/DataBackup_162/`date +%Y%m%d`" echo "创建目录 ${new_path}" mkdir -p ${new_path} echo "远程下载文件开始" sshpass -p ‘xxx‘ scp -r devops@10.x.x.162:/DATA/DataBackup/* ${new_path}/ echo "远程下载文件结束" echo "删除7天前的目录 ${old_path}" rm -rf ${old_path}