-
Notifications
You must be signed in to change notification settings - Fork 4
/
suse.de-mysql-backup
213 lines (203 loc) · 6.72 KB
/
suse.de-mysql-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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#!/bin/bash
# Simple backupscript for MySQL databases
# Author: Lars Vogdt
# BSD3 Clause License
#
# $Id$
#
PATH=/bin:/usr/bin
MAILX="/usr/bin/mail"
MYSQL_CHECK="/usr/bin/mysqlcheck"
MYSQLADMIN="/usr/bin/mysqladmin"
MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"
DISTCONFIG="/etc/sysconfig/mysql-backupscript"
##################################################
# Default/Fallback values
# Don't change them here! Use $DISTCONFIG instead
##################################################
BACKUPDIR="/root/backup/db"
FQHOSTNAME=`hostname -f`
HOST=$(hostname -s 2>/dev/null)
LOGNAME="mysql-backup"
LOGFILE="/var/log/${LOGNAME}.log"
EMAIL="root@localhost"
START_BACKUP="yes"
OPTIMIZE_DB="no"
##################################################
umask 027
unset LANG;
function cleanup_and_exit(){
test -n "$TMPFILE" -a -f "$TMPFILE" && rm "$TMPFILE"
exit $1
}
function LOG(){
local MESSAGE="$1"
local LOG_DATE=$(date "+%b %d %H:%M:%S")
if [ -z "$LOGFILE" ]; then
echo "ERROR: LOGFILE is not defined" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
cleanup_and_exit 1
fi
if [ ! -d "$LOGDIR" ]; then
mkdir -p "$LOGDIR" || exit 1
echo "$LOG_DATE $HOST $LOGNAME[$$]: function LOG created $LOGDIR" > "$LOGFILE"
fi
echo "$LOG_DATE $HOST $LOGNAME[$$]: $MESSAGE" >> $LOGFILE || DEBUG="yes"
if [ "$DEBUG" = "yes" ]; then
echo "DEBUG: $MESSAGE"
fi
}
function test_mysql_alive(){
local tmpfile="$1"
if [ -x "$MYSQLADMIN" ]; then
"$MYSQLADMIN" ping 1>/dev/null 2>>"$tmpfile"
if [ -s "$tmpfile" ]; then
echo "ERROR: $(cat "$tmpfile")" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG $(cat "$tmpfile")
cleanup_and_exit 1
fi
elif [ -x "$MYSQL" ]; then
"$MYSQL" -e "SHOW DATABASES;" >/dev/null 2>>"$tmpfile"
if [ $? != 0 ]; then
echo "ERROR: $(cat "$tmpfile")" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG $(cat "$tmpfile")
cleanup_and_exit 1
fi
else
echo "Could neither execute $MYSQLADMIN nor $MYSQL" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG "ERROR: Could neither execute $MYSQLADMIN nor $MYSQL"
cleanup_and_exit 1
fi
if [ ! -x "$MYSQLDUMP" ]; then
echo "ERROR: Could not execute $MYSQLDUMP" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG "ERROR: Could not execute $MYSQLDUMP"
cleanup_and_exit 1
fi
}
function optimize() {
if [ -x "$MYSQL_CHECK" ]; then
LOG "Starting automatic repair and optimization of the databases/tables"
"$MYSQL_CHECK" \
--all-databases \
--compress \
--auto-repair \
--optimize \
-u root 1>/dev/null 2>"$TMPFILE"
"$MYSQL" -e "FLUSH QUERY CACHE;" 2>>"$TMPFILE"
fi
}
function print_help(){
echo "Usage: $(basename $0) [-c <configfile>]"
echo
echo " -h : print this message"
echo " -c <configfile> : use the given config file instead of $DISTCONFIG"
echo
echo " The target of this script is to create backups of your mysql databases"
echo " on a regular daily bases."
echo " Please find the configuration details in $DISTCONFIG - if you want to"
echo " test something, the option -f might be useful to use another file containing"
echo " the configuration."
echo
echo " PLEASE NOTE: "
echo " Please have a look at __READMEFILE__"
echo " as this contains information for password protected databases and further"
echo " details."
exit 0
}
trap cleanup_and_exit 0 1 2 3 7 13 15
while getopts 'hc:' OPTION ; do
case $OPTION in
h) print_help
;;
c) DISTCONFIG="$OPTARG"
;;
esac
done
shift $(( OPTIND - 1 ))
# source our config
if [ -f "$DISTCONFIG" ]; then
. "$DISTCONFIG"
LOGDIR=$(dirname "$LOGFILE")
else
echo "$DISTCONFIG not found - using defaults" >&2
LOGDIR=$(dirname "$LOGFILE")
LOG "$DISTCONFIG not found - using defaults"
fi
case "$START_BACKUP" in
[Yy]*)
DATE=$(date "+%Y%m%d")
TMPFILE=$(mktemp /tmp/mysql-backupscript-XXXXXX)
if [ ! -d "$BACKUPDIR" ]; then
case "$CREATE_BACKUPDIR" in
[Nn][Oo])
echo "ERROR: $BACKUPDIR does not exist. Exiting as CREATE_BACKUPDIR is set to 'no' in $DISTCONFIG" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG "ERROR: $BACKUPDIR does not exist. Exiting as CREATE_BACKUPDIR is set to 'no' in $DISTCONFIG"
cleanup_and_exit 1
;;
[Ss][Kk][Ii][Pp])
cleanup_and_exit 0
;;
*)
mkdir -p "$BACKUPDIR"
;;
esac
fi
if [ -d "$BACKUPDIR/$DATE" ]; then
echo "ERROR: $BACKUPDIR/$DATE exists" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG "$BACKUPDIR/$DATE already exists - aborting backup"
cleanup_and_exit 1
else
mkdir -p "$BACKUPDIR/$DATE" 2>"$TMPFILE" || {
echo "ERROR: $(cat "$TMPFILE")" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL;
LOG "$(cat "$TMPFILE")"
cleanup_and_exit 1
}
fi
pushd "$BACKUPDIR/$DATE" 1>/dev/null
LOG "Creating backup of my.cnf"
test -f /etc/my.cnf && cp /etc/my.cnf .
test_mysql_alive "$TMPFILE"
"$MYSQL" -e "FLUSH LOGS;" 2>"$TMPFILE"
# start the real backup
for db in `"$MYSQL" -e "SHOW DATABASES;" 2>>"$TMPFILE" | tail -n +2 | grep -v information_schema`; do
if [ -s "$TMPFILE" ]; then
echo "MYSQLERROR: $(cat "$TMPFILE")" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG "$(cat "$TMPFILE")"
cleanup_and_exit 1
fi
LOG "Creating backup of $db"
echo "-- " >> "$db.sql"
echo "-- $db backup from $FQHOSTNAME on $DATE" > "$db.sql"
echo "-- " >> "$db.sql"
echo "" >> "$db.sql"
echo "DROP DATABASE IF EXISTS \`$db\`;" >> "$db.sql"
echo "CREATE DATABASE \`$db\` DEFAULT CHARACTER SET utf8;" >> "$db.sql"
echo "USE \`$db\`;" >> "$db.sql"
echo "" >> "$db.sql"
"$MYSQLDUMP" --opt --quote-names --default-character-set=utf8 "$db" >> "$db.sql"
bzip2 "$db.sql"
chmod 640 $db.sql*
done
case "$OPTIMIZE_DB" in
[Yy][Ee][Ss])
optimize
;;
esac
if [ -s "$TMPFILE" ]; then
echo "MYSQLERROR: $(cat "$TMPFILE")" | $MAILX -s "[$LOGNAME] error on $FQHOSTNAME" $EMAIL
LOG "$(cat "$TMPFILE")"
cleanup_and_exit 1
fi
popd 1>/dev/null
chmod 750 "$BACKUPDIR/$DATE"
if [ -n "$RETENTION" -a "$RETENTION" -gt 0 ]; then
LOG "removing backups older than $RETENTION days"
find "$BACKUPDIR" -ctime +$RETENTION -print0 | xargs -0 rm -rf {} | grep -v "No such file or directory"
fi
LOG "backup finished"
cleanup_and_exit 0
;;
*)
cleanup_and_exit 0
;;
esac