-
Notifications
You must be signed in to change notification settings - Fork 0
/
backup-mysql-all-db
76 lines (63 loc) · 2.4 KB
/
backup-mysql-all-db
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
#!/bin/bash
LANG=C
# Variables
FTP_HOST=""
FTP_USER=""
FTP_PASS=""
DAYS_TO_KEEP=30
BACKUP_PATH="/backup/$(hostname)/sql"
CMD_DIR=$(dirname $0)
CMD_NAME=$(basename $0)
NEW_TMP_DIR="/tmp/${CMD_NAME}"
MY_CNF="/root/.my.cnf"
# Create necessary directories
mkdir -p "${NEW_TMP_DIR}"
mkdir -p "${BACKUP_PATH}"
# Lockfile check
if [ -e ${NEW_TMP_DIR}/lock ]; then
echo "Already running with lockfile ${NEW_TMP_DIR}/lock"
exit 1
else
touch ${NEW_TMP_DIR}/lock
fi
# Cleanup function
function cleanup {
rm -rf "$NEW_TMP_DIR"
}
# Trap cleanup on exit and SIGTERM
trap 'cleanup' EXIT SIGTERM
# Retrieve MySQL credentials
USER=$(grep -m 1 'user' ${MY_CNF} | awk '{print $3}')
PASS=$(grep -m 1 'password' ${MY_CNF} | awk '{print $3}')
# Function to get Seconds_Behind_Master
get_seconds_behind_master() {
mysql -u"$USER" -p"$PASS" -e "SHOW SLAVE STATUS\G;" | grep 'Seconds_Behind_Master' | awk '{print $2}'
}
# Wait until Seconds_Behind_Master is 0
while true; do
SECONDS_BEHIND=$(get_seconds_behind_master)
if [ "$SECONDS_BEHIND" -eq 0 ]; then
echo "Replication caught up, Seconds_Behind_Master is 0."
break
else
echo "Seconds_Behind_Master is $SECONDS_BEHIND, waiting..."
sleep 5 # Wait for 5 seconds before checking again
fi
done
# Set the DAY variable after replication has caught up
DAY=$(date +%y%m%d-%H-%M)
# Backup operations
mysql -u "$USER" -p"$PASS" -e "STOP SLAVE;"
mysql -u "$USER" -p"$PASS" -e "SHOW MASTER STATUS\G;" > "${BACKUP_PATH}/${DAY}-master-status.txt"
mysql -u "$USER" -p"$PASS" -e "SHOW SLAVE STATUS\G;" > "${BACKUP_PATH}/${DAY}-slave-status.txt"
mysql -u "$USER" -p"$PASS" -e "SHOW DATABASES" | while read DBNAME; do
echo "Dumping $DBNAME"
nice -n19 ionice -c 3 mysqldump --lock-tables --skip-extended-insert --single-transaction --flush-privileges --routines --triggers -u "$USER" -p"$PASS" "$DBNAME" | nice -n19 ionice -c 3 gzip > "${BACKUP_PATH}/${DAY}-${DBNAME}.sql.gz"
done
mysql -u "$USER" -p"$PASS" -e "START SLAVE;"
# Clean up old backups
find ${BACKUP_PATH}/* -type f -ctime +${DAYS_TO_KEEP} -exec nice -n19 ionice -c 3 rm -f {} \;
# Transfer all to FTP
if [ "$FTP_HOST" != "" ]; then
trickle -u 8096 -d 8096 nice -n19 ionice -c 3 lftp -c "set ftp:list-options -a; set ssl:verify-certificate no; open ftp://$FTP_USER:$FTP_PASS@$FTP_HOST; lcd ${BACKUP_PATH}; mkdir -p ${BACKUP_PATH}; cd ${BACKUP_PATH}; mirror --reverse --delete --verbose"
fi