421 lines
13 KiB
Bash
Raw Normal View History

2025-07-07 23:53:50 +01:00
#!/bin/bash
# Database Management Master Script
# Central hub for all database operations and tools
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
# Change to project root
cd "$PROJECT_ROOT"
# Logging functions
log() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_header() {
echo -e "${BLUE}${BOLD}=== $1 ===${NC}"
}
print_subheader() {
echo -e "${CYAN}--- $1 ---${NC}"
}
print_usage() {
echo -e "${BOLD}Database Management Hub${NC}"
echo
echo "Usage: $0 <category> <command> [options]"
echo
echo -e "${BOLD}Categories:${NC}"
echo
echo -e "${CYAN}setup${NC} Database setup and initialization"
echo " setup Full database setup (create + migrate + seed)"
echo " create Create the database"
echo " migrate Run migrations"
echo " seed Seed database with test data"
echo " reset Reset database (drop + create + migrate)"
echo " status Show migration status"
echo " drop Drop the database"
echo " postgres Setup PostgreSQL database"
echo " sqlite Setup SQLite database"
echo
echo -e "${CYAN}backup${NC} Backup and restore operations"
echo " backup Create database backup"
echo " restore Restore database from backup"
echo " list List available backups"
echo " clean Clean old backups"
echo " export Export data to JSON/CSV"
echo " import Import data from JSON/CSV"
echo " clone Clone database to different name"
echo " compare Compare two databases"
echo
echo -e "${CYAN}monitor${NC} Monitoring and health checks"
echo " health Complete health check"
echo " status Quick status check"
echo " connections Show active connections"
echo " performance Show performance metrics"
echo " slow-queries Show slow queries"
echo " locks Show database locks"
echo " disk-usage Show disk usage"
echo " memory-usage Show memory usage"
echo " backup-status Check backup status"
echo " monitor Start continuous monitoring"
echo " alerts Check for alerts"
echo " vacuum Perform database maintenance"
echo " analyze Update database statistics"
echo " report Generate comprehensive report"
echo
echo -e "${CYAN}migrate${NC} Migration management"
echo " status Show migration status"
echo " pending List pending migrations"
echo " applied List applied migrations"
echo " run Run pending migrations"
echo " rollback Rollback migrations"
echo " create Create new migration"
echo " generate Generate migration from schema diff"
echo " validate Validate migration files"
echo " dry-run Show what would be migrated"
echo " force Force migration state"
echo " repair Repair migration table"
echo " baseline Set migration baseline"
echo " history Show migration history"
echo " schema-dump Dump current schema"
echo " data-migrate Migrate data between schemas"
echo " template Manage migration templates"
echo
echo -e "${CYAN}utils${NC} Database utilities and maintenance"
echo " size Show database size information"
echo " tables List all tables with row counts"
echo " indexes Show index information"
echo " constraints Show table constraints"
echo " users Show database users (PostgreSQL only)"
echo " permissions Show user permissions"
echo " sessions Show active sessions"
echo " locks Show current locks"
echo " queries Show running queries"
echo " kill-query Kill a specific query"
echo " optimize Optimize database (VACUUM, ANALYZE)"
echo " reindex Rebuild indexes"
echo " check-integrity Check database integrity"
echo " repair Repair database issues"
echo " cleanup Clean up temporary data"
echo " logs Show database logs"
echo " config Show database configuration"
echo " extensions List database extensions (PostgreSQL)"
echo " sequences Show sequence information"
echo " triggers Show table triggers"
echo " functions Show user-defined functions"
echo " views Show database views"
echo " schema-info Show comprehensive schema information"
echo " duplicate-data Find duplicate records"
echo " orphaned-data Find orphaned records"
echo " table-stats Show detailed table statistics"
echo " connection-test Test database connection"
echo " benchmark Run database benchmarks"
echo " export-schema Export database schema"
echo " import-schema Import database schema"
echo " copy-table Copy table data"
echo " truncate-table Truncate table data"
echo " reset-sequence Reset sequence values"
echo
echo -e "${BOLD}Common Options:${NC}"
echo " --env ENV Environment (dev/prod) [default: dev]"
echo " --force Skip confirmations"
echo " --quiet Suppress verbose output"
echo " --debug Enable debug output"
echo " --dry-run Show what would be done without executing"
echo " --help Show category-specific help"
echo
echo -e "${BOLD}Quick Commands:${NC}"
echo " $0 status Quick database status"
echo " $0 health Complete health check"
echo " $0 backup Create backup"
echo " $0 migrate Run migrations"
echo " $0 optimize Optimize database"
echo
echo -e "${BOLD}Examples:${NC}"
echo " $0 setup create # Create database"
echo " $0 setup migrate # Run migrations"
echo " $0 backup create # Create backup"
echo " $0 backup restore --file backup.sql # Restore from backup"
echo " $0 monitor health # Health check"
echo " $0 monitor connections # Show connections"
echo " $0 migrate create --name add_users # Create migration"
echo " $0 migrate run # Run pending migrations"
echo " $0 utils size # Show database size"
echo " $0 utils optimize # Optimize database"
echo
echo -e "${BOLD}For detailed help on a specific category:${NC}"
echo " $0 setup --help"
echo " $0 backup --help"
echo " $0 monitor --help"
echo " $0 migrate --help"
echo " $0 utils --help"
}
# Check if required scripts exist
check_scripts() {
local missing_scripts=()
if [ ! -f "$SCRIPT_DIR/db-setup.sh" ]; then
missing_scripts+=("db-setup.sh")
fi
if [ ! -f "$SCRIPT_DIR/db-backup.sh" ]; then
missing_scripts+=("db-backup.sh")
fi
if [ ! -f "$SCRIPT_DIR/db-monitor.sh" ]; then
missing_scripts+=("db-monitor.sh")
fi
if [ ! -f "$SCRIPT_DIR/db-migrate.sh" ]; then
missing_scripts+=("db-migrate.sh")
fi
if [ ! -f "$SCRIPT_DIR/db-utils.sh" ]; then
missing_scripts+=("db-utils.sh")
fi
if [ ${#missing_scripts[@]} -gt 0 ]; then
log_error "Missing required scripts: ${missing_scripts[*]}"
echo "Please ensure all database management scripts are present in the scripts directory."
exit 1
fi
}
# Make scripts executable
make_scripts_executable() {
chmod +x "$SCRIPT_DIR"/db-*.sh 2>/dev/null || true
}
# Show quick status
show_quick_status() {
print_header "Quick Database Status"
# Check if .env exists
if [ ! -f ".env" ]; then
log_error ".env file not found"
echo "Run: $0 setup create"
return 1
fi
# Load environment variables
export $(grep -v '^#' .env | xargs) 2>/dev/null || true
# Show basic info
log "Environment: ${ENVIRONMENT:-dev}"
log "Database URL: ${DATABASE_URL:-not set}"
# Test connection
if command -v "$SCRIPT_DIR/db-utils.sh" >/dev/null 2>&1; then
"$SCRIPT_DIR/db-utils.sh" connection-test --quiet 2>/dev/null || log_warn "Database connection failed"
fi
# Show migration status
if command -v "$SCRIPT_DIR/db-migrate.sh" >/dev/null 2>&1; then
"$SCRIPT_DIR/db-migrate.sh" status --quiet 2>/dev/null || log_warn "Could not check migration status"
fi
}
# Show comprehensive health check
show_health_check() {
print_header "Comprehensive Database Health Check"
if [ -f "$SCRIPT_DIR/db-monitor.sh" ]; then
"$SCRIPT_DIR/db-monitor.sh" health "$@"
else
log_error "db-monitor.sh not found"
exit 1
fi
}
# Create quick backup
create_quick_backup() {
print_header "Quick Database Backup"
if [ -f "$SCRIPT_DIR/db-backup.sh" ]; then
"$SCRIPT_DIR/db-backup.sh" backup --compress "$@"
else
log_error "db-backup.sh not found"
exit 1
fi
}
# Run migrations
run_migrations() {
print_header "Running Database Migrations"
if [ -f "$SCRIPT_DIR/db-migrate.sh" ]; then
"$SCRIPT_DIR/db-migrate.sh" run "$@"
else
log_error "db-migrate.sh not found"
exit 1
fi
}
# Optimize database
optimize_database() {
print_header "Database Optimization"
if [ -f "$SCRIPT_DIR/db-utils.sh" ]; then
"$SCRIPT_DIR/db-utils.sh" optimize "$@"
else
log_error "db-utils.sh not found"
exit 1
fi
}
# Parse command line arguments
CATEGORY=""
COMMAND=""
REMAINING_ARGS=()
# Handle special single commands
if [[ $# -eq 1 ]]; then
case $1 in
"status")
show_quick_status
exit 0
;;
"health")
show_health_check
exit 0
;;
"backup")
create_quick_backup
exit 0
;;
"migrate")
run_migrations
exit 0
;;
"optimize")
optimize_database
exit 0
;;
"-h"|"--help")
print_usage
exit 0
;;
esac
fi
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
if [ -n "$CATEGORY" ]; then
REMAINING_ARGS+=("$1")
else
print_usage
exit 0
fi
shift
;;
*)
if [ -z "$CATEGORY" ]; then
CATEGORY="$1"
elif [ -z "$COMMAND" ]; then
COMMAND="$1"
else
REMAINING_ARGS+=("$1")
fi
shift
;;
esac
done
# Check if we're in the right directory
if [ ! -f "Cargo.toml" ]; then
log_error "Please run this script from the project root directory"
exit 1
fi
# Check that all required scripts exist
check_scripts
# Make scripts executable
make_scripts_executable
# Validate category and command
if [ -z "$CATEGORY" ]; then
print_usage
exit 1
fi
# Route to appropriate script
case "$CATEGORY" in
"setup")
if [ -z "$COMMAND" ]; then
log_error "Command required for setup category"
echo "Use: $0 setup --help for available commands"
exit 1
fi
exec "$SCRIPT_DIR/db-setup.sh" "$COMMAND" "${REMAINING_ARGS[@]}"
;;
"backup")
if [ -z "$COMMAND" ]; then
log_error "Command required for backup category"
echo "Use: $0 backup --help for available commands"
exit 1
fi
exec "$SCRIPT_DIR/db-backup.sh" "$COMMAND" "${REMAINING_ARGS[@]}"
;;
"monitor")
if [ -z "$COMMAND" ]; then
log_error "Command required for monitor category"
echo "Use: $0 monitor --help for available commands"
exit 1
fi
exec "$SCRIPT_DIR/db-monitor.sh" "$COMMAND" "${REMAINING_ARGS[@]}"
;;
"migrate")
if [ -z "$COMMAND" ]; then
log_error "Command required for migrate category"
echo "Use: $0 migrate --help for available commands"
exit 1
fi
exec "$SCRIPT_DIR/db-migrate.sh" "$COMMAND" "${REMAINING_ARGS[@]}"
;;
"utils")
if [ -z "$COMMAND" ]; then
log_error "Command required for utils category"
echo "Use: $0 utils --help for available commands"
exit 1
fi
exec "$SCRIPT_DIR/db-utils.sh" "$COMMAND" "${REMAINING_ARGS[@]}"
;;
*)
log_error "Unknown category: $CATEGORY"
echo
print_usage
exit 1
;;
esac