夏天太热 发表于 2024-12-2 12:24:47

运维脚本: Mysql数据库备份

背景介绍


[*]在数据库管理和运维中,定期备份数据库是防止数据丢失和灾难恢复的基础。对于 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.rpmhttps://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 " 在线安装 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 " 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 " 创建备份目录 $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 " 存在已有备份数据, 跳过全量备份!"
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 " 执行备份失败 备份路径: $current_backup_path"
97   fi
98   log_info " 全量备份结束, 备份路径: $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 " 前一天执行备份失败 备份路径:$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 " 执行增量备份失败, 备份路径: $current_backup_path"
123   fi
124   log_info " 增量备份结束, 备份路径: $current_backup_path"
125 }
126
127
128 # 主函数
129 function main() {
130   full_backup
131   incremental_backup
132 }
133
134 main 

来源:https://www.cnblogs.com/chang157122/p/18581622
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 运维脚本: Mysql数据库备份