This script creates backups of all MySQL databases organized by day of week with automatic rotation (7-day retention).
sudo cp mysql_backup_en.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/mysql_backup_en.sh
Edit the file and specify your credentials:
sudo nano /usr/local/bin/mysql_backup_en.sh
Required parameters:
MYSQL_USER="root" # MySQL user
MYSQL_PASSWORD="your_mysql_password" # MySQL password
MYSQL_HOST="localhost" # MySQL host
BACKUP_DIR="/var/backups/mysql" # Backup directory
Optional FTP parameters:
USE_FTP="yes" # Uncomment to enable
FTP_HOST="ftp.example.com"
FTP_USER="ftpuser"
FTP_PASSWORD="ftppassword"
FTP_DIR="/backups/mysql"
sudo mkdir -p /var/backups/mysql
sudo mkdir -p /var/log
sudo touch /var/log/mysql_backup.log
sudo chmod 755 /var/backups/mysql
sudo chmod 644 /var/log/mysql_backup.log
sudo /usr/local/bin/mysql_backup_en.sh
Check the log:
tail -f /var/log/mysql_backup.log
sudo crontab -e
Add this line:
0 2 * * * /usr/local/bin/mysql_backup_en.sh >> /var/log/mysql_backup.log 2>&1
Every 6 hours:
0 */6 * * * /usr/local/bin/mysql_backup_en.sh >> /var/log/mysql_backup.log 2>&1
Twice daily (2:00 AM and 2:00 PM):
0 2,14 * * * /usr/local/bin/mysql_backup_en.sh >> /var/log/mysql_backup.log 2>&1
Weekdays only at 3:00 AM:
0 3 * * 1-5 /usr/local/bin/mysql_backup_en.sh >> /var/log/mysql_backup.log 2>&1
/var/backups/mysql/
├── Monday/
│ ├── database1_20250205_020001.sql.gz
│ └── database2_20250205_020015.sql.gz
├── Tuesday/
│ ├── database1_20250206_020001.sql.gz
│ └── database2_20250206_020015.sql.gz
├── Wednesday/
...
└── Sunday/
Each day of the week has its own folder, old backups are automatically deleted after 7 days.
sudo nano /root/.my.cnf
[client]
user=root
password=your_mysql_password
host=localhost
sudo chmod 600 /root/.my.cnf
# Instead of -p"$MYSQL_PASSWORD" just use commands without password
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -e "SHOW DATABASES;"
mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" ...
gunzip < /var/backups/mysql/Monday/database_name_20250205_020001.sql.gz | mysql -u root -p database_name
# 1. Decompress
gunzip /var/backups/mysql/Monday/database_name_20250205_020001.sql.gz
# 2. Restore
mysql -u root -p database_name < /var/backups/mysql/Monday/database_name_20250205_020001.sql
tail -n 50 /var/log/mysql_backup.log
du -sh /var/backups/mysql/*
find /var/backups/mysql -name "*.sql.gz" -mtime -1 -ls
Add to cron for email reports:
0 2 * * * /usr/local/bin/mysql_backup_en.sh 2>&1 | mail -s "MySQL Backup Report" admin@example.com
Or modify the script by adding at the end of main() function:
# Send email report
echo "Backup completed. Success: $success, Failed: $failed" | \
mail -s "MySQL Backup - $DATE" admin@example.com
# Debian/Ubuntu
sudo apt-get install gzip ftp lftp mailutils
# CentOS/RHEL
sudo yum install gzip ftp lftp mailx
The mysql_backup_advanced_en.sh script includes:
To use the advanced version:
sudo cp mysql_backup_advanced_en.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/mysql_backup_advanced_en.sh
Enable email notifications by setting:
ENABLE_EMAIL="yes"
EMAIL_TO="admin@example.com"
For issues or improvements:
/var/log/mysql_backup.log