Linux Shell脚本之Atlassian confluence远程备份方法

注:Atlassian confluence是一个较专业的wiki程序,由java语言写成,,其详细介绍可以Google it(一点美中不足,java占用内存还是比较大的)。

该脚本的设计思路是根据Atlassian confluence官方提供的文档说明写的,主要是备份一些配置文件,上传的一些附件之类的其他文件以及数据库,其数据库支持多种数据库,这次我采用的是PostgreSQL数据库,你可以使用自己熟悉的数据库,如MySQL。

问题释疑:

1.为什么不使用rsync而是使用scp作为远程文件传输方法?

虽然rsync的设计算法(具体算法可以参考陈皓的博文《rsync 的核心算法》)决定了它更适合作为备份过程中的文件传输,例如支持增量备份和压缩传输,但Atlassian confluence备份并不要求具有实时性,而且在脚本中也做了历史备份的处理(自动删除10天前的备份),脚本中使用的备份方式相当于全备,而是不是增量备份,其次备份多在夜间执行,并且多为内网传输,及时Atlassian confluence放在阿里云上,也是有内网IP地址的,因此不用过度担心流量问题。

2.为什么要在备份机上执行该脚本?

其实这个脚本在备机还是Atlassian confluence机器上运行都是可以的,但是为了减少ssh执行远程命令的次数,将其放在备份机器上执行比较好一些。

3.find后的TODO是为啥?

在实际测试过程中发现,即使find没有进行任何删除操作,也会返回0,即成功。因此后面的校验和提示信息并不能完整的体现find的执行结果。如果日后有了更好的方法,再添加进去。

备份脚本如下:

#!/bin/bash# touch confluence_backup.sh# chmod +x confluence_backup.sh# vim confluence_backup.sh# crontabs — configuration and scripts for running periodical jobs# SHELL=/bin/bash# PATH=/sbin:/bin:/usr/sbin:/usr/bin# MAILTO=root# HOME=/# For details see man 4 crontabs# Example of job definition:# .—————- minute (0 – 59)# | .————- hour (0 – 23)# | | .———- day of month (1 – 31)# | | | .——- month (1 – 12) OR jan,feb,mar,apr …# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed# m h dom mon dow command# execute on 11:59 per sunday# 59 11 * * */0 $0 >/tmp/confluence_backup_$(date -d “yesterday” +”%Y%m%d%H%M%S”).log# or# execute on 23:59 per day# 59 23 * * * $0 >/tmp/confluence_backup_$(date -d “yesterday” +”%Y%m%d%H%M%S”).log# xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx# | ssh tunnel |# xxx.xxx.xxx.xxx <==========> xxx.xxx.xxx.xxx# | |# ———-+—————————–+——-# | |# +—–+—–+ +——+——+# | A | | B |# +———–+ +————-+ # gitlab server backups clinet## This shell script will execute on B Server# A and B passed ssh Authentication# A–>B: ssh lan_ip# A–>B: ssh wan_ip# B–>A: ssh lan_ip# B–>A: ssh wan_ip# A–>A: ssh lan_ip# A–>A: ssh wan_ip# B–>B: ssh lan_ip# B–>B: ssh wan_ip# run with root# [ $(id -u) -eq 0 ] || exit 1# Run as root, of course.[ $UID -eq 0 ] || ( echo “Must be root to run this script.” && exit 1 )# save 10 dayssave_days=10# which directory to backup tobackup_path=/data/confluence_backup_directory# make backups uniqure and backup per day# backup_path_time_uniq=$(date -d “yesterday” +”%Y%m%d%H%M%S”)backup_path_time_uniq=$(date -d “yesterday” +”%Y%m%d”)confluence_home_directory=/data/var/atlassian/application-data/confluence# if you have both wan ip and lan ip, you can fill it with all, if you have one ip, you can fill it just with lan ipconfluence_server_ipaddress_public=xxx.xxx.xxx.xxxconfluence_server_ipaddress_private=xxx.xxx.xxx.xxx# select lan ip first for transmission speedconfluence_server_hostname=${confluence_server_ipaddress_private:-$confluence_server_ipaddress_public}confluence_server_ssh_username=root#confluence_server_ssh_port=$(awk ‘/Port/ {print $2}’ /etc/ssh/sshd_config)confluence_server_ssh_port=$(netstat -anop | awk ‘/sshd/ && /LISTEN/ {print $4}’ | awk -F ‘:’ ‘{print $2}’)confluence_server_ssh_hostname=$confluence_server_hostname# which files and directory backup#backup_files=(confluence.cfg.xml attachments config index)backup_files=(confluence.cfg.xml attachments index)backup_files_num=${#backup_files[@]}[ -d $backup_path/$backup_path_time_uniq ] || mkdir -p $backup_path/$backup_path_time_uniq# do ssh copyfor (( i = 0; i < $backup_files_num; i++ )); do scp -r -P$confluence_server_ssh_port $confluence_server_ssh_username@$confluence_server_ssh_hostname:$confluence_home_directory/${backup_files[i]} $backup_path/$backup_path_time_uniq >/dev/null 2>&1 [ $? -ne 0 ] && echo “$confluence_home_directory/${backup_files[i]} Backup failed! ” && exit 1;echo “$confluence_home_directory/${backup_files[i]} Backup successfully! “done# excution postgresql dump# PostgreSQL 9.3.9 Documentation::31.14. Environment Variables# PGHOST=127.0.0.1# PGHOSTADDR=127.0.0.1# PGPORT=5432# PGDATABASE=confluence# PGUSER=confluence# PGPASSWORD=yoursecret# PostgreSQL 9.3.9 Documentation::31.15. The Password File#cat > ~/.pgpass <<eof#127.0.0.1:5432:confluence:confluence:yoursecret#eof# WARNING: password file “/root/.pgpass” has group or world access; permissions should be u=rw (0600) or less#chmod 600 /root/.pgpass#pg_dump -U confluence -d confluence -h 127.0.0.1 -o | head# Important: If your database schema relies on OIDs (for instance, as foreign keys) you must instruct pg_dump to dump the OIDs as well. To do this, use the -o command-line option.echo “PostgreSQL is executing backup operation, please hold on! “ssh -P$confluence_server_ssh_port $confluence_server_ssh_username@$confluence_server_ssh_hostname “pg_dump -U confluence -d confluence -h 127.0.0.1 -o >/tmp/tmp_confluence_postgresql.sql”[ $? -ne 0 ] && echo “PostgreSQL dump failed! ” && exit 1;echo “PostgreSQL dump successfully! “scp -P$confluence_server_ssh_port $confluence_server_ssh_username@$confluence_server_ssh_hostname:/tmp/tmp_confluence_postgresql.sql $backup_path/$backup_path_time_uniq/confluence_postgresql_$(date -d “yesterday” +”%Y%m%d”).sql >/dev/null 2>&1[ $? -ne 0 ] && echo “PostgreSQL file transmission failed! ” && exit 1;echo “PostgreSQL file transmission successfully! “# delete old backupsfind $backup_path -mtime +$save_days -exec rm -rf {} \;# TODO# returned code always is 0, from find or rm ???# how to express real result?[ $? -ne 0 ] && echo “Local expired backups remove skipped! “;echo “Local expired backups remove successfully! “

参考:

画龙画虎难画骨,知人知面不知心。

Linux Shell脚本之Atlassian confluence远程备份方法

相关文章:

你感兴趣的文章:

标签云: