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