forked from fcavero/tools-mariadb-backup
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmariadb_backup
executable file
·199 lines (164 loc) · 5.49 KB
/
mariadb_backup
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
198
199
#!/bin/bash
################################################################################
# Shell script to backup MariaDB databases.
################################################################################
#
# Este script puede programarse en el crontab con las siguientes opciones
# (ojo a las rutas, que tendrán que adecuarse convenientemente):
#
# 0 1 * * * /<ruta>/mariadb-backup /<ruta>/mariadb-backup.conf > /<ruta>/mariadb-backup.log 2>&1
#
################################################################################
# GNU/Linux bin paths
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
DATE="$(which date)"
EXPR="$(which expr)"
FIND="$(which find)"
GZIP="$(which gzip)"
ID="$(which id)"
MKDIR="$(which mkdir)"
MV="$(which mv)"
MYSQLDUMP="$(which mysqldump)"
################################################################################
# HELPER FUNCTIONS
################################################################################
##
# Function that shows an error message and abort backup process.
# $1 error description.
##
function showErrorAndExit()
{
NOW=$(date +"%Y/%m/%d-%T")
echo $NOW "[ ERROR ] $1. Aborting." 1>&2
exit 1
}
##
# Function that perform the backup process depending upon period given.
# $1 period ( monthly | weekly | daily )
##
function doBackups()
{
PERIOD=$1
if [ $PERIOD == "daily" ];
then
SCHEMA_ONLY_DB_LIST=$D_SCHEMA_ONLY_DB_LIST
FULL_BACKUP_DB_LIST=$D_FULL_BACKUP_DB_LIST
elif [ $PERIOD == "weekly" ];
then
SCHEMA_ONLY_DB_LIST=$W_SCHEMA_ONLY_DB_LIST
FULL_BACKUP_DB_LIST=$W_FULL_BACKUP_DB_LIST
else
SCHEMA_ONLY_DB_LIST=$M_SCHEMA_ONLY_DB_LIST
FULL_BACKUP_DB_LIST=$M_FULL_BACKUP_DB_LIST
fi
echo -e "\n--------------------------------------------"
FINAL_BACKUP_DIR=$BACKUP_DIR"`$DATE +\%Y\%m\%d`-$PERIOD/"
echo "Making backup directory in $FINAL_BACKUP_DIR"
if ! $MKDIR -p $FINAL_BACKUP_DIR;
then
showErrorAndExit "Cannot create backup directory in $FINAL_BACKUP_DIR"
fi;
#### Schema-only backups ####
echo -e "\nSchema-only backups ($PERIOD)"
echo -e "--------------------------------------------"
if [[ $SCHEMA_ONLY_DB_LIST ]];
then
echo -e "The following databases were matched for $PERIOD schema-only backup:\n${SCHEMA_ONLY_DB_LIST}\n"
for DATABASE in $SCHEMA_ONLY_DB_LIST
do
echo "Performing schema-only backup of $DATABASE..."
if ! $MYSQLDUMP --no-data -h $HOSTNAME -u $USERNAME -p$PASSWORD $DATABASE | $GZIP -9 > $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress;
then
showErrorAndExit "Failed to backup database schema of $DATABASE database"
else
$MV $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz
echo " done!"
fi
done
echo -e "\nAll $PERIOD schema-only backups complete!"
else
echo -e "There are no databases matched for $PERIOD schema-only backup.\n"
fi
#### Full backups ####
echo -e "\nFull backups ($PERIOD)"
echo -e "--------------------------------------------"
if [[ $FULL_BACKUP_DB_LIST ]];
then
echo -e "The following databases were matched for $PERIOD full backup:\n${FULL_BACKUP_DB_LIST}\n"
for DATABASE in $FULL_BACKUP_DB_LIST
do
echo "Performing full backup of $DATABASE..."
if ! $MYSQLDUMP -h $HOSTNAME -u $USERNAME -p$PASSWORD $DATABASE | $GZIP -9 > $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress;
then
showErrorAndExit "Failed to produce backup of $DATABASE database"
else
$MV $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE".sql.gz
echo " done!"
fi
done
echo -e "\nAll $PERIOD database backups complete!"
else
echo -e "There are no databases matched for $PERIOD full backup.\n"
fi
}
################################################################################
# MAIN
################################################################################
#### Load config settings ####
CONFIG_FILE_PATH=$1
if [ ! -r ${CONFIG_FILE_PATH} ];
then
showErrorAndExit "Could not load config file from ${CONFIG_FILE_PATH}"
fi
#source "${CONFIG_FILE_PATH}"
. "${CONFIG_FILE_PATH}"
#### Pre-backup checks ####
# Make sure we're running as the required backup user
if [ $BACKUP_USER != "" -a "$($ID -un)" != "$BACKUP_USER" ];
then
showErrorAndExit "This script must be run as $BACKUP_USER."
fi
#### Initialise defaults ####
if [ ! $HOSTNAME ];
then
HOSTNAME="localhost"
fi;
if [ ! $USERNAME ];
then
USERNAME="root"
fi;
#### Prepare backup directory ####
# Create main directory where backups will be stored, if needed
[ ! -d $BACKUP_DIR ] && $MKDIR -p $BACKUP_DIR || :
# Only root can access it!
$CHOWN 0.0 -R $BACKUP_DIR
$CHMOD 0600 $BACKUP_DIR
# Rock 'n Roll!!
#### Monthly backups ####
DAY_OF_MONTH=`$DATE +%d`
if [ $DAY_OF_MONTH -eq 1 ];
then
# Delete all expired monthly directories
$FIND $BACKUP_DIR -maxdepth 1 -name "*-monthly" -exec rm -rf '{}' ';'
doBackups "monthly"
# That's all folks!
exit 0
fi
#### Weekly backups ####
DAY_OF_WEEK=`$DATE +%u` #1-7 (Monday-Sunday)
EXPIRED_DAYS=`$EXPR $((($WEEKS_TO_KEEP * 7) + 1))`
if [ $DAY_OF_WEEK = $DAY_OF_WEEK_TO_KEEP ];
then
# Delete all expired weekly directories
$FIND $BACKUP_DIR -maxdepth 1 -mtime +$EXPIRED_DAYS -name "*-weekly" -exec rm -rf '{}' ';'
doBackups "weekly"
# That's all folks!
exit 0
fi
#### Daily backups ####
# Delete all expired daily directories
$FIND $BACKUP_DIR -maxdepth 1 -mtime +$DAYS_TO_KEEP -name "*-daily" -exec rm -rf '{}' ';'
doBackups "daily"
# That's all folks!
exit 0