test_dr.sh 2.2 KB

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