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 days
save_days=10

# which directory to backup to
backup_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 ip
confluence_server_ipaddress_public=xxx.xxx.xxx.xxx
confluence_server_ipaddress_private=xxx.xxx.xxx.xxx
# select lan ip first for transmission speed
confluence_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 copy
for (( i = 0; i < $backup_files_num; i++ )); do
	scp -r -P$confluence_server_ssh_port [email protected]$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 [email protected]$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 [email protected]$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 backups
find $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! "

参考:

Production Backup Strategy    https://confluence.atlassian.com/display/DOC/Production+Backup+Strategy    
Configuring Backups             https://confluence.atlassian.com/display/DOC/Configuring+Backups#ConfiguringBackups-EnablingBackupPathConfiguration    
Valid Backup File Date Patterns are based on the Java SimpleDateFormat class    http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

其他一些官方的建议和变量用词:

Perform_backups                     Enable  
BackupFilename(Sample)           backup-2015_08_17    
Backup File Prefix                     backup-    
Backup File Date Pattern           yyyy_MM_dd    
Backup Path                            /data/var/atlassian/application-data/confluence/backups    
Confluence Home directory        /data/var/atlassian/application-data/confluence/

tag:confluence备份脚本,confluence备份方法,如何备份confluence,远程备份confluence,远程备份脚本

--end--

时间: 2024-10-13 07:33:36

Linux Shell脚本之Atlassian confluence远程备份方法的相关文章

Linux Shell脚本Ldd命令原理及使用方法

1.首先ldd不是一个可执行程序,而只是一个shell脚本2.ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量如下:LD_TRACE_LOADED_OBJECTS.LD_WARN.LD_BIND_NOW.LD_LIBRARY_VERSION. LD_VERBOSE等.当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的 dependency,而程序并不真正执行.要不你可以在shell终端测试一下,如下:(1)

Linux shell脚本编程if语句的使用方法(条件判断)

if 语句格式if  条件then Commandelse Commandfi        别忘了这个结尾If语句忘了结尾fitest.sh: line 14: syntax error: unexpected end of fi     if 的三种条件表达式 ifcommandthen if 函数then 命令执行成功,等于返回0 (比如grep ,找到匹配)执行失败,返回非0 (grep,没找到匹配)if [ expression_r_r_r  ]then    表达式结果为真,则返回0

Linux Shell脚本之Gitlab远程备份

注:Gitlab是一个git服务程序,有web图形界面和一系列管理工具,具体详细介绍可以Google it. 这一篇可以说是上一篇<Linux Shell脚本之Atlassian confluence远程备份方法>的姊妹篇.其说明和原理是和上一篇是一样的,其核心原理都是core dump.scp.ssh和find+rm,但也有不同. 1.Gitlab本身提供了较好的备份方法,只是一个命令那么简单,并且它也支持远程备份(远程存储和云存储),例如它可以存储到aws的s3上. 2.本脚本运行在Git

LINUX SHELL脚本攻略笔记[速查]

Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述符和重定向 cat 数组和关联数组 alias date 调试脚本 函数和参数 管道 读取命令输出 read 字段分隔符和迭代器 循环 比较和测试 find xargs tr md5sum sha1sum 对目录进行校验 sort uniq tempfile split bash变量匹配切分 exp

shell脚本—根据文件个数定时备份

最近在了解Jenkins时,出现这样一个问题:linux ext3系统目录下的子目录个数不能超过31998个(参考:http://www.xshell.net/linux/1267.html),但jenkins在不停的编译版本时,有时候几个小时就创建了30000多个日志文件夹的目录,从而要随时的清理此文件夹下的目录.于是就写了个脚本来实现自动备份功能.由于很久没有接触过shell,所以花了一天来实现,比较汗颜!主要是对shell的格式,语法之类的不是很了解,在网上找了些资料,边写边调试!废话不多

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

Linux shell 脚本实例【转】

1. 写一个脚本,利用循环计算10的阶乘#!/bin/shfactorial=1for a in `seq 1 10`do       factorial=`expr $factorial \* $a`doneecho "10! = $factorial" 2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值.直到用户输入"end"停止.#!/bin/shuns

Linux Shell脚本攻略(1.10)

1.10 获取.设置日期和延时 很多应用程序需要以不同的格式打印日期.设置日期和时间.根据日期和时间执行某项操作.延时通常用于在程序执行过程中提供一段等待时间(比如1秒).同样的,我们也能够一多种格式打印日期,或者在命令行中设置日期.在类Unix系统中,日期被存储为一个整数,其大小为自世界标准时间起所流逝的秒数.这种计时方式称为纪元时或Unix时间. 1.10.1 获取.设置时间 以下的程序给出了多种用法: #!/bin/bash start=$(date +%s) #获取纪元时间 date #

Linux Shell脚本攻略(1.8)

1.8 使用别名 linux中的别名就相当于windows中的快捷方式,使用别名可以省去用户输入一长串命令序列的麻烦. 1.8.1 创建临时别名(快捷方式) alias new_command='command sequence' #格式说明 alias install='sudo apt-get install' #实例说明 在声明 install='sudo apt-get install'之后,就可以用install代替'sudo apt-get install'了.使用这种方式声明的别名