-
-
Save sutlxwhx/7355dd1a65ea2a0889fb8dee6059283e to your computer and use it in GitHub Desktop.
| #!/usr/bin/env bash | |
| # To run this script you need to install https://rclone.org/ first | |
| # Use current date and time for future backup folder name | |
| TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S") | |
| # Declare the directory where the temporary backup files will be stored | |
| BACKUP_DIR="/backup/$TIMESTAMP/mysql" | |
| # State the username for your MySQL / MariaDB instace that can access the neccessary databases | |
| MYSQL_USER="" | |
| # Point this script to mysql executable file | |
| MYSQL=/usr/bin/mysql | |
| # State the password to the username above | |
| # Be aware that using plain password is unsecure | |
| MYSQL_PASSWORD="" | |
| # Point this script to mysqldump executable file | |
| MYSQLDUMP=/usr/bin/mysqldump | |
| # Declare the name of the remote that will be used as a remote storage | |
| REMOTE="" | |
| # Create the temporary backup directory in case it doesn't exist | |
| mkdir -p "$BACKUP_DIR" | |
| # Get the list of all databases in your local MySQL / MariaDB instance | |
| databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"` | |
| # Start a cycle | |
| for db in $databases; do | |
| # Echo the starting notice | |
| echo -e "===\nStarted working with the $db." | |
| # Use mysqldump to create and actual backup of your database | |
| $MYSQLDUMP --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db > "$BACKUP_DIR/$db.sql" | |
| # Use rclone to upload files to the remote backup server | |
| rclone copy $BACKUP_DIR $REMOTE:$BACKUP_DIR | |
| # Echo the result | |
| echo -e "===\nFinished backup process for $db. Check your remote folder or watch for errors." | |
| done |
Why not using "rclone rcat" ?
https://rclone.org/commands/rclone_rcat/
I am not sure rcat behaves the same way as copy while processing files and folders
I have 2 sugestions
first, let give some compression to file
$MYSQLDUMP --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/$db.sql.gz"
and copy only that file
rclone copy "$BACKUP_DIR/$db.sql.gz" $REMOTE:$BACKUP_DIR
I try and get error
backup_db_new.sh: 23: /backup_db_new.sh: Syntax error: word unexpected (expecting "do")
For me I use SSH to remotely create the backups which gets stored locally.
ssh -C remoteuser@remote_host mysqldump -u MYSQL_USER -p'MYSQL_PASSWORD' --all-databases | gzip -c | cat > backup.sql-date +%Y%m%d%H%M%S.gz
This way I don't have to deal with rsync or rclone. I use --all-databases to backup all databases. You can specify which database if you want.
how to exclude some database?
Why not using "rclone rcat" ?
https://rclone.org/commands/rclone_rcat/