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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

一、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,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
10天前
|
关系型数据库 MySQL OLAP
实时计算 Flink版产品使用合集之可以支持 MySQL 数据源的增量同步到 Hudi 吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
12天前
|
JSON 监控 测试技术
Groovy脚本编写员工上网行为监控自动化测试
本文介绍了如何使用Groovy脚本创建一个自动化工具来监控员工的网络活动。通过编写简单脚本记录员工访问的网站并打印信息,可进一步扩展为将数据保存至数据库。此外,通过设定定时任务,实现了每30分钟自动监控一次的功能。最后,展示了如何将监控数据转换为JSON格式并使用HTTP POST请求提交到网站,以实现数据的自动化上报,有助于企业保障网络安全、保护数据并提升工作效率。
86 5
|
3天前
|
XML 数据格式 Python
Python自动化脚本编写技巧
本文介绍了Python自动化脚本的编写技巧:选择合适的库(如os, requests, BeautifulSoup)以简化编程,利用循环和条件语句实现流程控制,通过函数和模块提高代码的可读性和可维护性,使用异常处理保证脚本稳定性,以及借助日志记录进行问题追踪。通过这些方法,可以编写出高效、稳定的自动化脚本。
|
5天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之mysql cdc支持全量的时候并发读取,该如何配置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
10天前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版产品使用合集之2.2.1版本同步mysql数据写入doris2.0 ,同步完了之后增量的数据延迟能达到20分钟甚至一直不写入如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
12天前
|
JavaScript 前端开发
Playwright执行 JavaScript 脚本:探索浏览器自动化的新境界
在Web自动化中,Playwright提供`page.evaluate()`和`page.evaluate_handle()`来执行JavaScript脚本。`page.evaluate()`返回脚本执行结果,而`page.evaluate_handle()`返回JSHandle。示例展示了如何使用它们,如打印网页标题、操作元素及获取页面内容。通过这些方法,可以处理常规方法难以操作的网页元素。
13 2
|
12天前
|
测试技术 API 开发者
使用 Playwright 脚本录制简化自动化测试:完全指南
Playwright提供了一种脚本录制功能,帮助开发者通过交互式操作自动生成测试脚本,提升测试效率。使用Playwright的命令行工具`codegen`,如`playwright codegen python <url>`,可以记录浏览器操作并生成Python测试脚本。生成的脚本使用Playwright API模拟用户交互,如`page.click()`和`page.fill()`。这种方法简化了自动化测试脚本的编写,促进了测试流程的加速。
25 1
|
12天前
|
IDE 测试技术 开发工具
从零开始:使用 Playwright 脚本录制实现自动化测试
Playwright提供了一种便捷的脚本录制功能,类似于Selenium IDE。通过运行`playwright codegen`命令,你可以启动一个浏览器并记录你的操作,生成Python或异步代码。在示例中,展示了如何录制登录百度的过程,生成的代码可以直接用于自动化测试。Playwright Inspector允许你编辑和转换测试代码,支持生成Pytest格式的测试用例,方便Python开发者使用。这个功能使Playwright成为强大的Web自动化测试工具。
12 3
|
12天前
|
关系型数据库 MySQL Shell
在Centos7中利用Shell脚本:实现MySQL的数据备份
在Centos7中利用Shell脚本:实现MySQL的数据备份

推荐镜像

更多