add backup file and autobackup code, partial update mutations receive on transation page
This commit is contained in:
253
backup_advanced.sh
Executable file
253
backup_advanced.sh
Executable file
@@ -0,0 +1,253 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Advanced Database Backup Script for CKB Docker
|
||||
# ===============================================
|
||||
|
||||
# Configuration
|
||||
CONTAINER_NAME="ckb-mysql-dev"
|
||||
DB_NAME="ckb_db"
|
||||
DB_USER="root"
|
||||
DB_PASSWORD="root"
|
||||
BACKUP_DIR="./backups"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
RETENTION_DAYS=30 # Keep backups for 30 days
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Functions
|
||||
print_header() {
|
||||
echo -e "${BLUE}================================================${NC}"
|
||||
echo -e "${BLUE} CKB Database Advanced Backup Tool${NC}"
|
||||
echo -e "${BLUE}================================================${NC}"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✅ $1${NC}"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}❌ $1${NC}"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||
}
|
||||
|
||||
print_info() {
|
||||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||||
}
|
||||
|
||||
check_container() {
|
||||
if ! docker ps | grep -q $CONTAINER_NAME; then
|
||||
print_error "Container $CONTAINER_NAME is not running!"
|
||||
exit 1
|
||||
fi
|
||||
print_success "Container $CONTAINER_NAME is running"
|
||||
}
|
||||
|
||||
create_backup_dir() {
|
||||
mkdir -p $BACKUP_DIR
|
||||
print_info "Backup directory: $BACKUP_DIR"
|
||||
}
|
||||
|
||||
cleanup_old_backups() {
|
||||
print_info "Cleaning up backups older than $RETENTION_DAYS days..."
|
||||
|
||||
# Find and delete old backup files
|
||||
old_files=$(find $BACKUP_DIR -name "ckb_backup_*.sql*" -mtime +$RETENTION_DAYS 2>/dev/null)
|
||||
|
||||
if [[ -z "$old_files" ]]; then
|
||||
print_info "No old backup files found"
|
||||
else
|
||||
echo "$old_files" | while read file; do
|
||||
rm -f "$file"
|
||||
print_warning "Deleted old backup: $(basename "$file")"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
backup_full() {
|
||||
local backup_file="$BACKUP_DIR/ckb_backup_${DATE}.sql"
|
||||
print_info "Creating full backup..."
|
||||
|
||||
if docker exec $CONTAINER_NAME mysqldump -u $DB_USER -p$DB_PASSWORD \
|
||||
--single-transaction \
|
||||
--routines \
|
||||
--triggers \
|
||||
--add-drop-table \
|
||||
$DB_NAME > "$backup_file"; then
|
||||
|
||||
print_success "Full backup created: $backup_file"
|
||||
return 0
|
||||
else
|
||||
print_error "Full backup failed!"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
backup_structure_only() {
|
||||
local backup_file="$BACKUP_DIR/ckb_structure_${DATE}.sql"
|
||||
print_info "Creating structure-only backup..."
|
||||
|
||||
if docker exec $CONTAINER_NAME mysqldump -u $DB_USER -p$DB_PASSWORD \
|
||||
--no-data \
|
||||
--routines \
|
||||
--triggers \
|
||||
$DB_NAME > "$backup_file"; then
|
||||
|
||||
print_success "Structure backup created: $backup_file"
|
||||
return 0
|
||||
else
|
||||
print_error "Structure backup failed!"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
backup_data_only() {
|
||||
local backup_file="$BACKUP_DIR/ckb_data_${DATE}.sql"
|
||||
print_info "Creating data-only backup..."
|
||||
|
||||
if docker exec $CONTAINER_NAME mysqldump -u $DB_USER -p$DB_PASSWORD \
|
||||
--no-create-info \
|
||||
--single-transaction \
|
||||
$DB_NAME > "$backup_file"; then
|
||||
|
||||
print_success "Data backup created: $backup_file"
|
||||
return 0
|
||||
else
|
||||
print_error "Data backup failed!"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
compress_backup() {
|
||||
local file="$1"
|
||||
if [[ -f "$file" ]]; then
|
||||
print_info "Compressing backup..."
|
||||
if gzip "$file"; then
|
||||
print_success "Backup compressed: $file.gz"
|
||||
|
||||
# Show compression ratio
|
||||
original_size=$(stat -c%s "$file" 2>/dev/null || echo "0")
|
||||
compressed_size=$(stat -c%s "$file.gz" 2>/dev/null || echo "0")
|
||||
if [[ $original_size -gt 0 ]]; then
|
||||
ratio=$(echo "scale=1; (1 - $compressed_size/$original_size) * 100" | bc -l 2>/dev/null || echo "0")
|
||||
print_info "Compression ratio: ${ratio}%"
|
||||
fi
|
||||
else
|
||||
print_error "Compression failed!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
show_backup_stats() {
|
||||
print_info "Backup Statistics:"
|
||||
echo "----------------------------------------"
|
||||
|
||||
# Count backup files
|
||||
total_backups=$(ls -1 $BACKUP_DIR/ckb_backup_*.sql* 2>/dev/null | wc -l)
|
||||
total_size=$(du -sh $BACKUP_DIR 2>/dev/null | cut -f1)
|
||||
|
||||
echo "Total backups: $total_backups"
|
||||
echo "Total size: $total_size"
|
||||
echo "Newest backup: $(ls -1t $BACKUP_DIR/ckb_backup_*.sql* 2>/dev/null | head -1 | xargs basename 2>/dev/null || echo "None")"
|
||||
echo "Oldest backup: $(ls -1tr $BACKUP_DIR/ckb_backup_*.sql* 2>/dev/null | head -1 | xargs basename 2>/dev/null || echo "None")"
|
||||
}
|
||||
|
||||
# Main Script
|
||||
print_header
|
||||
|
||||
echo "Backup Options:"
|
||||
echo "1. Full backup (structure + data)"
|
||||
echo "2. Structure only backup"
|
||||
echo "3. Data only backup"
|
||||
echo "4. All backup types"
|
||||
echo "5. Show backup statistics"
|
||||
echo "6. Cleanup old backups"
|
||||
echo "7. Exit"
|
||||
echo
|
||||
|
||||
read -p "Choose option (1-7): " -n 1 -r option
|
||||
echo
|
||||
|
||||
case $option in
|
||||
1)
|
||||
check_container
|
||||
create_backup_dir
|
||||
if backup_full; then
|
||||
backup_file="$BACKUP_DIR/ckb_backup_${DATE}.sql"
|
||||
|
||||
read -p "Compress backup? (y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
compress_backup "$backup_file"
|
||||
fi
|
||||
|
||||
cleanup_old_backups
|
||||
show_backup_stats
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
check_container
|
||||
create_backup_dir
|
||||
if backup_structure_only; then
|
||||
backup_file="$BACKUP_DIR/ckb_structure_${DATE}.sql"
|
||||
|
||||
read -p "Compress backup? (y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
compress_backup "$backup_file"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
check_container
|
||||
create_backup_dir
|
||||
if backup_data_only; then
|
||||
backup_file="$BACKUP_DIR/ckb_data_${DATE}.sql"
|
||||
|
||||
read -p "Compress backup? (y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
compress_backup "$backup_file"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
check_container
|
||||
create_backup_dir
|
||||
|
||||
print_info "Creating all backup types..."
|
||||
|
||||
backup_full && compress_backup "$BACKUP_DIR/ckb_backup_${DATE}.sql"
|
||||
backup_structure_only && compress_backup "$BACKUP_DIR/ckb_structure_${DATE}.sql"
|
||||
backup_data_only && compress_backup "$BACKUP_DIR/ckb_data_${DATE}.sql"
|
||||
|
||||
cleanup_old_backups
|
||||
show_backup_stats
|
||||
;;
|
||||
5)
|
||||
create_backup_dir
|
||||
show_backup_stats
|
||||
;;
|
||||
6)
|
||||
create_backup_dir
|
||||
cleanup_old_backups
|
||||
show_backup_stats
|
||||
;;
|
||||
7)
|
||||
print_info "Goodbye!"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Invalid option!"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
print_success "Backup process completed!"
|
||||
Reference in New Issue
Block a user