#!/bin/bash # ============================================================================ # Safe Corruption Fix Execution Script # ============================================================================ # This script: # 1. Creates a backup # 2. Shows current corruption status # 3. Prompts for confirmation # 4. Applies fixes # 5. Shows before/after comparison # ============================================================================ set -e # Exit on error DB_USER="root" DB_PASS="secureRootPassword" DB_NAME="cmc" CONTAINER="cmc-db" BACKUP_DIR="./backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}============================================================${NC}" echo -e "${BLUE}CMC Database Corruption Fix Script${NC}" echo -e "${BLUE}============================================================${NC}" echo "" # Create backups directory mkdir -p "$BACKUP_DIR" # Step 1: Create backup echo -e "${YELLOW}Step 1: Creating database backup...${NC}" docker exec $CONTAINER mariadb-dump \ -u $DB_USER \ -p$DB_PASS \ --default-character-set=utf8mb4 \ --single-transaction \ $DB_NAME | gzip > "$BACKUP_DIR/backup_before_corruption_fix_$TIMESTAMP.sql.gz" BACKUP_SIZE=$(du -h "$BACKUP_DIR/backup_before_corruption_fix_$TIMESTAMP.sql.gz" | cut -f1) echo -e "${GREEN}✓ Backup created: backup_before_corruption_fix_$TIMESTAMP.sql.gz (${BACKUP_SIZE})${NC}" echo "" # Step 2: Show current corruption status echo -e "${YELLOW}Step 2: Current corruption status${NC}" echo "-----------------------------------" docker exec $CONTAINER mariadb -u $DB_USER -p$DB_PASS --default-character-set=utf8mb4 $DB_NAME -e " SELECT 'principles' as table_name, COUNT(*) as corrupted_records FROM principles WHERE name REGEXP '[^ -~]' OR address REGEXP '[^ -~]' OR city REGEXP '[^ -~]' UNION ALL SELECT 'customers', COUNT(*) FROM customers WHERE name REGEXP '[^ -~]' UNION ALL SELECT 'addresses', COUNT(*) FROM addresses WHERE address REGEXP '[^ -~]' OR city REGEXP '[^ -~]' UNION ALL SELECT 'products', COUNT(*) FROM products WHERE title REGEXP '[^ -~]' OR description REGEXP '[^ -~]' OR item_description REGEXP '[^ -~]'; " echo "" # Step 3: Show sample corrupted data echo -e "${YELLOW}Step 3: Sample corrupted data (BEFORE fix)${NC}" echo "-------------------------------------------" docker exec $CONTAINER mariadb -u $DB_USER -p$DB_PASS --default-character-set=utf8mb4 $DB_NAME -e " SELECT 'CUSTOMERS' as table_name, id, name FROM customers WHERE id IN (253, 1006, 1387, 1608) UNION ALL SELECT 'PRINCIPLES', id, name FROM principles WHERE id IN (2, 9, 13, 14) UNION ALL SELECT 'PRODUCTS', id, title FROM products WHERE id IN (30, 38, 67); " echo "" # Step 4: Prompt for confirmation echo -e "${RED}IMPORTANT:${NC}" echo "- Backup created at: $BACKUP_DIR/backup_before_corruption_fix_$TIMESTAMP.sql.gz" echo "- This will modify data in tables: principles, customers, addresses, products" echo "- Changes fix mojibake like: ’ → ', é → é, etc." echo "" read -p "Do you want to proceed with the fix? (yes/no): " CONFIRM if [ "$CONFIRM" != "yes" ]; then echo -e "${RED}Fix cancelled by user${NC}" exit 0 fi # Step 5: Apply fixes echo "" echo -e "${YELLOW}Step 5: Applying corruption fixes...${NC}" docker exec -i $CONTAINER mariadb \ -u $DB_USER \ -p$DB_PASS \ --default-character-set=utf8mb4 \ $DB_NAME < scripts/fix_corrupted_data.sql echo -e "${GREEN}✓ Fix script executed${NC}" echo "" # Step 6: Show results echo -e "${YELLOW}Step 6: Results (AFTER fix)${NC}" echo "----------------------------" echo "" echo "Sample fixed data:" docker exec $CONTAINER mariadb -u $DB_USER -p$DB_PASS --default-character-set=utf8mb4 $DB_NAME -e " SELECT 'CUSTOMERS' as table_name, id, name FROM customers WHERE id IN (253, 1006, 1387, 1608) UNION ALL SELECT 'PRINCIPLES', id, name FROM principles WHERE id IN (2, 9, 13, 14) UNION ALL SELECT 'PRODUCTS', id, title FROM products WHERE id IN (30, 38, 67); " echo "" echo "Remaining corruption counts:" docker exec $CONTAINER mariadb -u $DB_USER -p$DB_PASS --default-character-set=utf8mb4 $DB_NAME -e " SELECT 'principles' as table_name, COUNT(*) as corrupted_records FROM principles WHERE name REGEXP '[^ -~]' OR address REGEXP '[^ -~]' OR city REGEXP '[^ -~]' UNION ALL SELECT 'customers', COUNT(*) FROM customers WHERE name REGEXP '[^ -~]' UNION ALL SELECT 'addresses', COUNT(*) FROM addresses WHERE address REGEXP '[^ -~]' OR city REGEXP '[^ -~]' UNION ALL SELECT 'products', COUNT(*) FROM products WHERE title REGEXP '[^ -~]' OR description REGEXP '[^ -~]' OR item_description REGEXP '[^ -~]'; " echo "" # Step 7: Test new insert echo -e "${YELLOW}Step 7: Testing new inserts with special characters...${NC}" docker exec $CONTAINER mariadb -u $DB_USER -p$DB_PASS --default-character-set=utf8mb4 $DB_NAME -e " START TRANSACTION; INSERT INTO principles (name, code, address, city, state, postcode, country_id, currency_id, short_name, url) VALUES ('Test Müller & Söhne GmbH', 999999, 'Straße 123', 'München', 'Bayern', '80331', 1, 1, 'TEST', 'http://test.com'); SELECT name, address, city FROM principles WHERE code = 999999; ROLLBACK; " echo -e "${GREEN}✓ New inserts working correctly${NC}" echo "" # Final summary echo -e "${BLUE}============================================================${NC}" echo -e "${GREEN}FIX COMPLETED SUCCESSFULLY!${NC}" echo -e "${BLUE}============================================================${NC}" echo "" echo "Summary:" echo "- Backup location: $BACKUP_DIR/backup_before_corruption_fix_$TIMESTAMP.sql.gz" echo "- Fixed common patterns: smart quotes, accented characters, dashes" echo "- Fixed specific records: ~30+ known corrupted records" echo "" echo "Next steps:" echo "1. Review the fixed data in the application" echo "2. Run: bash scripts/report_remaining_corruption.sh to see what's left" echo "3. Manually fix any remaining corrupted records" echo "" echo "To rollback if needed:" echo " gunzip < $BACKUP_DIR/backup_before_corruption_fix_$TIMESTAMP.sql.gz | \\" echo " docker exec -i $CONTAINER mariadb -u $DB_USER -p$DB_PASS $DB_NAME" echo ""