249 lines
6.1 KiB
Bash
249 lines
6.1 KiB
Bash
#!/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 "$@" |