zoukankan      html  css  js  c++  java
  • 解决多台postgresql 数据备份的问题

    一、需求: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 &
    View Code

    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
    View Code

    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}
    View Code
  • 相关阅读:
    python流程控制
    数据类型
    python之初接触
    使用 HttpWebRequest 向网站提交数据
    在 ASP.NET MVC4 中使用 NInject
    第一篇 微信商城 开发前的准备工作
    (一)模块基础
    函数之递归、匿名函数及内置方法
    装饰器的使用原理
    mybatis返回list
  • 原文地址:https://www.cnblogs.com/mrsoft/p/12930822.html
Copyright © 2011-2022 走看看