Prerequisites
Before testing backup integrity, make sure you have:
- SSH access to your VPS
- Existing backups (from Article 48)
- Sufficient disk space for test restore
Step 1: Test File Backup Integrity (Tar/Gzip)
Connect to your VPS:
ssh hxroot@YOUR_SERVER_IP -p 22
Test tar archive:
tar -tzf /backup/website_20260429.tar.gz > /dev/null
if [ $? -eq 0 ]; then
echo "Backup is valid"
else
echo "Backup is corrupted"
fi
Step 2: Test Database SQL Backup
Check if SQL file contains valid data:
gunzip -c /backup/mysql/all_databases_20260429.sql.gz | head -100 | grep "CREATE DATABASE"
Check for errors in SQL file:
gunzip -c /backup/mysql/all_databases_20260429.sql.gz | mysql --force --silent --batch -e "SELECT 1" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "SQL backup appears valid"
else
echo "SQL backup has errors"
fi
Step 3: Test Restore to a Temporary Database
Create test database:
mysql -e "CREATE DATABASE test_restore"
Restore backup into test database:
gunzip -c /backup/mysql/all_databases_20260429.sql.gz | mysql test_restore
Verify:
mysql -e "SHOW TABLES FROM test_restore"
Drop test database after verification:
mysql -e "DROP DATABASE test_restore"
Step 4: Automated Integrity Check Script
sudo nano /usr/local/bin/verify-backups.sh
#!/bin/bash
BACKUP_DIR="/backup"
LOG_FILE="/var/log/backup-verify.log"
date >> $LOG_FILE
# Check if backup files exist
LATEST_FILE=$(ls -t $BACKUP_DIR/all_databases_*.sql.gz 2>/dev/null | head -1)
if [ -z "$LATEST_FILE" ]; then
echo "ERROR: No backup files found!" >> $LOG_FILE
exit 1
fi
# Test integrity
if gunzip -t "$LATEST_FILE" 2>/dev/null; then
echo "OK: $LATEST_FILE is valid" >> $LOG_FILE
else
echo "FAILED: $LATEST_FILE is corrupted" >> $LOG_FILE
echo "Backup verification failed" | mail -s "Backup Corrupted" admin@example.com
fi
Make executable and schedule:
chmod +x /usr/local/bin/verify-backups.sh
echo "0 8 * * * /usr/local/bin/verify-backups.sh" | sudo crontab -
Step 5: Check Backup File Size (Sudden Change Indicates Issues)
LATEST_SIZE=$(stat -c%s "$LATEST_FILE")
YESTERDAY_SIZE=$(stat -c%s $(ls -t $BACKUP_DIR/*.sql.gz | head -2 | tail -1))
DIFF=$((LATEST_SIZE - YESTERDAY_SIZE))
if [ $DIFF -lt -10000 ] || [ $DIFF -gt 10000 ]; then
echo "WARNING: Backup size changed significantly" >> $LOG_FILE
fi
✅ Backup integrity verified. Regular testing ensures you can actually restore when needed.