-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmysql-backup.sh
72 lines (59 loc) · 1.81 KB
/
mysql-backup.sh
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
#!/bin/bash
# Example Usage:
# > chmod u+x backup-mysql-db-script.sh
# > ./backup-mysql-db-script.sh daily
# 0. Install zip.
# > sudo apt-get install zip
# 1. Create a MySQL backup user with limited access to each database you want to back up.
# > mysql -u root -p
# > CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'STRONGPASSWORD';
# > GRANT SELECT,LOCK TABLES ON databse-a.* TO 'backup_user'@'localhost';
# 2. Set database configurations below:
DB_USER=""
DB_PASS=""
DB_HOST="" #usually just 'localhost'
BASE_DIR="/path/to/backup/dir"
DB_NAMES=('database-a' 'database-b' 'database-c' )
#default file postfixes
NOWNAME="now"
BEFORENAME="before"
case "$1" in
'daily')
NOWNAME="today"
BEFORENAME="yesterday"
;;
'weekly')
NOWNAME="thisweek"
BEFORENAME="lastweek"
;;
'monthly')
NOWNAME="thismonth"
BEFORENAME="lastmonth"
;;
esac
#current date/time YYY-MM-DD-hhmm
NOW=$(date +"%Y-%m-%d-%H%M")
for DB_NAME in "${DB_NAMES[@]}"; do
#output directory
OUTPUT_DIR="$BASE_DIR/$DB_NAME"
#create the DB directory if it doesn't exist
if [ ! -d $OUTPUT_DIR ]; then
mkdir $OUTPUT_DIR
fi
#delete "before" zip
if [ -f $OUTPUT_DIR/$DB_NAME.sql.$BEFORENAME.zip ]; then
rm $OUTPUT_DIR/$DB_NAME.sql.$BEFORENAME.zip
fi
#rename "now" zip to "before" zip
if [ -f $OUTPUT_DIR/$DB_NAME.sql.$NOWNAME.zip ]; then
mv $OUTPUT_DIR/$DB_NAME.sql.$NOWNAME.zip $OUTPUT_DIR/$DB_NAME.sql.$BEFORENAME.zip
fi
#mysqldump sql script
mysqldump --user=$DB_USER --password=$DB_PASS --databases $DB_NAME > $DB_NAME.$NOW.sql
if [ -f $DB_NAME.$NOW.sql ]; then
#zip to now zip
zip -q $OUTPUT_DIR/$DB_NAME.sql.$NOWNAME.zip $DB_NAME.$NOW.sql
#delete mysql dump file
rm $DB_NAME.$NOW.sql
fi
done