initial
This commit is contained in:
commit
423f8ce989
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/.idea
|
201
rlmariabackup
Executable file
201
rlmariabackup
Executable file
@ -0,0 +1,201 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
info() {
|
||||||
|
printf "\033[36m%s\033[0m\n" "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
printf "\033[33m%s\033[0m\n" "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
printf "\033[91merror: %s\033[0m\n" "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
error "$*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_timestamp() {
|
||||||
|
date "+%Y%m%d_%H%M%S"
|
||||||
|
}
|
||||||
|
|
||||||
|
save_environment_info() {
|
||||||
|
backup_dir="$1"
|
||||||
|
info_file="$backup_dir/backup_info.txt"
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "Backup created at: $(date)"
|
||||||
|
echo "Host: $(hostname)"
|
||||||
|
echo "MariaDB version: $(mariadb --version 2>/dev/null)"
|
||||||
|
echo "Operating System: $(uname -a)"
|
||||||
|
} > "$info_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup_old_backups() {
|
||||||
|
keep_count=$((MAX_BACKUPS - 1))
|
||||||
|
|
||||||
|
[ $keep_count -lt 1 ] && return
|
||||||
|
|
||||||
|
cd "$BACKUP_DIR"
|
||||||
|
ls -dt */ 2>/dev/null | tail -n +$((keep_count + 1)) | xargs -r rm -rf
|
||||||
|
}
|
||||||
|
|
||||||
|
do_backup() {
|
||||||
|
timestamp=$(get_timestamp)
|
||||||
|
backup_dir="$BACKUP_DIR/$timestamp"
|
||||||
|
|
||||||
|
mkdir -p "$backup_dir"
|
||||||
|
|
||||||
|
cmd="mariabackup --backup --target-dir='$backup_dir' --user='$MARIADB_USER' --password='$MARIADB_PASSWORD'"
|
||||||
|
[ "$COMPRESS" = "1" ] && cmd="$cmd --compress"
|
||||||
|
[ -n "$PARALLEL_THREADS" ] && cmd="$cmd --parallel=$PARALLEL_THREADS"
|
||||||
|
[ -n "$EXTRA_OPTIONS" ] && cmd="$cmd $EXTRA_OPTIONS"
|
||||||
|
|
||||||
|
cleanup_old_backups
|
||||||
|
|
||||||
|
info "Starting backup to $backup_dir"
|
||||||
|
eval "$cmd" 2>&1 | tee "$backup_dir/backup.log"
|
||||||
|
|
||||||
|
save_environment_info "$backup_dir"
|
||||||
|
|
||||||
|
info "Backup completed successfully"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_prepare() {
|
||||||
|
[ -z "$1" ] && die "Backup directory must be specified"
|
||||||
|
backup_dir="$1"
|
||||||
|
[ -d "$backup_dir" ] || die "Backup directory does not exist: $backup_dir"
|
||||||
|
|
||||||
|
info "Preparing backup in $backup_dir"
|
||||||
|
mariabackup --prepare --target-dir="$backup_dir"
|
||||||
|
info "Backup preparation completed"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_restore() {
|
||||||
|
[ -z "$1" ] && die "Backup directory must be specified"
|
||||||
|
backup_dir="$1"
|
||||||
|
[ -d "$backup_dir" ] || die "Backup directory does not exist: $backup_dir"
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
WARNING: Before restoring, ensure that:
|
||||||
|
1. The backup has been prepared using 'prepare' command
|
||||||
|
2. MariaDB service is stopped
|
||||||
|
3. The data directory is empty
|
||||||
|
|
||||||
|
To restore, run the following commands:
|
||||||
|
|
||||||
|
# Stop MariaDB service
|
||||||
|
systemctl stop mariadb # or equivalent for your system
|
||||||
|
|
||||||
|
# Backup and prepare data directory
|
||||||
|
mv /var/lib/mysql /var/lib/mysql.bak
|
||||||
|
mkdir /var/lib/mysql
|
||||||
|
|
||||||
|
# Restore backup
|
||||||
|
mariabackup --copy-back --target-dir='$backup_dir' --datadir=/var/lib/mysql
|
||||||
|
|
||||||
|
# Fix permissions
|
||||||
|
chown -R mysql:mysql /var/lib/mysql
|
||||||
|
|
||||||
|
# Start MariaDB service
|
||||||
|
systemctl start mariadb # or equivalent for your system
|
||||||
|
|
||||||
|
# Verify the service is running
|
||||||
|
systemctl status mariadb
|
||||||
|
|
||||||
|
Note: For FreeBSD, use 'service mysql start/stop' instead of systemctl commands
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
do_grants() {
|
||||||
|
# Check if MARIADB_USER and MARIADB_PASSWORD are provided
|
||||||
|
[ -z "$MARIADB_USER" ] && die "MARIADB_USER is required for grants command (use -u or --user)"
|
||||||
|
[ -z "$MARIADB_PASSWORD" ] && die "MARIADB_PASSWORD is required for grants command (use -p or --password)"
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
-- Run these commands as root in MariaDB to set up backup user:
|
||||||
|
CREATE USER '$MARIADB_USER'@'localhost' IDENTIFIED BY '$MARIADB_PASSWORD';
|
||||||
|
GRANT RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR ON *.* TO '$MARIADB_USER'@'localhost';
|
||||||
|
GRANT REPLICATION CLIENT ON *.* TO '$MARIADB_USER'@'localhost';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
show_help() {
|
||||||
|
cat << EOF
|
||||||
|
USAGE: $0 [OPTIONS] <COMMAND> [ARGS]
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
backup Create a new backup
|
||||||
|
prepare <DIR> Prepare a backup for restoration
|
||||||
|
restore <DIR> Show instructions for restoring a backup
|
||||||
|
grants Show SQL commands to create backup user
|
||||||
|
help Show this help message
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-u, --user <user> MariaDB backup user (required for backup and grants)
|
||||||
|
-p, --password <pass> MariaDB backup user password (required for backup and grants)
|
||||||
|
-d, --backup-dir <dir> Directory to store backups (required for backup)
|
||||||
|
-m, --max-backups <num> Maximum number of backups to keep (default: 3)
|
||||||
|
-t, --threads <num> Number of parallel threads (default: 4)
|
||||||
|
-c, --compress <0|1> Enable/disable backup compression (default: 1)
|
||||||
|
-e, --extra-options <str> Additional options to pass to mariabackup
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
$0 -u backupuser -p secret -d /backups backup
|
||||||
|
$0 prepare /backups/20240101_120000
|
||||||
|
$0 restore /backups/20240101_120000
|
||||||
|
$0 -u backupuser -p secret grants
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# check required utilities
|
||||||
|
for cmd in mariabackup mariadb; do
|
||||||
|
command -v "$cmd" >/dev/null 2>&1 || die "$cmd not found in PATH"
|
||||||
|
done
|
||||||
|
|
||||||
|
MAX_BACKUPS=3
|
||||||
|
PARALLEL_THREADS=4
|
||||||
|
COMPRESS=1
|
||||||
|
EXTRA_OPTIONS=
|
||||||
|
WORK_DIR=
|
||||||
|
COMMAND=
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
-u|--user) MARIADB_USER="$2"; shift ;;
|
||||||
|
-p|--password) MARIADB_PASSWORD="$2"; shift ;;
|
||||||
|
-d|--backup-dir) BACKUP_DIR="$2"; shift ;;
|
||||||
|
-m|--max-backups) MAX_BACKUPS="$2"; shift ;;
|
||||||
|
-t|--threads) PARALLEL_THREADS="$2"; shift ;;
|
||||||
|
-c|--compress) COMPRESS="$2"; shift ;;
|
||||||
|
-e|--extra-options) EXTRA_OPTIONS="$2"; shift ;;
|
||||||
|
-h|--help) COMMAND=help ;;
|
||||||
|
backup|grants|help) COMMAND="$1" ;;
|
||||||
|
prepare|restore)
|
||||||
|
COMMAND="$1"
|
||||||
|
WORK_DIR="$2"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
die "Unknown option: $1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$COMMAND" = "backup" ]; then
|
||||||
|
[ -z "$MARIADB_USER" ] && die "MARIADB_USER is required (use -u or --user)"
|
||||||
|
[ -z "$MARIADB_PASSWORD" ] && die "MARIADB_PASSWORD is required (use -p or --password)"
|
||||||
|
[ -z "$BACKUP_DIR" ] && die "BACKUP_DIR is required (use -d or --backup-dir)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$COMMAND" in
|
||||||
|
backup) do_backup ;;
|
||||||
|
prepare) do_prepare "$WORK_DIR" ;;
|
||||||
|
restore) do_restore "$WORK_DIR" ;;
|
||||||
|
grants) do_grants ;;
|
||||||
|
*) show_help ;;
|
||||||
|
esac
|
Loading…
x
Reference in New Issue
Block a user