From 3c2302ec390919d4cd583453f6b82075439acba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavi=20Lle=C3=B3=20Tom=C3=A1s?= Date: Fri, 29 Nov 2024 13:11:10 +0100 Subject: [PATCH] Refs #8140: MariaDB Server Deploy - Role WIP --- .../files/mariabackup/bacula-before.sh | 30 +++++++++++ roles/services/files/mariabackup/config.sh | 20 +++++++ .../services/files/mariabackup/inc-backup.sh | 38 +++++++++++++ roles/services/files/mariabackup/my.cnf | 7 +++ .../files/mariabackup/restore-backup.sh | 53 +++++++++++++++++++ 5 files changed, 148 insertions(+) create mode 100644 roles/services/files/mariabackup/bacula-before.sh create mode 100644 roles/services/files/mariabackup/config.sh create mode 100644 roles/services/files/mariabackup/inc-backup.sh create mode 100644 roles/services/files/mariabackup/my.cnf create mode 100644 roles/services/files/mariabackup/restore-backup.sh diff --git a/roles/services/files/mariabackup/bacula-before.sh b/roles/services/files/mariabackup/bacula-before.sh new file mode 100644 index 0000000..f1628fd --- /dev/null +++ b/roles/services/files/mariabackup/bacula-before.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# https://mariadb.com/kb/en/mariabackup/ +set -e + +myDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$myDir/config.sh" + +todayDir="$(date +%Y-%m-%d)" +backupName="${todayDir}_$(date +"%H-%M")_full" +backupFile="$backupDir/$backupName.gz" + +if [ -d "$backupDir" ]; then + rm -rf "$backupDir/"* +fi + +ulimit -n 8192 +mariabackup \ + --defaults-extra-file="$myDir/my.cnf" \ + --backup \ + --extra-lsndir="$backupDir/$backupName" \ + --history="$todayDir" \ + 2>> "$logFile" \ + | gzip \ + > "$backupFile" + +if [ $? != "0" ]; then + echo "An error ocurred during backup, please take a look at log file: $logFile" + exit 1 +fi + diff --git a/roles/services/files/mariabackup/config.sh b/roles/services/files/mariabackup/config.sh new file mode 100644 index 0000000..bb61fd8 --- /dev/null +++ b/roles/services/files/mariabackup/config.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Destination file for backup logs +logFile=/var/log/vn-mariabackup.log + +# Temporary local directory to save backups +backupDir=/mnt/local-backup + +# Directory for backup history +historyDir=/mnt/backup4mariadb + +# Number of days for backup rotation +cleanDays=90 + +# Directory for temporal restore data +restoreDir=/mnt/mysqldata/mysql-restore + +# Directory of MySQL data +dataDir=/mnt/mysqldata/mysql + diff --git a/roles/services/files/mariabackup/inc-backup.sh b/roles/services/files/mariabackup/inc-backup.sh new file mode 100644 index 0000000..c6d6e91 --- /dev/null +++ b/roles/services/files/mariabackup/inc-backup.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# https://mariadb.com/kb/en/incremental-backup-and-restore-with-mariabackup/ +set -e + +myDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$myDir/config.sh" + +todayDir="$(date +%Y-%m-%d)" +todayPath="$historyDir/$todayDir" + +pattern="$todayPath/${todayDir}_??-??_full.xb.gz.enc" +files=($pattern) +backupFile="${files[0]}" +backupBase=$(basename -- "$backupFile") +backupName="${backupBase%%.*}" + +incrementalName="${todayDir}_$(date +"%H-%M")_incremental" +incrementalFile="$backupDir/${incrementalName}.xb.gz.enc" + +ulimit -n 24098 +mariabackup \ + --defaults-extra-file="$myDir/my.cnf" \ + --backup \ + --incremental-basedir="$backupDir/$backupName" \ + --extra-lsndir="$backupDir/$incrementalName" \ + --incremental-history-name="$todayDir" \ + 2>> "$logFile" \ + | gzip \ + | openssl enc -aes-256-cbc -pbkdf2 -kfile "$myDir/xbcrypt.key" \ + > "$incrementalFile" + +if [ $? != "0" ]; then + echo "An error ocurred during backup, please take a look at log file: $logFile" + exit 1 +fi + +cp "$incrementalFile" "$todayPath" +cp -r "$backupDir/$incrementalName" "$todayPath" diff --git a/roles/services/files/mariabackup/my.cnf b/roles/services/files/mariabackup/my.cnf new file mode 100644 index 0000000..14edb89 --- /dev/null +++ b/roles/services/files/mariabackup/my.cnf @@ -0,0 +1,7 @@ +[mariabackup] +host = localhost +user = {{ user_mariabackup }} +password = {{ password_user_mariabackup }} +use-memory = 1G +parallel = 2 +stream = mbstream diff --git a/roles/services/files/mariabackup/restore-backup.sh b/roles/services/files/mariabackup/restore-backup.sh new file mode 100644 index 0000000..0673526 --- /dev/null +++ b/roles/services/files/mariabackup/restore-backup.sh @@ -0,0 +1,53 @@ +#!/bin/bash +# https://mariadb.com/kb/en/using-encryption-and-compression-tools-with-mariabackup/ +set -e + +myDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +. "$myDir/config.sh" + +backupFile=$1 + +if [ -z "$backupFile" ]; then + echo "Backup file not defined." + exit 1 +fi + +if [ ! -f "$backupFile" ]; then + echo "Backup file does not exist: $backupFile" + exit 2 +fi + +echo "Restoring MySQL data from backup." + +rm -rf "$restoreDir" +mkdir -p "$restoreDir" + +echo "Decompresing backup." +gzip --decompress --stdout "$backupFile" \ + | mbstream -x --directory="$restoreDir" + +echo "Preparing backup." +mariabackup \ + --defaults-extra-file="$myDir/my.cnf" \ + --prepare \ + --target-dir="$restoreDir" + +echo "Stopping service." +service mariadb stop +if pgrep mariadbd; then pkill -9 mariadbd; fi + +echo "Restoring data." +rm -rf "$dataDir" +mariabackup \ + --defaults-extra-file="$myDir/my.cnf" \ + --move-back \ + --target-dir="$restoreDir" \ + 2>> "$logFile" +chown -R mysql:mysql "$dataDir" + +rm "$dataDir/mysql/slow_log."* +rm "$dataDir/mysql/general_log."* + +echo "Removing restore data." +rm -r "$restoreDir" +