2026-02-28 15:18:01 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
# CCDI 数据库导入脚本
|
|
|
|
|
|
# 功能:从 backup 文件夹导入数据库到目标环境
|
|
|
|
|
|
|
|
|
|
|
|
set -e # 遇到错误立即退出
|
|
|
|
|
|
|
2026-02-28 15:25:42 +08:00
|
|
|
|
# =====================================================
|
|
|
|
|
|
# 数据库配置(请根据实际情况修改)
|
|
|
|
|
|
# =====================================================
|
|
|
|
|
|
|
|
|
|
|
|
# 开发环境数据库配置
|
|
|
|
|
|
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"
|
|
|
|
|
|
|
|
|
|
|
|
# =====================================================
|
|
|
|
|
|
# 脚本逻辑(无需修改)
|
|
|
|
|
|
# =====================================================
|
|
|
|
|
|
|
2026-02-28 15:18:01 +08:00
|
|
|
|
# 颜色定义
|
|
|
|
|
|
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"
|
2026-02-28 15:25:42 +08:00
|
|
|
|
log_info "请先执行导出: ./export_database.sh"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -f "$data_file" ]; then
|
|
|
|
|
|
log_error "数据文件不存在: $data_file"
|
2026-02-28 15:25:42 +08:00
|
|
|
|
log_info "请先执行导出: ./export_database.sh"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
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))"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-28 15:25:42 +08:00
|
|
|
|
# 获取环境数据库配置
|
|
|
|
|
|
get_db_config() {
|
2026-02-28 15:18:01 +08:00
|
|
|
|
local env_type=$1
|
|
|
|
|
|
|
|
|
|
|
|
case "$env_type" in
|
2026-02-28 15:25:42 +08:00
|
|
|
|
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"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
;;
|
|
|
|
|
|
test)
|
2026-02-28 15:25:42 +08:00
|
|
|
|
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"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
;;
|
2026-02-28 15:25:42 +08:00
|
|
|
|
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"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
;;
|
|
|
|
|
|
*)
|
|
|
|
|
|
log_error "未知的环境类型: $env_type"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
;;
|
|
|
|
|
|
esac
|
2026-02-28 15:25:42 +08:00
|
|
|
|
}
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
2026-02-28 15:25:42 +08:00
|
|
|
|
# 导入表结构
|
|
|
|
|
|
import_structure() {
|
|
|
|
|
|
local env_type=$1
|
|
|
|
|
|
|
|
|
|
|
|
get_db_config "$env_type"
|
|
|
|
|
|
|
|
|
|
|
|
log_info "导入表结构到 ${env_type} 环境: ${DB_HOST}:${DB_PORT}/${DB_NAME}"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
local structure_file="${BACKUP_DIR}/${STRUCTURE_FILE}"
|
|
|
|
|
|
|
|
|
|
|
|
# 导入表结构
|
2026-02-28 15:25:42 +08:00
|
|
|
|
mysql -h "$DB_HOST" \
|
|
|
|
|
|
-P "$DB_PORT" \
|
|
|
|
|
|
-u "$DB_USER" \
|
|
|
|
|
|
-p"$DB_PASS" \
|
2026-02-28 15:18:01 +08:00
|
|
|
|
--default-character-set=utf8mb4 \
|
2026-02-28 15:25:42 +08:00
|
|
|
|
"$DB_NAME" < "$structure_file" 2>/dev/null
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
|
|
log_info "表结构导入成功"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_error "表结构导入失败"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 导入数据
|
|
|
|
|
|
import_data() {
|
|
|
|
|
|
local env_type=$1
|
|
|
|
|
|
|
2026-02-28 15:25:42 +08:00
|
|
|
|
get_db_config "$env_type"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
2026-02-28 15:25:42 +08:00
|
|
|
|
log_info "导入数据到 ${env_type} 环境: ${DB_HOST}:${DB_PORT}/${DB_NAME}"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
local data_file="${BACKUP_DIR}/${DATA_FILE}"
|
|
|
|
|
|
|
|
|
|
|
|
# 导入数据
|
2026-02-28 15:25:42 +08:00
|
|
|
|
mysql -h "$DB_HOST" \
|
|
|
|
|
|
-P "$DB_PORT" \
|
|
|
|
|
|
-u "$DB_USER" \
|
|
|
|
|
|
-p"$DB_PASS" \
|
2026-02-28 15:18:01 +08:00
|
|
|
|
--default-character-set=utf8mb4 \
|
2026-02-28 15:25:42 +08:00
|
|
|
|
"$DB_NAME" < "$data_file" 2>/dev/null
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
|
|
log_info "数据导入成功"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_error "数据导入失败"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 验证导入结果
|
|
|
|
|
|
verify_import() {
|
|
|
|
|
|
local env_type=$1
|
|
|
|
|
|
|
2026-02-28 15:25:42 +08:00
|
|
|
|
get_db_config "$env_type"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
log_info "验证导入结果..."
|
|
|
|
|
|
|
|
|
|
|
|
# 查询表数量
|
2026-02-28 15:25:42 +08:00
|
|
|
|
local table_count=$(mysql -h "$DB_HOST" \
|
|
|
|
|
|
-P "$DB_PORT" \
|
|
|
|
|
|
-u "$DB_USER" \
|
|
|
|
|
|
-p"$DB_PASS" \
|
2026-02-28 15:18:01 +08:00
|
|
|
|
--default-character-set=utf8mb4 \
|
2026-02-28 15:25:42 +08:00
|
|
|
|
-N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME';" "$DB_NAME" 2>/dev/null)
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
log_info "目标数据库表数量: $table_count"
|
|
|
|
|
|
|
|
|
|
|
|
# 查询关键表行数(示例:sys_user 表)
|
2026-02-28 15:25:42 +08:00
|
|
|
|
local user_count=$(mysql -h "$DB_HOST" \
|
|
|
|
|
|
-P "$DB_PORT" \
|
|
|
|
|
|
-u "$DB_USER" \
|
|
|
|
|
|
-p"$DB_PASS" \
|
2026-02-28 15:18:01 +08:00
|
|
|
|
--default-character-set=utf8mb4 \
|
2026-02-28 15:25:42 +08:00
|
|
|
|
-N -e "SELECT COUNT(*) FROM sys_user;" "$DB_NAME" 2>/dev/null)
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
log_info "sys_user 表数据行数: $user_count"
|
|
|
|
|
|
|
|
|
|
|
|
# 检查数据库字符集
|
2026-02-28 15:25:42 +08:00
|
|
|
|
local db_charset=$(mysql -h "$DB_HOST" \
|
|
|
|
|
|
-P "$DB_PORT" \
|
|
|
|
|
|
-u "$DB_USER" \
|
|
|
|
|
|
-p"$DB_PASS" \
|
2026-02-28 15:18:01 +08:00
|
|
|
|
--default-character-set=utf8mb4 \
|
2026-02-28 15:25:42 +08:00
|
|
|
|
-N -e "SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.schemata WHERE schema_name='$DB_NAME';" 2>/dev/null)
|
2026-02-28 15:18:01 +08:00
|
|
|
|
|
|
|
|
|
|
log_info "数据库字符集: $db_charset"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 导入数据库
|
|
|
|
|
|
import_database() {
|
|
|
|
|
|
local env_type=$1
|
|
|
|
|
|
|
|
|
|
|
|
if [ -z "$env_type" ]; then
|
|
|
|
|
|
log_error "请指定目标环境: dev, test 或 production"
|
|
|
|
|
|
log_info "用法: $0 <env>"
|
|
|
|
|
|
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 <environment>"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "环境:"
|
2026-02-28 15:25:42 +08:00
|
|
|
|
echo " dev, development 开发环境"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo " test 测试环境"
|
|
|
|
|
|
echo " production, prod 生产环境"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "说明:"
|
|
|
|
|
|
echo " 此脚本从 doc/database/backup/ 文件夹读取备份文件并导入到指定环境"
|
|
|
|
|
|
echo " 备份文件:"
|
|
|
|
|
|
echo " - ccdi_structure.sql (表结构)"
|
|
|
|
|
|
echo " - ccdi_data.sql (数据)"
|
|
|
|
|
|
echo ""
|
2026-02-28 15:25:42 +08:00
|
|
|
|
echo "配置:"
|
|
|
|
|
|
echo " 数据库配置已内置在脚本顶部,请根据实际情况修改"
|
|
|
|
|
|
echo " 配置项: DEV_DB_*, TEST_DB_*, PROD_DB_*"
|
|
|
|
|
|
echo ""
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo "前置条件:"
|
2026-02-28 15:25:42 +08:00
|
|
|
|
echo " 1. 已执行 ./export_database.sh 导出数据库"
|
|
|
|
|
|
echo " 2. 已在脚本顶部配置目标环境数据库信息"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
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 "$@"
|