XSwitch运维手册

数据库备份

XSwitch 使用的数据库是 Postgres,我们写了 2 个脚本用来备份和恢复 Postgres。

2 个脚本可以放在一个文件夹中,执行bash pg_backup.sh 会在当前目录下生成一个带日期的 dump 数据库备份文件。

需要恢复的时候执行 bash pg_restore.sh -p xxxx.dump 就可以了。

备份脚本 pg_backup.sh:

#!/bin/bash
#----------------------pg_backup.sh-----------------------------
#运行此脚本,将会把容器xswitch-pg的数据,导出为dump格式的备份文件
#导出的dump格式文件可以通过脚本pg_restore.sh -p xxx.dump恢复
#导出的dump备份文件可以在此脚本后面追加scp或rsync备份到远程服务器
#----------------------------------------------------------------

#备份的文件夹
backup_dir=/opt/xswitch_sql_bak


if [[ ! -d $backup_dir ]];then mkdir -p $backup_dir;fi


function del_old_sql_bak(){

  today=$(date +%Y%m%d)
  savedays=$1

  bak_files=$(ls -1 $backup_dir | grep "dump$")

  for item in $bak_files
    do
      bakday=$(echo $item|cut -d "_" -f 2)
      diffday=$(date -d "$today-${savedays}day" '+%Y%m%d')

      if [[ $diffday > $bakday ]] ;
      then
        echo "delete old bak $item!!!"
        rm -f $backup_dir/$item
      fi

    done

}



TIME_EXT=$(date +%Y%m%d)_$(date +%H%M)
dumpFile="xswitch_$TIME_EXT.dump"

#备份数据库文件
docker exec xswitch-pg su - postgres -c "pg_dump -Fc xui -f /tmp/${dumpFile}"

#数据库文件导出容器外
docker cp xswitch-pg:/tmp/${dumpFile} $backup_dir/${dumpFile}

#删除容器内,数据库文件
docker exec xswitch-pg su - postgres -c "rm /tmp/${dumpFile}"

#只保留30天的备份
del_old_sql_bak 30

恢复脚本 pg_restore.sh:

#!/bin/bash
#---------------------pg_restore.sh------------------------
#使用 pg_backup.sh //导出xswitch-pg的dump格式数据库备份文件
#使用pg_retore.sh -p xxx.dump  // 恢复数据库
#----------------------------------------------------------



dumpFile='/tmp/xswitch.dump'
function docker_exec_sql(){

        e="docker exec  xswitch-pg su - postgres -c ""\"psql -c ""\\\"$1\\\""'"'
        eval ${e}
}

function docker_exec(){

        e="docker exec  xswitch-pg su - postgres -c \"$1\""
        eval ${e}
}


case "$1" in
    -p)
        echo "dumpFile path is $2"
        file_type=$(file --mime-type $2|grep "text/plain"|wc -l)
        docker cp $2 xswitch-pg:$dumpFile
        ;;

    *)
    	echo "Please enter -p to load the SQL backup file"
    	exit 1
    	;;
esac


# 判断用户xui是否存在,不存在则创建
result=$(docker_exec_sql "SELECT u.usename FROM pg_catalog.pg_user u where u.usename='xui';")
usename=`echo $result | awk -F' ' '{print $3}'`
if [ "${usename}" = "(0" ]; then
    docker_exec_sql "create user xui password 'xui';"
fi


dbname=$(docker_exec "psql -lqt | cut -d \| -f 1 | grep 'xui'")

if [ -z ${dbname} ]; then
    #新建数据库
    docker_exec_sql "create database xui owner 'xui';"
    docker_exec "pg_restore -d xui ${dumpFile}"

else
    TIME_EXT=$(date +%Y%m%d)_$(date +%H%M)
    #备份本机数据
    docker_exec "pg_dump -c -Fc xui -f /tmp/xswitch_$TIME_EXT.backup.dump"


    #恢复备份,若恢复远程备份报错,则恢复本机备份
	if [  ${file_type} -eq 0 ];then
		echo "sql backup file  type  application/octet-stream"
		docker_exec "pg_restore -c -d xui ${dumpFile} 2> /tmp/error.log"

	else
		echo "sql backup file  type  text/plain"
		docker_exec "psql -d xui -f ${dumpFile} 2> /tmp/error.log"

	fi

 	error=$(docker_exec "cat /tmp/error.log|wc -l")
    if [ ${error} != 0 ]; then
        #恢复本机备份
        docker_exec "pg_restore -c -d xui /tmp/xswitch_$TIME_EXT.backup.dump"
        docker_exec "rm /tmp/xswitch_$TIME_EXT.backup.dump"
    else
    	echo "Recovery Complete!"
    fi
fi

设置 crontab 计划,定时备份数据

通过 crontab 触发,周期性使用:

  1. 创建 cron 文件

    vi /path/to/rootcron

     # 根据根据需要修改执行的频率
     # 每天0点0分执行一次,将打印重定向到/dev/null,不保存输出
     0 0 * * * /path/to/pg_backup.sh > /dev/null 2>&1
     # 如果需要调试查看查看log,可以参考下面格式,将打印输出到文件进行查看
     # 0 0 * * * /path/to/pg_backup.sh > /path/to/mylog.log 2>&1
    

    wq 保存退出

  2. 提交定时任务

    #提交定时任务
    crontab /path/to/rootcron
    
  3. 修改可执行权限

    chmod +x /path/to/pg_backup.sh
    
  4. 其他 crontab 命令相关

    #定时频率规则
    参考 https://www.unix.com/man-page/linux/5/CRONTAB/
    
    #查看当前定时任务
    crontab -l
    
    #定时任务不会立刻执行,需要等待几分钟,如果需要立刻开始,可以restart crontab
    service cron restart
    
    #删除定时任务
    crontab -e
    选择编辑器,可以选择vim对应的编号
    进入文件编辑,去除需要删除的定时任务对应行,保存文件退出
    
检查列表