MySQL自动化(全量+增量)备份脚本

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介:

一、MySQL的日常备份方案:

全备+增量备份:

1、周日凌晨三点进行全备;

2、周一到周日增量备份。

不是往常的周日全备份,周一到周六增量备份,这样如果周日数据库在完全备份前出问题,恢复完成后,会少周日一天的数据量,所以七天增量备份,周日全备可以更好的保全数据。

这是备份周期演示表:

1
2
Sun 3:00------Mon 3:00-----------------Tue 3:00----------Wed 3:00----------Thu 3:00----------Fri 3:00----------Sat 3:00----------Sun 3:00
(flush)Sun full---(flush)Sun->Mon binlog---(flush)Mon->Tue---(flush)Tue->Wed---(flush)Wed->Thu---(flush)Thu->Fri---(flush)Fri->Sat---(flush)Sun full---(flush)Sun->Mon binlog---(flush)Mon->Tue---(flush)Tue->Wed---(flush)Wed->Thu---(flush)Thu->Fri---(flush)Fri->Sat---(flush)Sun full

二、备份脚本:

模块化定制,可以随意移动,调节备份策略!

变量栏的帐号密码,文件路径根据自己实际环境可以进行修改,自由度比较高,模块函数全变量,适用度较高,但是可能还有不完善的地方,欢迎提出,谢谢!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
vim  /root/mysql_bakup .sh
 
#!/bin/bash
#Date:2017/5/2
#Author:wangpengtai
#Blog:http://wangpengtai.blog.51cto.com
#At Sunday, we will backup the completed databases and the incresed binary log during Saturday to Sunday.
#In other weekdays, we only backup the increaing binary log at that day!
################################
#the globle variables for MySQL#
################################
DB_USER= 'root'
DB_PASSWORD= '123456'
DB_PORT= '3306'
BACKUPDIR= '/tmp/mysqlbakup'
BACKUPDIR_OLDER= '/tmp/mysqlbakup_older'
DB_PID= '/data/mysql/log/mysqld.pid'
DB_SOCK= '/data/mysql/log/mysql.sock'
LOG_DIR= '/data/mysql/log'
BACKUP_LOG= '/tmp/mysqlbakup/backup.log'
DB_BIN= '/usr/local/mysql/bin'
#time variables for completed backup
FULL_BAKDAY= 'Sunday'
TODAY=` date  +%A`
DATE=` date  +%Y%m%d`
###########################
#time variables for binlog#
###########################
#liftcycle for saving binlog
DELETE_OLDLOG_TIME=$( date  "-d 14 day ago"  +%Y%m%d%H%M%S)
#The start time point to backup binlog, the usage of mysqlbinlog is --start-datetime, --stop-datetime, time format is %Y%m%d%H%M%S, eg:20170502171054, time zones is  [start-datetime, stop-datetime)
#The date to start backup binlog is yesterday at this very moment!
START_BACKUPBINLOG_TIMEPOINT=$( date  "-d 1 day ago"  + "%Y-%m-%d %H:%M:%S" )
 
#BINLOG_LIST=`cat /data/mysql/log/mysql-bin.index`
 
#注意在my.cnf中配置binlog文件位置时需要使用绝对路径,一定想成好习惯,不要给别人挖坑!!
#####################举例########################
#[mysqld]
#log_bin = /var/lib/mysql/mysql-bin
#####################举例########################
BINLOG_INDEX= '/data/mysql/log/mysql-bin.index'
##############################################
#Judge the mysql process is running or not.  #
#mysql stop return 1, mysql running return 0.#
##############################################
function  DB_RUN(){
     if  test  -a $DB_PID &&  test  -a $DB_SOCK; then
         return  0
     else
         return  1
     fi
}
###################################################################################################
#Judge the bacup directory is exsit not.                                                          #
#If the mysqlbakup directory was exsited, there willed return 0.                                  #
# If there is no a mysqlbakup directory, the fuction will create the directory and return value 1.#
###################################################################################################
function  BACKDIR_EXSIT(){
     if  test  -d $BACKUPDIR; then
#        echo "$BACKUPDIR was exist."
         return  0
     else
         echo  "$BACKUPDIR is not exist, now create it."
         mkdir  -pv $BACKUPDIR
         return  1
     fi
}
###################################################################################################
#Judge the binlog is configed or not.                                                          #
#If the mysqlbakup directory was exsited, there willed return 0.                                  #
# If there is no a mysqlbakup directory, the fuction will create the directory and return value 1.#
###################################################################################################
function  BINLOG_EXSIT(){
     if  test  -f $BINLOG_INDEX; then
#        echo "$BACKUPDIR was exist."
         return  0
     fi
}
###################################################
#The full backup for all Databases                #
#This function is use to backup the all databases.#
###################################################
function  FULL_BAKUP(){
     echo  "At `date +%D\ %T`: Starting full backup the MySQL DB ... "
#    rm -fr $BACKUPDIR/db_fullbak_$DATE.sql  #for test !!
     $DB_BIN /mysqldump  --lock-all-tables --flush-logs --master-data=2 -u$DB_USER -p$DB_PASSWORD -P$DB_PORT -A | gzip  > $BACKUPDIR /db_fullbak_ $DATE.sql.gz
     FULL_HEALTH=` echo  $?`
     if  [[ $FULL_HEALTH == 0 ]]; then
         echo  "At `date +%D\ %T`: MySQL DB incresed backup successfully"
     else
         echo  "MySQL DB full backup failed!"
     fi
}
#python
# >>> with open('/data/mysql/log/mysql-bin.index','r') as obj:
# ...    for i in obj:
# ...       print os.path.basename(i)
# ...
# mysql-bin.000006
# mysql-bin.000007
# mysql-bin.000008
# mysql-bin.000009
function  INCREASE_BAKUP(){
     echo  "At `date +%D\ %T`: Starting increased backup the MySQL DB ... "
     $DB_BIN /mysqladmin  -u$DB_USER -p$DB_PASSWORD -P$DB_PORT flush-logs
     $DB_BIN /mysql  -u$DB_USER -p$DB_PASSWORD -P$DB_PORT -e  "purge master logs before ${DELETE_OLDLOG_TIME}"
     for  in  ` cat  $BINLOG_INDEX`
     do
         $DB_BIN /mysqlbinlog  -u$DB_USER -p$DB_PASSWORD -P$DB_PORT --start-datetime= "$START_BACKUPBINLOG_TIMEPOINT"  $i | gzip  >> $BACKUPDIR /db_daily_ $DATE.sql.gz
     done
     # $DB_BIN/mysqlbinlog -u$DB_USER -p$DB_PASSWORD -P$DB_PORT --start-datetime="$START_BACKUPBINLOG_TIME" $LOG_DIR/mysql-bin.[0-9]* |gzip >> $BACKUPDIR/db_daily_$DATE.sql.gz
     INCREASE_HEALTH=` echo  $?`
     if  [[ $INCREASE_HEALTH == 0 ]]; then
         echo  "At `date +%D\ %T`: MySQL DB incresed backup successfully"
     else
         echo  "MySQL DB incresed backup failed!"
     fi
}
function  OLDER_BACKDIR_EXSIT(){
     if  test  -d $BACKUPDIR_OLDER; then
#        echo "$BACKUPDIR_OLDER was exist."
         return  0
     else
         echo  "$BACKUPDIR_OLDER is not exist, now create it."
         mkdir  -pv $BACKUPDIR_OLDER
#        return 1
     fi
}
function  BAKUP_CLEANER(){
     #move the backuped file that created time out of 7 days to the BACKUPDIR_OLDER directory
     returnkey=` find  $BACKUPDIR -name  "*.sql.gz"  -mtime +7 - exec  ls  -lh {} \;`
     returnkey_old=` find  $BACKUPDIR_OLDER -name  "*.sql.gz"  -mtime +14 - exec  ls  -lh {} \;`
     if  [[ $returnkey !=  ''  ]]; then
 
         echo  "----------------------"
         echo  "Moving the older backuped file out of 7 days to $BACKUPDIR_OLDER."
         echo  "The moved file list is:"
         find  $BACKUPDIR -name  "*.sql.gz"  -mtime +7 - exec  mv  {} $BACKUPDIR_OLDER \;
         echo  "-----------------------"
     elif  [[ $returnkey_old !=  ''  ]]; then
         #delete the backuped file that created time out of 14 days from BACKUPDIR_OLDER directory.
         echo  "Delete the older backuped file out of 14 days from $BACKUPDIR_OLDER."
         echo  "The deleted files list is:"
         find  $BACKUPDIR_OLDER -name  "*.sql.gz"  -mtime +14 - exec  rm  -fr {} \;
     fi
}
####################################
#--------------main----------------#
####################################
function  MAIN(){
     DB_RUN  #Judge the process is run or not, if not run, the script will not bakup db
     Run_process=` echo  $?`
     echo  $?
     if  [[ $Run_process == 0 ]]; then
         BINLOG_EXSIT
         binlog_index=` echo  $?`
         if  [[ $binlog_index == 0 ]]; then
             echo  "**********START**********"
             echo  $( date  + "%y-%m-%d %H:%M:%S %A" )
             echo  "~~~~~~~~~~~~~~~~~~~~~~~"
             if  [[ $TODAY == $FULL_BAKDAY ]]; then
                 echo  "Start completed bakup ..."
                 INCREASE_BAKUP
                 FULL_BAKUP     #full backup to all DB
                 BAKUP_CLEANER
             else
                 echo  "Start increaing bakup ..."
                 INCREASE_BAKUP
             fi
             echo  "~~~~~~~~~~~~~~~~~~~~~~~"
             echo  $( date  + "%y-%m-%d %H:%M:%S %A" )
             echo  "**********END**********"
         else
             echo  "**********START**********"
             echo  $( date  + "%y-%m-%d %H:%M:%S %A" )
             echo  "~~~~~~~~~~~~~~~~~~~~~~~"
             echo  "Sorry, MySQL binlog was not configed, please config the my.cnf firstly!"
             echo  "~~~~~~~~~~~~~~~~~~~~~~~"
             echo  $( date  + "%y-%m-%d %H:%M:%S %A" )
             echo  "**********END**********"
         fi
     else
         echo  "**********START**********"
         echo  $( date  + "%y-%m-%d %H:%M:%S %A" )
         echo  "~~~~~~~~~~~~~~~~~~~~~~~"
         echo  "Sorry, MySQL was not running, the db could not be backuped!"
         echo  "~~~~~~~~~~~~~~~~~~~~~~~"
         echo  $( date  + "%y-%m-%d %H:%M:%S %A" )
         echo  "**********END**********"
     fi
}
#starting runing
 
BACKDIR_EXSIT $BACKUP_LOG
OLDER_BACKDIR_EXSIT $BACKUP_LOG
MAIN >> $BACKUP_LOG


三、测试方法:

使用了一个测试脚本,修改日期,达到一个月的演示效果。

1
2
3
4
5
6
#!/bin/bash
for  day  in  {1..30}
do
     date  -s  "2017-06-$day 12:00:00"
     /bin/bash  /root/bakup/mysql_backup .sh
done

四、脚本使用方法:

1
2
3
4
crontab  -e
0 3 * * *   /bin/bash  /root/bakup/mysql_bakup .sh >  /dev/null  2>&1 空格
 
#加个空格,不然有些机器不能执行脚本









本文转自 wangpengtai  51CTO博客,原文链接:http://blog.51cto.com/wangpengtai/1920594,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
7月前
|
人工智能 监控 Kubernetes
77_自动化脚本:Makefile与Airflow
在当今AI大模型时代,高效的工作流管理对于模型训练、推理和部署至关重要。随着大模型规模的不断增长和复杂度的提升,传统的手动脚本管理方式已无法满足需求。自动化脚本和工作流调度系统成为构建健壮、可重复、可扩展的LLM Pipeline的关键工具。其中,Makefile作为经典的自动化构建工具,与Airflow作为现代工作流调度平台的结合,为LLM开发团队提供了强大的工作流管理能力。
212 0
|
12月前
|
关系型数据库 MySQL Linux
实现MySQL数据库的定时自动备份脚本。
拿走,不谢,这个脚本配方(指引)保证你的数据库数据像蛋糕店一样地天天更新,还能确保老旧的蛋糕(数据)不会堆积满仓库。这下可好,数据安全有保障,数据库管理员也能轻松一点,偶尔闲下来的时候,煮杯咖啡,看个剧岂不美哉?别忘了偶尔检查一下你的自动备份是否正常工作,以防万一蛋糕机器出了点小差错。
840 20
|
9月前
|
传感器 人工智能 JavaScript
Playwright实战:写UI自动化脚本,速度直接起飞
简介: 测试工程师老王因UI自动化问题深夜奋战,反映出传统测试工具的局限性。微软开源的Playwright凭借智能等待、跨域操作、移动端模拟与网络拦截等强大功能,正迅速取代Selenium,成为新一代自动化测试标准。其稳定高效的设计显著降低维护成本,助力企业构建高质量测试流程。
|
11月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
721 2
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
1455 61
自动化微信朋友圈:Python脚本实现自动发布动态
|
Web App开发 人工智能 JSON
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
AutoMouser是一款Chrome扩展程序,能够实时跟踪用户交互行为,并基于OpenAI的GPT模型自动生成Selenium测试代码,简化自动化测试流程。
1155 17
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。

推荐镜像

更多