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 触发,周期性使用:
创建 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
保存退出提交定时任务
#提交定时任务 crontab /path/to/rootcron
修改可执行权限
chmod +x /path/to/pg_backup.sh
其他 crontab 命令相关
#定时频率规则 参考 https://www.unix.com/man-page/linux/5/CRONTAB/ #查看当前定时任务 crontab -l #定时任务不会立刻执行,需要等待几分钟,如果需要立刻开始,可以restart crontab service cron restart #删除定时任务 crontab -e 选择编辑器,可以选择vim对应的编号 进入文件编辑,去除需要删除的定时任务对应行,保存文件退出