# 🗃️ CKB Database Backup & Restore Guide Panduan lengkap untuk backup dan restore database Docker CKB menggunakan mysqldump. ## 📋 Informasi Database - **Container Name**: `ckb-mysql-dev` - **Database Name**: `ckb_db` - **Database Type**: MariaDB 10.6 - **Port**: 3306 - **Username**: `root` / `laravel` - **Password**: `root` / `password` ## 🛠️ Available Scripts ### 1. **backup_db.sh** - Simple Backup Script backup sederhana dengan kompresi opsional. ```bash ./backup_db.sh ``` **Features:** - ✅ Backup database dengan timestamp - ✅ Kompresi opsional (gzip) - ✅ Validasi container status - ✅ Progress indicator ### 2. **restore_db.sh** - Database Restore Script restore dengan interface interaktif. ```bash ./restore_db.sh ``` **Features:** - ✅ List backup files yang tersedia - ✅ Support compressed & uncompressed files - ✅ Konfirmasi sebelum restore - ✅ Automatic decompression ### 3. **backup_advanced.sh** - Advanced Backup Script backup lengkap dengan berbagai opsi. ```bash ./backup_advanced.sh ``` **Features:** - ✅ Multiple backup types (Full, Structure, Data) - ✅ Automatic cleanup old backups - ✅ Colored output - ✅ Backup statistics - ✅ Compression with ratio info ## 🚀 Quick Start ### Basic Backup ```bash # Simple backup ./backup_db.sh # Manual backup command docker exec ckb-mysql-dev mysqldump -u root -proot ckb_db > backup.sql ``` ### Advanced Backup ```bash # Interactive advanced backup ./backup_advanced.sh # Full backup with all options docker exec ckb-mysql-dev mysqldump -u root -proot \ --single-transaction \ --routines \ --triggers \ --add-drop-table \ ckb_db > full_backup.sql ``` ### Restore Database ```bash # Interactive restore ./restore_db.sh # Manual restore docker exec -i ckb-mysql-dev mysql -u root -proot ckb_db < backup.sql # Restore compressed backup gunzip -c backup.sql.gz | docker exec -i ckb-mysql-dev mysql -u root -proot ckb_db ``` ## 📂 Backup Types ### 1. **Full Backup** (Default) ```bash docker exec ckb-mysql-dev mysqldump -u root -proot \ --single-transaction \ --routines \ --triggers \ --add-drop-table \ ckb_db > full_backup.sql ``` ### 2. **Structure Only** ```bash docker exec ckb-mysql-dev mysqldump -u root -proot \ --no-data \ --routines \ --triggers \ ckb_db > structure_backup.sql ``` ### 3. **Data Only** ```bash docker exec ckb-mysql-dev mysqldump -u root -proot \ --no-create-info \ --single-transaction \ ckb_db > data_backup.sql ``` ### 4. **Compressed Backup** ```bash docker exec ckb-mysql-dev mysqldump -u root -proot ckb_db | gzip > backup.sql.gz ``` ## ⚙️ Manual Commands ### Basic Commands ```bash # Check container status docker ps | grep ckb-mysql-dev # Backup with timestamp docker exec ckb-mysql-dev mysqldump -u root -proot ckb_db > ckb_backup_$(date +%Y%m%d_%H%M%S).sql # Backup all databases docker exec ckb-mysql-dev mysqldump -u root -proot --all-databases > all_databases.sql # Backup specific tables docker exec ckb-mysql-dev mysqldump -u root -proot ckb_db table1 table2 > specific_tables.sql ``` ### Advanced Options ```bash # Backup with extended options docker exec ckb-mysql-dev mysqldump -u root -proot \ --single-transaction \ --routines \ --triggers \ --events \ --add-drop-table \ --add-drop-trigger \ --hex-blob \ --complete-insert \ ckb_db > advanced_backup.sql # Backup without locking tables (for MyISAM) docker exec ckb-mysql-dev mysqldump -u root -proot \ --lock-tables=false \ ckb_db > no_lock_backup.sql # Backup with conditions docker exec ckb-mysql-dev mysqldump -u root -proot \ --where="created_at >= '2023-01-01'" \ ckb_db table_name > conditional_backup.sql ``` ## 🔄 Automated Backups ### Cron Job Setup ```bash # Edit crontab crontab -e # Daily backup at 2 AM 0 2 * * * /path/to/backup_db.sh # Weekly full backup on Sunday at 3 AM 0 3 * * 0 /path/to/backup_advanced.sh # Monthly cleanup (keep last 30 days) 0 4 1 * * find /path/to/backups -name "*.sql*" -mtime +30 -delete ``` ### Systemd Timer (Alternative to Cron) Create `/etc/systemd/system/ckb-backup.service`: ```ini [Unit] Description=CKB Database Backup After=docker.service [Service] Type=oneshot ExecStart=/path/to/backup_db.sh User=root ``` Create `/etc/systemd/system/ckb-backup.timer`: ```ini [Unit] Description=Run CKB backup daily Requires=ckb-backup.service [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target ``` Enable timer: ```bash sudo systemctl enable ckb-backup.timer sudo systemctl start ckb-backup.timer ``` ## 📊 Backup Management ### Check Backup Size ```bash # Show backup directory size du -sh backups/ # List all backups with sizes ls -lah backups/ # Show compression ratio for file in backups/*.sql.gz; do original_size=$(gunzip -l "$file" | tail -1 | awk '{print $2}') compressed_size=$(stat -c%s "$file") ratio=$(echo "scale=1; (1 - $compressed_size/$original_size) * 100" | bc) echo "$(basename "$file"): ${ratio}% compression" done ``` ### Cleanup Old Backups ```bash # Delete backups older than 30 days find backups/ -name "*.sql*" -mtime +30 -delete # Keep only last 10 backups ls -1t backups/ckb_backup_*.sql* | tail -n +11 | xargs rm -f # Clean by size (keep if total < 1GB) total_size=$(du -s backups/ | cut -f1) if [ $total_size -gt 1048576 ]; then # Delete oldest files until under 1GB echo "Cleaning up old backups..." fi ``` ## 🚨 Troubleshooting ### Common Issues 1. **Container not running** ```bash # Start container docker-compose up -d db # Check logs docker logs ckb-mysql-dev ``` 2. **Permission denied** ```bash # Fix script permissions chmod +x *.sh # Fix backup directory permissions sudo chown -R $USER:$USER backups/ ``` 3. **Out of disk space** ```bash # Check disk usage df -h # Clean old backups find backups/ -name "*.sql*" -mtime +7 -delete ``` 4. **MySQL connection error** ```bash # Test connection docker exec ckb-mysql-dev mysql -u root -proot -e "SELECT 1;" # Check MySQL status docker exec ckb-mysql-dev mysqladmin -u root -proot status ``` ## 🔐 Security Notes 1. **Never store passwords in plain text** - Consider using MySQL config files 2. **Encrypt sensitive backups** - Use GPG for production environments 3. **Secure backup storage** - Store backups in secure, offsite locations 4. **Regular restore testing** - Test backups regularly to ensure they work ## 📈 Best Practices 1. **Regular Backups**: Daily for production, weekly for development 2. **Multiple Backup Types**: Keep both full and incremental backups 3. **Offsite Storage**: Store backups in different physical/cloud locations 4. **Compression**: Use gzip to save storage space 5. **Retention Policy**: Define how long to keep backups 6. **Monitoring**: Monitor backup success/failure 7. **Documentation**: Document backup procedures and recovery steps 8. **Testing**: Regularly test restore procedures ## 📝 File Structure ``` backups/ ├── ckb_backup_20231225_143022.sql.gz # Full backup (compressed) ├── ckb_structure_20231225_143022.sql # Structure only ├── ckb_data_20231225_143022.sql.gz # Data only (compressed) └── README.md # This documentation Scripts: ├── backup_db.sh # Simple backup script ├── backup_advanced.sh # Advanced backup with options ├── restore_db.sh # Interactive restore script └── BACKUP_README.md # This documentation ``` --- **Made with ❤️ for CKB Project**