1
0

test_dr.sh 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/bin/bash
  2. # test_dr.sh - Automated Disaster Recovery validation script
  3. # 1. Find the latest backup
  4. BACKUP_DIR="./backups"
  5. if [ ! -d "$BACKUP_DIR" ]; then
  6. echo "❌ No backups directory found!"
  7. exit 1
  8. fi
  9. LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/food_db_*.sql.gz 2>/dev/null | head -n 1)
  10. if [ -z "$LATEST_BACKUP" ]; then
  11. echo "❌ No backup files found in $BACKUP_DIR!"
  12. exit 1
  13. fi
  14. echo "✅ Found latest backup: $LATEST_BACKUP"
  15. # 2. Spin up a sandbox MySQL container
  16. CONTAINER_NAME="dr_test_mysql_$(date +%s)"
  17. echo "🚀 Spinning up sandbox MySQL container: $CONTAINER_NAME"
  18. docker run --name "$CONTAINER_NAME" -e MYSQL_ROOT_PASSWORD=DRTestPass123! -d mysql:8.0
  19. # 3. Wait for MySQL to be ready
  20. echo "⏳ Waiting for MySQL to initialize..."
  21. for i in {1..30}; do
  22. if docker exec "$CONTAINER_NAME" mysqladmin ping -u root -pDRTestPass123! --silent; then
  23. echo "✅ MySQL Sandbox is ready!"
  24. break
  25. fi
  26. sleep 2
  27. if [ "$i" -eq 30 ]; then
  28. echo "❌ Sandbox failed to initialize."
  29. docker rm -f "$CONTAINER_NAME"
  30. exit 1
  31. fi
  32. done
  33. # 4. Import the backup
  34. echo "📥 Restoring backup into Sandbox..."
  35. # Create the database first since mysqldump might not contain CREATE DATABASE if dumped without --databases
  36. docker exec "$CONTAINER_NAME" mysql -u root -pDRTestPass123! -e "CREATE DATABASE IF NOT EXISTS food_db;"
  37. gunzip -c "$LATEST_BACKUP" | docker exec -i "$CONTAINER_NAME" mysql -u root -pDRTestPass123! food_db
  38. if [ $? -eq 0 ]; then
  39. echo "✅ Database successfully restored!"
  40. else
  41. echo "❌ Failed to restore database."
  42. docker rm -f "$CONTAINER_NAME"
  43. exit 1
  44. fi
  45. # 5. Validation
  46. echo "🔬 Validating data integrity..."
  47. TABLE_COUNT=$(docker exec "$CONTAINER_NAME" mysql -u root -pDRTestPass123! -N -B -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='food_db';")
  48. echo "📊 Found $TABLE_COUNT tables in restored database."
  49. if [ "$TABLE_COUNT" -gt 0 ]; then
  50. echo "🎉 DISASTER RECOVERY TEST PASSED!"
  51. else
  52. echo "❌ Validation failed: No tables found."
  53. fi
  54. # 6. Clean up
  55. echo "🧹 Destroying sandbox container..."
  56. docker rm -f "$CONTAINER_NAME" >/dev/null
  57. echo "✅ DR Test Sequence Complete."