357 lines
7.5 KiB
Markdown
Executable File
357 lines
7.5 KiB
Markdown
Executable File
# 🗃️ 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**
|