运维脚本: Mysql数据库备份

  • 运维脚本: Mysql数据库备份已关闭评论
  • 13 次浏览
  • A+
所属分类:.NET技术
摘要

 


背景介绍

  • 在数据库管理和运维中,定期备份数据库是防止数据丢失和灾难恢复的基础。对于 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')]: 33[31mERROR: 33[0m$@n" >> /data/mysql_backup/error.log  16     exit 1  17 }  18   19 log_info() {  20     printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: 33[32mINFO: 33[0m$@n" >> /data/mysql_backup/info.log  21 }  22   23 log_warning() {  24     printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: 33[33mWARNING: 33[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