├── README.md ├── mongo ├── bin │ └── backup.sh └── conf │ ├── backcron │ └── backup.conf └── mysql ├── bin └── backup.sh └── conf ├── backcron └── backup.conf /README.md: -------------------------------------------------------------------------------- 1 | ### 安装压缩工具 2 | 3 | ```bash 4 | yum -y install bzip2 5 | ``` 6 | 7 | 8 | 9 | ### 安装[percona-xtrabackup](https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html) 10 | 11 | xtrabackup8 适用于 mysql8 12 | 13 | ``` 14 | sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm 15 | 16 | sudo percona-release enable-only tools 17 | 18 | sudo yum install percona-xtrabackup-80 19 | ``` 20 | 21 | 22 | 23 | 24 | 25 | ### 安装ossutil工具 26 | 27 | 28 | ```bash 29 | # 下载并安装 30 | curl -L http://gosspublic.alicdn.com/ossutil/1.6.9/ossutil64 -o /usr/local/bin/ossutil64 31 | 32 | # 添加执行权限 33 | chmod +x /usr/local/bin/ossutil64 34 | 35 | #查看版本 36 | ossutil64 -v 37 | ``` 38 | 39 | 40 | 41 | ### 配置ossutil文件 42 | 在配置文件`conf/backup.conf`中添加ossutil信息 43 | ``` 44 | ### oss-config 45 | # 阿里云OSS Bucket 46 | oss_bucket = test-data-backup 47 | # 自定义一个命名空间 48 | oos_namespaces = test 49 | # 阿里云OSS Endpoint 50 | oss_endpoint = oss-cn-shenzhen-internal.aliyuncs.com 51 | # 阿里云OSS AccessKeyId 52 | oss_accesskeyid = LTAI3Fm7GEQca5BTBK8Bhqea 53 | # 阿里云OSS AccessKeySecret 54 | oss_accesskeysecret = jCPQ2cgJz3ZfBoc3btdCn2uHgPDdcl 55 | # 阿里云ossutil命令路径 56 | ossutil_bin = /usr/local/bin/ossutil64 57 | ``` 58 | ossutil具体使用方法可查看[官方文档](https://help.aliyun.com/document_detail/50452.html) 59 | 60 | 61 | 62 | 63 | 64 | ### 使用方法 65 | 66 | 67 | 68 | #### 克隆脚本到本地 69 | 70 | ```bash 71 | git clone https://github.com/jayknoxqu/database-backup.git /usr/local/database-backup 72 | ``` 73 | 74 | 75 | 76 | #### 赋予脚本执行权限 77 | 78 | ```bash 79 | chmod +x $(find /usr/local/database-backup -name '*.sh') 80 | ``` 81 | 82 | 83 | 84 | #### 使用`crontab -e`编辑定时任务 85 | 86 | ``` 87 | # 每天凌晨3点15分执行备份mongodb 88 | 15 3 * * * /usr/local/database-backup/mongo/bin/backup.sh >/dev/null 2>&1 89 | 90 | # 每天凌晨4点15分执行备份mysql 91 | 15 4 * * * /usr/local/database-backup/mysql/bin/backup.sh >/dev/null 2>&1 92 | ``` 93 | 94 | 95 | 96 | ### 恢复备份文件 97 | 98 | 99 | 100 | ##### (1)停止MySQL 服务 101 | 102 | ```sh 103 | systemctl stop mysqld 104 | ``` 105 | 106 | 107 | 108 | ##### (2)备份数据目录 109 | 110 | ```sh 111 | mv /var/lib/mysql /var/lib/mysql-bak 112 | ``` 113 | 114 | 115 | 116 | ##### (3)新建数据目录 117 | 118 | ```sh 119 | mkdir -p /var/lib/mysql 120 | ``` 121 | 122 | 123 | 124 | ##### (4)准备全量备份的数据 125 | 126 | ```shell 127 | xtrabackup --prepare --apply-log-only --target-dir=/mnt/backups/mysql/full_2021-08-23_04-15-01_1 128 | ``` 129 | Tip:参数`--defaults-file=/etc/my.cnf`可指定mysql的配置文件,它会读取mysql数据的目录和binlog目录 130 | 131 | 132 | 133 | ##### (5)合并增量备份的数据 134 | 135 | ```shll 136 | xtrabackup --prepare --apply-log-only --target-dir=/mnt/backups/mysql/full_2021-08-23_04-15-01_1 --incremental-dir=/mnt/backups/mysql/incr_2021-08-24_04-15-01_2 137 | ``` 138 | Tip:多份增量备份的数据重复执行合并操作即可 139 | 140 | 141 | 142 | ##### (6)准备合并之后的数据 143 | 144 | ```shell 145 | xtrabackup --prepare --target-dir=/mnt/backups/mysql/full_2021-08-23_04-15-01_1 146 | ``` 147 | 148 | 149 | 150 | ##### (7)恢复备份数据 151 | 152 | ```shell 153 | xtrabackup --copy-back --target-dir=/mnt/backups/mysql/full_2021-08-23_04-15-01_1 154 | ``` 155 | 156 | 157 | 158 | ##### (8) 赋予文件夹权限 159 | 160 | ```shell 161 | chown -R mysql:mysql /var/lib/mysql 162 | ``` 163 | 164 | 165 | 166 | ##### (9) 启动数据库服务 167 | 168 | ```shell 169 | systemctl start mysqld 或者 /usr/sbin/mysqld --user=mysql & 170 | ``` 171 | -------------------------------------------------------------------------------- /mongo/bin/backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # ============================================================================== 3 | # Author : Jayknoxqu 4 | # Email : jayknoxqu@gmail.com 5 | # Date : 2019.12.18 6 | # Version : 1.0.0 7 | # Description : This script is backup mongodb databases and upload to aliyun oss 8 | # ============================================================================== 9 | 10 | # 备份日期 11 | backup_date=$(date +%F) 12 | # 备份时间 13 | backup_time=$(date +%H-%M-%S) 14 | # 备份时的周几 15 | backup_week_day=$(date +%u) 16 | 17 | # 获得程序路径名 18 | program_dir=$(dirname $0)/.. 19 | # 日志文件目录 20 | logs_dir=$program_dir/logs 21 | 22 | # 读取配置文件中的所有变量值, 设置为全局变量 23 | conf_file="$program_dir/conf/backup.conf" 24 | # mongodb IP地址或域名 25 | host=$(sed '/^host\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 26 | # mongodb 端口号 27 | port=$(sed '/^port\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 28 | # mongodb 用户 29 | username=$(sed '/^username\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 30 | # mongodb 密码 31 | password=$(sed '/^password\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 32 | # mongodump 附加参数 33 | params=$(sed '/^params\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 34 | # mongo 备份目录 35 | backup_dir=$(sed '/^backup_dir\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 36 | # 备份文件保留天数 37 | retain_days=$(sed '/^retain_days\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 38 | # mongodump命令路径 39 | mongodump_bin=$(sed '/^mongodump_bin\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 40 | # mongo 全备前缀标识 41 | full_backup_prefix=$(sed '/^full_backup_prefix\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 42 | # 备份错误日志文件 43 | error_log=$logs_dir/$(sed '/^error_log\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 44 | 45 | # 阿里云OSS Bucket 46 | oss_bucket=$(sed '/^oss_bucket\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 47 | # 自定义一个命名空间 48 | oos_namespaces=$(sed '/^oos_namespaces\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 49 | # 阿里云OSS Endpoint 50 | oss_endpoint=$(sed '/^oss_endpoint\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 51 | # 阿里云OSS AccessKeyId 52 | oss_accesskeyid=$(sed '/^oss_accesskeyid\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 53 | # 阿里云OSS AccessKeySecret 54 | oss_accesskeysecret=$(sed '/^oss_accesskeysecret\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 55 | # 阿里云ossutil命令路径 56 | ossutil_bin=$(sed '/^ossutil_bin\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 57 | 58 | # 创建相关文件 59 | mkdir -p $logs_dir $backup_dir 60 | 61 | # 全量备份 62 | function full_backup() { 63 | backup_name=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day} 64 | 65 | $mongodump_bin \ 66 | --host $host --port $port --username $username --password $password \ 67 | --gzip $params --archive >$backup_dir/${backup_name}.archive.gz \ 68 | 2>$logs_dir/${backup_name}_backup.log 69 | 70 | return $? 71 | } 72 | 73 | # 发送备份到远程 74 | function send_backup_to_remote() { 75 | backup_name=${1}_${backup_date}_${backup_time}_${backup_week_day} 76 | 77 | $ossutil_bin \ 78 | cp $backup_dir/${backup_name}.archive.gz \ 79 | oss://$oss_bucket/$oos_namespaces/mongo/archives/${backup_name}.archive.gz \ 80 | -f -e $oss_endpoint -i $oss_accesskeyid -k $oss_accesskeysecret \ 81 | >$logs_dir/${backup_name}_upload.log 2>&1 82 | 83 | } 84 | 85 | # 删除之前的备份(一般在全备完成后使用) 86 | function delete_before_backup() { 87 | 88 | # 删除n天前的备份日志 89 | find $logs_dir -name '*.log' -mtime +$retain_days -delete 90 | 91 | # 删除n天前的备份文件 92 | find $backup_dir -name '*.archive.gz' -mtime +$retain_days -delete 93 | 94 | } 95 | 96 | # 记录错误消息到文件 97 | function logging_backup_err() { 98 | echo "{week_day:$backup_week_day, \ 99 | dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \ 100 | type:${1}, \ 101 | date:${backup_date}}" >>$error_log 102 | } 103 | 104 | # 清空错误日志信息 105 | function purge_err_log() { 106 | : >$error_log 107 | } 108 | 109 | 110 | # 测试配置文件正确性 111 | function test_conf_file() { 112 | # verify mongo-config 113 | if [ -z "$host" ]; then 114 | echo 'fail: configure file host not set' 115 | exit 2 116 | fi 117 | if [ -z "$port" ]; then 118 | echo 'fail: configure file port not set' 119 | exit 2 120 | fi 121 | if [ -z "$username" ]; then 122 | echo 'fail: configure file username not set' 123 | exit 2 124 | fi 125 | if [ -z "$password" ]; then 126 | echo 'fail: configure file password not set' 127 | exit 2 128 | fi 129 | if [ -z "$full_backup_prefix" ]; then 130 | echo 'fail: configure file full_backup_prefix not set' 131 | exit 2 132 | fi 133 | if [ -z "$error_log" ]; then 134 | echo 'fail: configure file error_log not set' 135 | exit 2 136 | fi 137 | if [ -z "$backup_dir" ]; then 138 | echo 'fail: configure file backup_dir not set' 139 | exit 2 140 | fi 141 | if [ -z "$retain_days" ]; then 142 | echo 'fail: configure file retain_days not set' 143 | exit 2 144 | fi 145 | if [ -z "$mongodump_bin" ]; then 146 | echo 'fail: configure file mongodump_bin not set' 147 | exit 2 148 | fi 149 | 150 | # verify oss-config 151 | if [ -z "$oss_bucket" ]; then 152 | echo 'fail: configure file oss_bucket not set' 153 | exit 2 154 | fi 155 | if [ -z "$oos_namespaces" ]; then 156 | echo 'fail: configure file oos_namespaces not set' 157 | exit 2 158 | fi 159 | if [ -z "$oss_endpoint" ]; then 160 | echo 'fail: configure file oss_endpoint not set' 161 | exit 2 162 | fi 163 | if [ -z "$oss_accesskeyid" ]; then 164 | echo 'fail: configure file oss_accesskeyid not set' 165 | exit 2 166 | fi 167 | if [ -z "$oss_accesskeysecret" ]; then 168 | echo 'fail: configure file oss_accesskeysecret not set' 169 | exit 2 170 | fi 171 | if [ -z "$ossutil_bin" ]; then 172 | echo 'fail: configure file ossutil_bin not set' 173 | exit 2 174 | fi 175 | } 176 | 177 | # 执行 178 | function main() { 179 | # 检测配置文件值 180 | test_conf_file 181 | 182 | # 全量备份 183 | full_backup 184 | backup_ok=$? 185 | if [ 0 -eq "$backup_ok" ]; then 186 | # 全备成功,将tar备份发送到远程 187 | send_backup_to_remote $full_backup_prefix 188 | # 清除之前的备份 189 | delete_before_backup 190 | else 191 | # 全备失败,删除备份文件 192 | rm -f ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}.archive.gz 193 | # 记录错误日志 194 | logging_backup_err $full_backup_prefix 195 | fi 196 | 197 | } 198 | 199 | main 200 | -------------------------------------------------------------------------------- /mongo/conf/backcron: -------------------------------------------------------------------------------- 1 | # 每天凌晨3点15分执行备份 2 | 15 3 * * * /usr/local/database-backup/mongo/bin/backup.sh >/dev/null 2>&1 3 | -------------------------------------------------------------------------------- /mongo/conf/backup.conf: -------------------------------------------------------------------------------- 1 | ### mongod-config 2 | # mongod IP地址或域名 3 | host = 127.0.0.1 4 | # mongodb port 5 | port = 27017 6 | # mongod 用户名 7 | username = root 8 | # mongod 密码 9 | password = 123456 10 | # add custom params to mongodump, leave blank if not needed 11 | params = --authenticationDatabase admin 12 | # 备份文件保留天数 13 | retain_days = 3 14 | # 备份文件路径 15 | backup_dir = /mnt/backups/mongo/archives 16 | # mongodump命令路径"/usr/bin/mongodump" 17 | # docker环境可以使用"/usr/bin/docker exec mongodb mongodump" 18 | mongodump_bin = /usr/bin/mongodump 19 | # 全量备信息名称 前缀 20 | full_backup_prefix = full 21 | # 错误日志文件(根据此文件知道备份是否成功) 22 | # format: 23 | # {week_day:2,dir:full/incr_2019-12-17_23-09-58_2,type:full/incr,date:2019-12-17} 24 | error_log = mongo_increment_hot_backup.err 25 | 26 | ### oss-config 27 | # 阿里云OSS Bucket 28 | oss_bucket = test-data-backup 29 | # 自定义一个命名空间 30 | oos_namespaces = test 31 | # 阿里云OSS Endpoint 32 | oss_endpoint = oss-cn-shenzhen-internal.aliyuncs.com 33 | # 阿里云OSS AccessKeyId 34 | oss_accesskeyid = LTAI3Fm7GEQca5BTBK8Bhqea 35 | # 阿里云OSS AccessKeySecret 36 | oss_accesskeysecret = jCPQ2cgJz3ZfBoc3btdCn2uHgPDdcl 37 | # 阿里云ossutil命令路径 38 | ossutil_bin = /usr/local/bin/ossutil64 39 | 40 | -------------------------------------------------------------------------------- /mysql/bin/backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # ============================================================================== 3 | # Author : Jayknoxqu 4 | # Email : jayknoxqu@gmail.com 5 | # Date : 2019.12.18 6 | # Version : 1.0.0 7 | # Description : This script is backup mysql databases and upload to aliyun oss 8 | # ============================================================================== 9 | 10 | # 备份日期 11 | backup_date=$(date +%F) 12 | # 备份时间 13 | backup_time=$(date +%H-%M-%S) 14 | # 备份时的周几 15 | backup_week_day=$(date +%u) 16 | 17 | # 获得程序路径名 18 | program_dir=$(dirname $0)/.. 19 | # 日志文件目录 20 | logs_dir=$program_dir/logs 21 | # 索引文件目录 22 | index_dir=$program_dir/index 23 | 24 | # 读取配置文件中的所有变量值, 设置为全局变量 25 | conf_file="$program_dir/conf/backup.conf" 26 | # mysql 用户 27 | username=$(sed '/^username\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 28 | # mysql 密码 29 | password=$(sed '/^password\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 30 | # mysql 备份目录 31 | backup_dir=$(sed '/^backup_dir\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 32 | # mysql 备份压缩打包目录 33 | gzip_dir=$(sed '/^gzip_dir\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 34 | # percona-xtrabackup命令xtrabackup路径 35 | xtrabackup_bin=$(sed '/^xtrabackup_bin\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 36 | # 全备是在一周的第几天 37 | full_backup_week_day=$(sed '/^full_backup_week_day\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 38 | # mysql 全备前缀标识 39 | full_backup_prefix=$(sed '/^full_backup_prefix\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 40 | # mysql 增量备前缀标识 41 | increment_prefix=$(sed '/^increment_prefix\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 42 | # 备份错误日志文件 43 | error_log=$logs_dir/$(sed '/^error_log\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 44 | # 备份索引文件 45 | index_file=$index_dir/$(sed '/^index_file\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 46 | 47 | # 阿里云OSS Bucket 48 | oss_bucket=$(sed '/^oss_bucket\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 49 | # 自定义一个命名空间 50 | oos_namespaces=$(sed '/^oos_namespaces\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 51 | # 阿里云OSS Endpoint 52 | oss_endpoint=$(sed '/^oss_endpoint\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 53 | # 阿里云OSS AccessKeyId 54 | oss_accesskeyid=$(sed '/^oss_accesskeyid\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 55 | # 阿里云OSS AccessKeySecret 56 | oss_accesskeysecret=$(sed '/^oss_accesskeysecret\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 57 | # 阿里云ossutil命令路径 58 | ossutil_bin=$(sed '/^ossutil_bin\(\|\s\+\)=/!d;s/.*=\(\|\s\+\)//' $conf_file) 59 | 60 | # 创建相关文件 61 | mkdir -p $logs_dir $index_dir $gzip_dir $backup_dir 62 | 63 | # 全量备份 64 | function full_backup() { 65 | backup_name=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day} 66 | mkdir -p $backup_dir/${backup_name} 67 | $xtrabackup_bin \ 68 | --user=$username \ 69 | --password=$password \ 70 | --backup \ 71 | --target-dir=$backup_dir/${backup_name} >$logs_dir/${backup_name}_backup.log 2>&1 72 | return $? 73 | } 74 | 75 | # 增量备份 76 | function increment_backup() { 77 | backup_name=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day} 78 | incr_base_name=$(sed -n '$p' $index_file | 79 | awk -F '[, {}]*' '{print $3}' | 80 | awk -F ':' '{print $2}') 81 | mkdir -p $backup_dir/${backup_name} 82 | $xtrabackup_bin \ 83 | --user=$username \ 84 | --password=$password \ 85 | --backup \ 86 | --target-dir=$backup_dir/${backup_name} \ 87 | --incremental-basedir=$backup_dir/$incr_base_name >$logs_dir/${backup_name}_backup.log 2>&1 88 | return $? 89 | } 90 | 91 | # 发送备份到远程 92 | function send_backup_to_remote() { 93 | backup_name=${1}_${backup_date}_${backup_time}_${backup_week_day} 94 | 95 | $ossutil_bin \ 96 | cp $gzip_dir/${backup_name}.tar.bz2 \ 97 | oss://$oss_bucket/$oos_namespaces/mysql/archives/${backup_name}.tar.bz2 \ 98 | -f -e $oss_endpoint -i $oss_accesskeyid -k $oss_accesskeysecret \ 99 | >$logs_dir/${backup_name}_upload.log 2>&1 100 | 101 | } 102 | 103 | # 删除之前的备份(一般在全备完成后使用) 104 | function delete_before_backup() { 105 | awk <$index_file -F '[, {}]*' '{print $3}' | 106 | awk -v backup_dir=$backup_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", backup_dir, $2)}}' | 107 | /bin/bash 108 | 109 | awk <$index_file -F '[, {}]*' '{print $3}' | 110 | awk -v gzip_dir=$gzip_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s.tar.bz2\n", gzip_dir, $2)}}' | 111 | /bin/bash 112 | 113 | awk <$index_file -F '[, {}]*' '{print $3}' | 114 | awk -v logs_dir=$logs_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s_*.log\n", logs_dir, $2)}}' | 115 | /bin/bash 116 | } 117 | 118 | # 备份索引文件 119 | function backup_index_file() { 120 | cp $index_file ${index_file}_"$(date -d "1 day ago" +%F)" 121 | } 122 | 123 | # 备份索引文件 124 | function send_index_file_to_remote() { 125 | index_name=$(basename ${index_file})_$(date -d "1 day ago" +%F) 126 | backup_name=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day} 127 | 128 | $ossutil_bin \ 129 | cp $index_file \ 130 | oss://$oss_bucket/$oos_namespaces/mysql/indexs/${index_name} \ 131 | -f -e $oss_endpoint -i $oss_accesskeyid -k $oss_accesskeysecret \ 132 | >$logs_dir/${backup_name}_index.log 2>&1 133 | 134 | } 135 | 136 | # 添加索引, 索引记录了当前最新的备份 137 | function append_index_to_file() { 138 | echo "{week_day:$backup_week_day, \ 139 | dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \ 140 | type:${1}, \ 141 | date:${backup_date}}" >>$index_file 142 | } 143 | 144 | # 记录错误消息到文件 145 | function logging_backup_err() { 146 | echo "{week_day:$backup_week_day, \ 147 | dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \ 148 | type:${1}, \ 149 | date:${backup_date}}" >>$error_log 150 | } 151 | 152 | # 清空索引 153 | function purge_index_from_file() { 154 | : >$index_file 155 | } 156 | 157 | # 清空错误日志信息 158 | function purge_err_log() { 159 | : >$error_log 160 | } 161 | 162 | # 打包备份 163 | function tar_backup_file() { 164 | cd $backup_dir || exit 165 | tar -jcf ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 \ 166 | ${1}_${backup_date}_${backup_time}_${backup_week_day} 167 | cd - >/dev/null || exit 168 | } 169 | 170 | # 判断是应该全备还是增量备份 171 | # 0:full, 1:incr 172 | function get_backup_type() { 173 | backup_type=0 174 | if [ "$full_backup_week_day" -eq "$(date +%u)" ]; then 175 | backup_type=0 176 | else 177 | backup_type=1 178 | fi 179 | touch $index_file 180 | if [ -z "$(cat $index_file)" ]; then 181 | backup_type=0 182 | fi 183 | return $backup_type 184 | } 185 | 186 | # 测试配置文件正确性 187 | function test_conf_file() { 188 | # verify mysql-config 189 | if [ -z "$username" ]; then 190 | echo 'fail: configure file username not set' 191 | exit 2 192 | fi 193 | if [ -z "$password" ]; then 194 | echo 'fail: configure file password not set' 195 | exit 2 196 | fi 197 | if [ -z "$backup_dir" ]; then 198 | echo 'fail: configure file backup_dir not set' 199 | exit 2 200 | fi 201 | if [ -z "$gzip_dir" ]; then 202 | echo 'fail: configure file backup_dir not set' 203 | exit 2 204 | fi 205 | if [ -z "$full_backup_week_day" ]; then 206 | echo 'fail: configure file full_backup_week_day not set' 207 | exit 2 208 | fi 209 | if [ -z "$full_backup_prefix" ]; then 210 | echo 'fail: configure file full_backup_prefix not set' 211 | exit 2 212 | fi 213 | if [ -z "$increment_prefix" ]; then 214 | echo 'fail: configure file increment_prefix not set' 215 | exit 2 216 | fi 217 | if [ -z "$error_log" ]; then 218 | echo 'fail: configure file error_log not set' 219 | exit 2 220 | fi 221 | if [ -z "$index_file" ]; then 222 | echo 'fail: configure file index_file not set' 223 | exit 2 224 | fi 225 | 226 | # verify oss-config 227 | if [ -z "$oss_bucket" ]; then 228 | echo 'fail: configure file oss_bucket not set' 229 | exit 2 230 | fi 231 | if [ -z "$oos_namespaces" ]; then 232 | echo 'fail: configure file oos_namespaces not set' 233 | exit 2 234 | fi 235 | if [ -z "$oss_endpoint" ]; then 236 | echo 'fail: configure file oss_endpoint not set' 237 | exit 2 238 | fi 239 | if [ -z "$oss_accesskeyid" ]; then 240 | echo 'fail: configure file oss_accesskeyid not set' 241 | exit 2 242 | fi 243 | if [ -z "$oss_accesskeysecret" ]; then 244 | echo 'fail: configure file oss_accesskeysecret not set' 245 | exit 2 246 | fi 247 | if [ -z "$ossutil_bin" ]; then 248 | echo 'fail: configure file ossutil_bin not set' 249 | exit 2 250 | fi 251 | } 252 | 253 | # 执行 254 | function main() { 255 | # 检测配置文件值 256 | test_conf_file 257 | # 判断是执行全备还是增量备份 258 | get_backup_type 259 | backup_type=$? 260 | case $backup_type in 261 | 0) 262 | # 全量备份 263 | full_backup 264 | backup_ok=$? 265 | if [ 0 -eq "$backup_ok" ]; then 266 | ### 全备成功 267 | # 打包最新备份 268 | tar_backup_file $full_backup_prefix 269 | # 将tar备份发送到远程 270 | send_backup_to_remote $full_backup_prefix 271 | # 备份索引文件 272 | backup_index_file 273 | # 发送索引文件到远程 274 | send_index_file_to_remote 275 | # 清除之前的备份 276 | delete_before_backup 277 | # 清除索引文件 278 | purge_index_from_file 279 | # 添加索引, 索引记录了当前最新的备份 280 | append_index_to_file $full_backup_prefix 281 | else 282 | # 全备失败 283 | # 删除备份目录 284 | rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day} 285 | # 记录错误日志 286 | logging_backup_err $full_backup_prefix 287 | fi 288 | ;; 289 | 1) 290 | # 增量备份 291 | increment_backup 292 | backup_ok=$? 293 | if [ "$backup_ok" -eq 0 ]; then 294 | ### 增量备份成功 295 | # 打包最新备份 296 | tar_backup_file $increment_prefix 297 | # 将tar备份发送到远程 298 | send_backup_to_remote $increment_prefix 299 | # 添加索引, 索引记录了当前最新的备份 300 | append_index_to_file $increment_prefix 301 | else 302 | ### 增量备份失败 303 | # 删除备份目录 304 | rm -rf ${backup_dir}/${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day} 305 | # 记录错误日志 306 | logging_backup_err $increment_prefix 307 | fi 308 | ;; 309 | esac 310 | } 311 | 312 | main 313 | -------------------------------------------------------------------------------- /mysql/conf/backcron: -------------------------------------------------------------------------------- 1 | # 每天凌晨4点15分执行备份 2 | 15 4 * * * /usr/local/database-backup/mysql/bin/backup.sh >/dev/null 2>&1 3 | -------------------------------------------------------------------------------- /mysql/conf/backup.conf: -------------------------------------------------------------------------------- 1 | ### mysql-config 2 | # mysql 用户名 3 | username = root 4 | # mysql 密码 5 | password = 123456 6 | # 备份路径 7 | backup_dir = /mnt/backups/mysql 8 | # 备份压缩打包目录 9 | gzip_dir = /mnt/backups/mysql/archives 10 | # innobackupex 命令路径 11 | xtrabackup_bin = /usr/bin/xtrabackup 12 | # 全备是在一周的第几天 13 | full_backup_week_day = 6 14 | # 全量备信息名称 前缀 15 | full_backup_prefix = full 16 | # 增量备信息名称 前缀 17 | increment_prefix = incr 18 | # 错误日志文件(根据此文件知道备份是否成功) 19 | # format: 20 | # {week_day:2,dir:full/incr_2019-12-17_23-09-58_2,type:full/incr,date:2019-12-17} 21 | error_log = mysql_increment_hot_backup.err 22 | # 索引文件 23 | # format: 24 | # {week_day:2,dir:full_2019-12-17_23-09-58_2,type:full,date:2019-12-17} 25 | index_file = mysql_increment_hot_backup.index 26 | 27 | ### oss-config 28 | # 阿里云OSS Bucket 29 | oss_bucket = test-data-backup 30 | # 自定义一个命名空间 31 | oos_namespaces = test 32 | # 阿里云OSS Endpoint 33 | oss_endpoint = oss-cn-shenzhen-internal.aliyuncs.com 34 | # 阿里云OSS AccessKeyId 35 | oss_accesskeyid = LTAI3Fm7GEQca5BTBK8Bhqea 36 | # 阿里云OSS AccessKeySecret 37 | oss_accesskeysecret = jCPQ2cgJz3ZfBoc3btdCn2uHgPDdcl 38 | # 阿里云ossutil命令路径 39 | ossutil_bin = /usr/local/bin/ossutil64 40 | --------------------------------------------------------------------------------