anxin-ruoyi/docker/database/database-manager.sh
2026-01-05 01:46:20 +08:00

249 lines
6.1 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 <file> 从备份文件恢复数据库"
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 "$@"