#!/bin/bash # CCDI 数据库导入脚本 # 功能:从 backup 文件夹导入数据库到目标环境 set -e # 遇到错误立即退出 # ===================================================== # 数据库配置(请根据实际情况修改) # ===================================================== # 开发环境数据库配置 DEV_DB_HOST="116.62.17.81" DEV_DB_PORT="3306" DEV_DB_USER="root" DEV_DB_PASS="Kfcx@1234" DEV_DB_NAME="ccdi" # 测试环境数据库配置 TEST_DB_HOST="your_test_host" TEST_DB_PORT="3306" TEST_DB_USER="your_test_user" TEST_DB_PASS="your_test_password" TEST_DB_NAME="ccdi" # 生产环境数据库配置 PROD_DB_HOST="your_production_host" PROD_DB_PORT="3306" PROD_DB_USER="your_production_user" PROD_DB_PASS="your_production_password" PROD_DB_NAME="ccdi" # 备份文件配置 BACKUP_DIR="doc/database/backup" STRUCTURE_FILE="ccdi_structure.sql" DATA_FILE="ccdi_data.sql" # ===================================================== # 脚本逻辑(无需修改) # ===================================================== # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 脚本目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 检查 mysql 命令 check_mysql() { if ! command -v mysql &> /dev/null; then log_error "mysql 命令未找到" log_info "请安装 MySQL 客户端工具" exit 1 fi log_info "mysql 命令检查通过" } # 检查备份文件 check_backup_files() { log_info "检查备份文件..." local structure_file="${BACKUP_DIR}/${STRUCTURE_FILE}" local data_file="${BACKUP_DIR}/${DATA_FILE}" if [ ! -f "$structure_file" ]; then log_error "表结构文件不存在: $structure_file" log_info "请先执行导出: ./export_database.sh" exit 1 fi if [ ! -f "$data_file" ]; then log_error "数据文件不存在: $data_file" log_info "请先执行导出: ./export_database.sh" exit 1 fi log_info "备份文件检查通过" log_info "表结构文件: $structure_file ($(du -h "$structure_file" | cut -f1))" log_info "数据文件: $data_file ($(du -h "$data_file" | cut -f1))" } # 获取环境数据库配置 get_db_config() { local env_type=$1 case "$env_type" in dev|development) DB_HOST="$DEV_DB_HOST" DB_PORT="$DEV_DB_PORT" DB_USER="$DEV_DB_USER" DB_PASS="$DEV_DB_PASS" DB_NAME="$DEV_DB_NAME" ;; test) DB_HOST="$TEST_DB_HOST" DB_PORT="$TEST_DB_PORT" DB_USER="$TEST_DB_USER" DB_PASS="$TEST_DB_PASS" DB_NAME="$TEST_DB_NAME" ;; production|prod) DB_HOST="$PROD_DB_HOST" DB_PORT="$PROD_DB_PORT" DB_USER="$PROD_DB_USER" DB_PASS="$PROD_DB_PASS" DB_NAME="$PROD_DB_NAME" ;; *) log_error "未知的环境类型: $env_type" exit 1 ;; esac } # 导入表结构 import_structure() { local env_type=$1 get_db_config "$env_type" log_info "导入表结构到 ${env_type} 环境: ${DB_HOST}:${DB_PORT}/${DB_NAME}" local structure_file="${BACKUP_DIR}/${STRUCTURE_FILE}" # 导入表结构 mysql -h "$DB_HOST" \ -P "$DB_PORT" \ -u "$DB_USER" \ -p"$DB_PASS" \ --default-character-set=utf8mb4 \ "$DB_NAME" < "$structure_file" 2>/dev/null if [ $? -eq 0 ]; then log_info "表结构导入成功" else log_error "表结构导入失败" exit 1 fi } # 导入数据 import_data() { local env_type=$1 get_db_config "$env_type" log_info "导入数据到 ${env_type} 环境: ${DB_HOST}:${DB_PORT}/${DB_NAME}" local data_file="${BACKUP_DIR}/${DATA_FILE}" # 导入数据 mysql -h "$DB_HOST" \ -P "$DB_PORT" \ -u "$DB_USER" \ -p"$DB_PASS" \ --default-character-set=utf8mb4 \ "$DB_NAME" < "$data_file" 2>/dev/null if [ $? -eq 0 ]; then log_info "数据导入成功" else log_error "数据导入失败" exit 1 fi } # 验证导入结果 verify_import() { local env_type=$1 get_db_config "$env_type" log_info "验证导入结果..." # 查询表数量 local table_count=$(mysql -h "$DB_HOST" \ -P "$DB_PORT" \ -u "$DB_USER" \ -p"$DB_PASS" \ --default-character-set=utf8mb4 \ -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME';" "$DB_NAME" 2>/dev/null) log_info "目标数据库表数量: $table_count" # 查询关键表行数(示例:sys_user 表) local user_count=$(mysql -h "$DB_HOST" \ -P "$DB_PORT" \ -u "$DB_USER" \ -p"$DB_PASS" \ --default-character-set=utf8mb4 \ -N -e "SELECT COUNT(*) FROM sys_user;" "$DB_NAME" 2>/dev/null) log_info "sys_user 表数据行数: $user_count" # 检查数据库字符集 local db_charset=$(mysql -h "$DB_HOST" \ -P "$DB_PORT" \ -u "$DB_USER" \ -p"$DB_PASS" \ --default-character-set=utf8mb4 \ -N -e "SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.schemata WHERE schema_name='$DB_NAME';" 2>/dev/null) log_info "数据库字符集: $db_charset" } # 导入数据库 import_database() { local env_type=$1 if [ -z "$env_type" ]; then log_error "请指定目标环境: dev, test 或 production" log_info "用法: $0 " exit 1 fi log_info "========== 开始导入数据库到 ${env_type} 环境 ==========" check_mysql check_backup_files import_structure "$env_type" import_data "$env_type" verify_import "$env_type" log_info "========== 数据库导入完成 ==========" } # 使用帮助 show_usage() { echo "用法: $0 " echo "" echo "环境:" echo " dev, development 开发环境" echo " test 测试环境" echo " production, prod 生产环境" echo "" echo "说明:" echo " 此脚本从 doc/database/backup/ 文件夹读取备份文件并导入到指定环境" echo " 备份文件:" echo " - ccdi_structure.sql (表结构)" echo " - ccdi_data.sql (数据)" echo "" echo "配置:" echo " 数据库配置已内置在脚本顶部,请根据实际情况修改" echo " 配置项: DEV_DB_*, TEST_DB_*, PROD_DB_*" echo "" echo "前置条件:" echo " 1. 已执行 ./export_database.sh 导出数据库" echo " 2. 已在脚本顶部配置目标环境数据库信息" echo "" echo "示例:" echo " $0 test # 导入到测试环境" echo " $0 prod # 导入到生产环境" echo " $0 dev # 导入到开发环境" } # 主函数 main() { case "$1" in dev|development) import_database "dev" ;; test) import_database "test" ;; production|prod) import_database "production" ;; help|--help|-h) show_usage ;; *) if [ -z "$1" ]; then log_error "缺少环境参数" else log_error "未知的环境: $1" fi show_usage exit 1 ;; esac } # 执行主函数 main "$@"