-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmysql-backup.sh
75 lines (65 loc) · 3.27 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
73
74
75
#!/bin/bash
BACKUPDIR=$HOME/backup/mysql
DAYS=7
TIMESTAMP=$(date +"%Y%m%d%H%M")
CONTAINER=$(docker ps --format '{{.Names}}:{{.Image}}' | grep 'mysql\|mariadb' | cut -d":" -f1)
if [ ! -d $BACKUPDIR ]; then
echo -e "Creating backup directory:\n $BACKUPDIR\n"
mkdir -p $BACKUPDIR
fi
echo -e "Start $TIMESTAMP Backup for Databases: \n"
for i in $CONTAINER; do
DATABASE_USER_ENV=$(docker exec $i env | grep -E 'MYSQL_USER|MARIADB_USER' | cut -d"=" -f1)
case "$DATABASE_USER_ENV" in
MYSQL_USER)
DATABASE_USER=$(docker exec $i printenv MYSQL_USER)
DATABASE_PASSWORD=$(docker exec $i printenv MYSQL_PASSWORD)
;;
MARIADB_USER)
DATABASE_USER=$(docker exec $i printenv MARIADB_USER)
DATABASE_PASSWORD=$(docker exec $i printenv MARIADB_PASSWORD)
;;
*)
ROOT_DATABASE_USER_ENV=$(docker exec $i env | grep -E 'MYSQL_ROOT_USER|MARIADB_ROOT_USER' | cut -d"=" -f1)
case "$ROOT_DATABASE_USER_ENV" in
MYSQL_ROOT_USER)
DATABASE_USER=$(docker exec $i printenv MYSQL_ROOT_USER)
DATABASE_PASSWORD=$(docker exec $i printenv MYSQL_ROOT_PASSWORD)
;;
MARIADB_ROOT_USER)
DATABASE_USER=$(docker exec $i printenv MARIADB_ROOT_USER)
DATABASE_PASSWORD=$(docker exec $i printenv MARIADB_ROOT_PASSWORD)
;;
*)
DATABASE_USER="root"
;;
esac
;;
esac
MYSQL_PWD=$(docker exec $i env | grep MYSQL_ROOT_PASSWORD | cut -d"=" -f2)
if [ -n "$DATABASE_PASSWORD" ]; then
DATABASE_PASSWORD_OPTION="-p$DATABASE_PASSWORD"
else
DATABASE_PASSWORD_OPTION=""
fi
if docker exec $i test -e /usr/bin/mysqldump; then
DATABASES=$(docker exec -e MYSQL_PWD=$MYSQL_PWD $i mysql -u $DATABASE_USER $DATABASE_PASSWORD_OPTION -s -e "show databases" | grep -Ev "(Database|information_schema|performance_schema|mysql)")
for MYSQL_DATABASE in $DATABASES; do
echo -e " create MYSQL Backup for Database on Container:\n * $MYSQL_DATABASE DB on $i \n";
docker exec -e MYSQL_PWD=$MYSQL_PWD $i /usr/bin/mysqldump -u $DATABASE_USER $DATABASE_PASSWORD_OPTION $MYSQL_DATABASE | gzip > $BACKUPDIR/$i-$MYSQL_DATABASE-$TIMESTAMP.sql.gz
done
elif docker exec $i test -e /usr/bin/mariadb-dump; then
DATABASES=$(docker exec -e MYSQL_PWD=$MYSQL_PWD $i mariadb -u $DATABASE_USER $DATABASE_PASSWORD_OPTION -s -e "show databases" | grep -Ev "(Database|information_schema|performance_schema|mysql)")
for MYSQL_DATABASE in $DATABASES; do
echo -e " create MariaDB Backup for Database on Container:\n * $MYSQL_DATABASE DB on $i \n";
docker exec -e MYSQL_PWD=$MYSQL_PWD $i /usr/bin/mariadb-dump -u $DATABASE_USER $DATABASE_PASSWORD_OPTION $MYSQL_DATABASE | gzip > $BACKUPDIR/$i-$MYSQL_DATABASE-$TIMESTAMP.sql.gz
done
else
echo " ERROR: cannot find dump command for container $i!"
fi
OLD_BACKUPS=$(ls -1 $BACKUPDIR/$i*.gz | wc -l)
if [ $OLD_BACKUPS -gt $DAYS ]; then
find $BACKUPDIR -name "$i*.gz" -daystart -mtime +$DAYS -delete
fi
done
echo -e "Backup for Databases completed\n"