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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

一、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 
目录
相关文章
|
2月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
187 10
|
4月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
288 36
|
4月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
184 5
|
5月前
|
关系型数据库 MySQL Linux
实现MySQL数据库的定时自动备份脚本。
拿走,不谢,这个脚本配方(指引)保证你的数据库数据像蛋糕店一样地天天更新,还能确保老旧的蛋糕(数据)不会堆积满仓库。这下可好,数据安全有保障,数据库管理员也能轻松一点,偶尔闲下来的时候,煮杯咖啡,看个剧岂不美哉?别忘了偶尔检查一下你的自动备份是否正常工作,以防万一蛋糕机器出了点小差错。
262 20
|
4月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
121 0
|
6月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
286 28
|
6月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
139 15
|
24天前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
54 4
|
3月前
|
运维 监控 安全
从实践到自动化:现代运维管理的转型与挑战
本文探讨了现代运维管理从传统人工模式向自动化转型的必要性与路径,分析了传统运维的痛点,如效率低、响应慢、依赖经验等问题,并介绍了自动化运维在提升效率、降低成本、增强系统稳定性与安全性方面的优势。结合技术工具与实践案例,文章展示了企业如何通过自动化实现运维升级,推动数字化转型,提升业务竞争力。
|
12月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
231 4

推荐镜像

更多