#!/bin/bash # 数据库管理脚本 # 用于管理MySQL数据库容器的启动、停止、备份等操作 set -e # 脚本配置 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" COMPOSE_FILE="$SCRIPT_DIR/docker-compose.database.yml" ENV_FILE="$SCRIPT_DIR/.env.database" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查环境文件 check_env_file() { if [ ! -f "$ENV_FILE" ]; then log_warning "环境文件不存在: $ENV_FILE" log_info "从模板创建环境文件..." cp "$ENV_FILE.template" "$ENV_FILE" log_success "环境文件已创建,请根据需要修改配置" fi } # 创建必要的目录 create_directories() { local data_dir="$SCRIPT_DIR/data" local mysql_dir="$data_dir/mysql" local logs_dir="$data_dir/logs/mysql" log_info "创建数据目录..." mkdir -p "$mysql_dir" "$logs_dir" # 设置权限(MySQL需要特定的权限) chmod 755 "$mysql_dir" "$logs_dir" log_success "数据目录创建完成" } # 启动数据库 start_database() { log_info "启动MySQL数据库容器..." check_env_file create_directories # 使用docker-compose启动 docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" up -d log_success "数据库容器启动完成" log_info "等待数据库初始化..." # 等待健康检查通过 local max_attempts=30 local attempt=1 while [ $attempt -le $max_attempts ]; do if docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps | grep -q "healthy"; then log_success "数据库已就绪" return 0 fi log_info "等待数据库启动... ($attempt/$max_attempts)" sleep 10 ((attempt++)) done log_error "数据库启动超时" return 1 } # 停止数据库 stop_database() { log_info "停止MySQL数据库容器..." docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" down log_success "数据库容器已停止" } # 重启数据库 restart_database() { log_info "重启MySQL数据库容器..." stop_database start_database } # 查看数据库状态 status_database() { log_info "数据库容器状态:" docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps } # 查看数据库日志 logs_database() { local lines=${1:-100} log_info "显示数据库日志 (最近 $lines 行):" docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" logs --tail="$lines" -f } # 进入数据库容器 exec_database() { log_info "进入数据库容器..." docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec anxin-mysql bash } # 连接到MySQL connect_mysql() { log_info "连接到MySQL数据库..." # 从环境文件读取配置 source "$ENV_FILE" docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec anxin-mysql \ mysql -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" } # 备份数据库 backup_database() { local backup_file="$SCRIPT_DIR/backup/anxin_$(date +%Y%m%d_%H%M%S).sql" local backup_dir="$(dirname "$backup_file")" log_info "备份数据库到: $backup_file" # 创建备份目录 mkdir -p "$backup_dir" # 从环境文件读取配置 source "$ENV_FILE" # 执行备份 docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T anxin-mysql \ mysqldump -u"$DB_USER" -p"$DB_PASSWORD" --single-transaction --routines --triggers "$DB_NAME" > "$backup_file" log_success "数据库备份完成: $backup_file" } # 恢复数据库 restore_database() { local backup_file="$1" if [ -z "$backup_file" ] || [ ! -f "$backup_file" ]; then log_error "请指定有效的备份文件" return 1 fi log_info "从备份文件恢复数据库: $backup_file" # 从环境文件读取配置 source "$ENV_FILE" # 执行恢复 docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T anxin-mysql \ mysql -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < "$backup_file" log_success "数据库恢复完成" } # 显示帮助信息 show_help() { echo "数据库管理脚本" echo "" echo "用法: $0 [命令] [参数]" echo "" echo "命令:" echo " start 启动数据库容器" echo " stop 停止数据库容器" echo " restart 重启数据库容器" echo " status 查看数据库容器状态" echo " logs [lines] 查看数据库日志 (默认100行)" echo " exec 进入数据库容器" echo " connect 连接到MySQL数据库" echo " backup 备份数据库" echo " restore 从备份文件恢复数据库" echo " help 显示此帮助信息" echo "" echo "示例:" echo " $0 start # 启动数据库" echo " $0 logs 50 # 查看最近50行日志" echo " $0 restore backup.sql # 从backup.sql恢复数据库" } # 主函数 main() { case "${1:-help}" in start) start_database ;; stop) stop_database ;; restart) restart_database ;; status) status_database ;; logs) logs_database "$2" ;; exec) exec_database ;; connect) connect_mysql ;; backup) backup_database ;; restore) restore_database "$2" ;; help|--help|-h) show_help ;; *) log_error "未知命令: $1" show_help exit 1 ;; esac } # 执行主函数 main "$@"