背景介绍
- 在数据库管理和运维中,定期备份数据库是防止数据丢失和灾难恢复的基础。对于 MySQL 数据库,手动备份可能会导致频繁的操作失误或遗漏,因此,自动化备份脚本的编写变得尤为重要。
- 本文将为你介绍如何编写一个简单且实用的 MySQL 备份脚本,通过该脚本,用户可以轻松自动化备份过程,确保数据库数据的安全
目标和用途
- 创建一个简单的 Bash 脚本,用于自动备份 MySQL 数据库。
- 通过自动化脚本来减轻数据库管理负担,确保定期备份。
- 提供自动化的备份策略,例如按日期创建备份文件,保留历史备份等。
备份工具
- 采用percona-xtrabckup实现MySQL数据库物理热备。
- xtrabckup 优点
- 备份速度快,物理备份可靠。
- 备份过程不会打断正在执行的事务(无需锁表)
- 自动备份校验
- 还原速度快
脚本示例
1 #!/bin/bash 2 # 作者: 阿杰 3 # 说明:Mysql数据库备份脚本 4 # 备份工具: percona-Xtrabackup 5 # 备份策略: 6 # (1) 每周日凌晨2点进行全量备份 7 # (2) 每周一至周六凌晨两点进行增量备份 8 # 定时任务配置策略 9 # 0 2 * * * bash /data/mysql_backup/mysql_backup.sh 10 # 告警:可根据备份失败触发邮件告警机制。告警需自行配置 11 12 13 # 日志记录 14 log_err() { 15 printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[31mERROR: \033[0m$@\n" >> /data/mysql_backup/error.log 16 exit 1 17 } 18 19 log_info() { 20 printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[32mINFO: \033[0m$@\n" >> /data/mysql_backup/info.log 21 } 22 23 log_warning() { 24 printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[33mWARNING: \033[0m$@\n" >> /data/mysql_backup/warning.log 25 } 26 27 28 29 # 初始化函数 30 init 31 function init() { 32 init_config 33 check_backup_is_exist 34 } 35 36 # 初始化配置 37 function init_config() { 38 # 备份工具 39 xtrabckup_path="/usr/bin/innobackupex" 40 # Mysql配置文件路径 41 mysql_cnf_path="/etc/my.cnf" 42 # 线程数 43 thread_cnt=4 44 #备份路径, 时间格式:年-周 45 backup_base_dir="/data/mysql_backup/$(date "+%Y-%U")" 46 # 当前备份文件 47 current_backup_path="${backup_base_dir}/$(date "+%Y-%m-%d")" 48 49 # 数据库信息 50 db_host="localhost" 51 db_user="root" 52 db_password="xxxxxxx" 53 54 } 55 56 # 检查是否存在percona-Xtrabackup 工具 57 function check_backup_is_exist() { 58 if [ -z "$(rpm -qa | grep xtrabackup)" ];then 59 curl -o /tmp/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm > /dev/null 2>&1 60 if [ $? -ne 0 ];then 61 log_err "[check_backup_is_exist] 在线安装 percona-xtrabackup 备份工具失败! 请检查是否可出网" 62 fi 63 yum -y install /tmp/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm 1> /dev/null 64 if [ $? -ne 0 ];then 65 log_err "[check_backup_is_exist] yum 安装 percona-xtrabackup 备份工具失败! " 66 fi 67 fi 68 } 69 70 # 全量备份 71 function full_backup() { 72 # 不存在则创建 73 if [ ! -d "$backup_base_dir" ];then 74 mkdir -pv $backup_base_dir > /dev/null 2>&1 75 if [ $? -ne 0 ];then 76 log_err "[full_backup] 创建备份目录 $backup_base_dir 失败!" 77 fi 78 # 全量备份 79 full 80 else 81 # 目录存在,目录下内容为空 则执行全量备份 82 if [ -z "$(ls $current_backup_path | wc -l)" ];then 83 full 84 else 85 log_warning "[full_backup] 存在已有备份数据, 跳过全量备份!" 86 return 87 fi 88 fi 89 90 91 } 92 93 function full() { 94 $xtrabckup_path --defaults-file=$mysql_cnf_path --host=$db_host --user=$db_user --password=$db_password --parallel=$thread_cnt --slave-info --safe-slave-backup --no-timestamp $current_backup_path 1> /dev/null 95 if [$? -ne 0 ];then 96 log_err "[full_backup] 执行备份失败 备份路径: $current_backup_path" 97 fi 98 log_info "[full_backup] 全量备份结束, 备份路径: $current_backup_path" 99 # 全量备份完成后退出脚本 100 exit 1 101 } 102 103 # 增量备份 104 function incremental_backup() { 105 prev_backup_dir="/data/mysql_backup/$(date "+%Y-%U")/$(date -d "-1day" "+%Y-%m-%d")" 106 stat $prev_backup_dir > /dev/null 2>&1 107 if [ $? -ne 0 ];then 108 log_warning "[incremental_backup] 前一天执行备份失败 备份路径:$prev_backup_dir" 109 # 查找上一次备份结果 110 while true;do 111 local i=2 112 prev_backup_dir="/data/mysql_backup/$(date "+%Y-%U")/$(date -d "-${i}day" "+%Y-%m-%d")" 113 stat $prev_backup_dir > /dev/null 2>&1 114 if [ $? -eq 0 ];then 115 break 116 fi 117 ((i++)) 118 done 119 fi 120 $xtrabckup_path --defaults-file=$mysql_cnf_path --host=$db_host --user=$db_user --password=$db_password --parallel=$thread_cnt --slave-info --safe-slave-backup --no-timestamp $current_backup_path --incremental-basedir=${prev_backup_dir} 1> /dev/null 121 if [ $? -ne 0 ]; then 122 log_err "[incremental_backup] 执行增量备份失败, 备份路径: $current_backup_path" 123 fi 124 log_info "[incremental_backup] 增量备份结束, 备份路径: $current_backup_path" 125 } 126 127 128 # 主函数 129 function main() { 130 full_backup 131 incremental_backup 132 } 133 134 main