forked from alvinkohcm/CentOS-Mariabackup
-
Notifications
You must be signed in to change notification settings - Fork 0
/
backup-mysql.sh
executable file
·93 lines (77 loc) · 3.11 KB
/
backup-mysql.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/bin/bash
export LC_ALL=C
days_of_backups=3 # Must be less than 7
#backup_owner="backup"
parent_dir="/backups/mysql"
defaults_file="/etc/my.cnf.d/mariabackup.cnf"
#encryption_key_file="${parent_dir}/encryption_key"
todays_dir="${parent_dir}/$(date +%A)"
log_file="${todays_dir}/backup-progress.log"
now="$(date +%Y-%m-%d_%H-%M-%S)"
processors="$(nproc --all)" # Use all the CPU of cores for compression
#processors="$((`nproc --all`/2))" # Use half the number of cores if live database performance suffers
# Use this to echo to standard error
error () {
printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
exit 1
}
trap 'error "An unexpected error occurred."' ERR
sanity_check () {
# Check user running the script
if [[ -n "${backup_owner}" && "${USER}" != "${backup_owner}" ]]; then
error "Script can only be run as the \"${backup_owner}\" user"
fi
# DISABLED: Check whether the encryption key file is available
#if [ ! -r "${encryption_key_file}" ]; then
# error "Cannot read encryption key at ${encryption_key_file}"
#fi
}
set_options () {
# List the innobackupex arguments
#declare -ga mariabackup_args=(
#"--encrypt=AES256"
#"--encrypt-key-file=${encryption_key_file}"
#"--encrypt-threads=${processors}"
#"--slave-info"
#"--incremental"
mariabackup_args=(
"--defaults-file=${defaults_file}"
"--extra-lsndir=${todays_dir}"
"--backup"
"--compress"
"--stream=xbstream"
"--parallel=${processors}"
"--compress-threads=${processors}"
)
backup_type="full"
# Add option to read LSN (log sequence number) if a full backup has been
# taken today.
if grep -q -s "to_lsn" "${todays_dir}/xtrabackup_checkpoints"; then
backup_type="incremental"
lsn=$(awk '/to_lsn/ {print $3;}' "${todays_dir}/xtrabackup_checkpoints")
mariabackup_args+=( "--incremental-lsn=${lsn}" )
fi
}
rotate_old () {
# Remove the oldest backup in rotation
day_dir_to_remove="${parent_dir}/$(date --date="${days_of_backups} days ago" +%A)"
if [ -d "${day_dir_to_remove}" ]; then
rm -rf "${day_dir_to_remove}"
fi
}
take_backup () {
# Make sure today's backup directory is available and take the actual backup
mkdir -p "${todays_dir}"
find "${todays_dir}" -type f -name "*.incomplete" -delete
#innobackupex "${mariabackup_args[@]}" "${todays_dir}" > "${todays_dir}/${backup_type}-${now}.xbstream.incomplete" 2> "${log_file}"
mariabackup "${mariabackup_args[@]}" "--target-dir=${todays_dir}" > "${todays_dir}/${backup_type}-${now}.xbstream.incomplete" 2> "${log_file}"
mv "${todays_dir}/${backup_type}-${now}.xbstream.incomplete" "${todays_dir}/${backup_type}-${now}.xbstream"
}
sanity_check && set_options && rotate_old && take_backup
# Check success and print message
if tail -1 "${log_file}" | grep -q "completed OK"; then
printf "Backup successful!\n"
printf "Backup created at %s/%s-%s.xbstream\n" "${todays_dir}" "${backup_type}" "${now}"
else
error "Backup failure! Check ${log_file} for more information"
fi