2026-02-28 14:28:40 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
2026-02-28 15:18:01 +08:00
|
|
|
|
# CCDI 数据库导出脚本
|
|
|
|
|
|
# 功能:从开发环境导出数据库到 backup 文件夹
|
2026-02-28 14:28:40 +08:00
|
|
|
|
|
|
|
|
|
|
set -e # 遇到错误立即退出
|
|
|
|
|
|
|
|
|
|
|
|
# 颜色定义
|
|
|
|
|
|
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)"
|
|
|
|
|
|
CONFIG_FILE="${SCRIPT_DIR}/db_config.conf"
|
|
|
|
|
|
|
|
|
|
|
|
# 检查配置文件
|
|
|
|
|
|
check_config() {
|
|
|
|
|
|
if [ ! -f "$CONFIG_FILE" ]; then
|
|
|
|
|
|
log_error "配置文件不存在: $CONFIG_FILE"
|
|
|
|
|
|
log_info "请先复制配置模板: cp db_config.conf.template db_config.conf"
|
|
|
|
|
|
log_info "然后编辑 db_config.conf 填写实际数据库连接信息"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 加载配置文件
|
|
|
|
|
|
source "$CONFIG_FILE"
|
|
|
|
|
|
log_info "配置文件加载成功"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 检查 mysqldump 命令
|
|
|
|
|
|
check_mysqldump() {
|
|
|
|
|
|
if ! command -v mysqldump &> /dev/null; then
|
|
|
|
|
|
log_error "mysqldump 命令未找到"
|
|
|
|
|
|
log_info "请安装 MySQL 客户端工具"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
log_info "mysqldump 命令检查通过"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 创建备份目录
|
|
|
|
|
|
create_backup_dir() {
|
|
|
|
|
|
if [ ! -d "$BACKUP_DIR" ]; then
|
|
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
|
|
log_info "创建备份目录: $BACKUP_DIR"
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 导出表结构
|
|
|
|
|
|
export_structure() {
|
|
|
|
|
|
log_info "开始导出表结构..."
|
|
|
|
|
|
|
|
|
|
|
|
local output_file="${BACKUP_DIR}/${STRUCTURE_FILE}"
|
|
|
|
|
|
|
|
|
|
|
|
# 创建临时文件
|
|
|
|
|
|
local temp_file=$(mktemp)
|
|
|
|
|
|
|
|
|
|
|
|
# 导出表结构到临时文件
|
|
|
|
|
|
mysqldump -h "$SOURCE_DB_HOST" \
|
|
|
|
|
|
-P "$SOURCE_DB_PORT" \
|
|
|
|
|
|
-u "$SOURCE_DB_USER" \
|
|
|
|
|
|
-p"$SOURCE_DB_PASS" \
|
|
|
|
|
|
--no-data \
|
|
|
|
|
|
--skip-triggers \
|
|
|
|
|
|
--skip-add-drop-table \
|
2026-02-28 15:18:01 +08:00
|
|
|
|
--default-character-set=utf8mb4 \
|
2026-02-28 14:28:40 +08:00
|
|
|
|
--single-transaction \
|
|
|
|
|
|
--max_allowed_packet=$MAX_ALLOWED_PACKET \
|
|
|
|
|
|
"$SOURCE_DB_NAME" > "$temp_file" 2>/dev/null
|
|
|
|
|
|
|
|
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
|
|
# 添加字符集声明到文件头部
|
|
|
|
|
|
{
|
|
|
|
|
|
echo "-- CCDI 数据库表结构"
|
|
|
|
|
|
echo "-- 导出时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
|
|
|
|
echo "-- 源数据库: ${SOURCE_DB_HOST}:${SOURCE_DB_PORT}/${SOURCE_DB_NAME}"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo "-- 字符集: utf8mb4"
|
2026-02-28 14:28:40 +08:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo "SET NAMES utf8mb4;"
|
|
|
|
|
|
echo "SET CHARACTER SET utf8mb4;"
|
|
|
|
|
|
echo "SET GLOBAL character_set_client=utf8mb4;"
|
|
|
|
|
|
echo "SET GLOBAL character_set_connection=utf8mb4;"
|
|
|
|
|
|
echo "SET GLOBAL character_set_results=utf8mb4;"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
cat "$temp_file"
|
|
|
|
|
|
} > "$output_file"
|
|
|
|
|
|
|
|
|
|
|
|
rm -f "$temp_file"
|
|
|
|
|
|
log_info "表结构导出成功: $output_file"
|
|
|
|
|
|
log_info "文件大小: $(du -h "$output_file" | cut -f1)"
|
|
|
|
|
|
else
|
|
|
|
|
|
rm -f "$temp_file"
|
|
|
|
|
|
log_error "表结构导出失败"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 导出数据
|
|
|
|
|
|
export_data() {
|
|
|
|
|
|
log_info "开始导出数据..."
|
|
|
|
|
|
|
|
|
|
|
|
local output_file="${BACKUP_DIR}/${DATA_FILE}"
|
|
|
|
|
|
|
|
|
|
|
|
# 创建临时文件
|
|
|
|
|
|
local temp_file=$(mktemp)
|
|
|
|
|
|
|
|
|
|
|
|
# 导出数据到临时文件
|
|
|
|
|
|
mysqldump -h "$SOURCE_DB_HOST" \
|
|
|
|
|
|
-P "$SOURCE_DB_PORT" \
|
|
|
|
|
|
-u "$SOURCE_DB_USER" \
|
|
|
|
|
|
-p"$SOURCE_DB_PASS" \
|
|
|
|
|
|
--no-create-info \
|
|
|
|
|
|
--skip-triggers \
|
2026-02-28 15:18:01 +08:00
|
|
|
|
--default-character-set=utf8mb4 \
|
2026-02-28 14:28:40 +08:00
|
|
|
|
--single-transaction \
|
|
|
|
|
|
--complete-insert \
|
|
|
|
|
|
--extended-insert \
|
|
|
|
|
|
--max_allowed_packet=$MAX_ALLOWED_PACKET \
|
|
|
|
|
|
"$SOURCE_DB_NAME" > "$temp_file" 2>/dev/null
|
|
|
|
|
|
|
|
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
|
|
# 添加字符集声明到文件头部
|
|
|
|
|
|
{
|
|
|
|
|
|
echo "-- CCDI 数据库数据"
|
|
|
|
|
|
echo "-- 导出时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
|
|
|
|
echo "-- 源数据库: ${SOURCE_DB_HOST}:${SOURCE_DB_PORT}/${SOURCE_DB_NAME}"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo "-- 字符集: utf8mb4"
|
2026-02-28 14:28:40 +08:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo "SET NAMES utf8mb4;"
|
|
|
|
|
|
echo "SET CHARACTER SET utf8mb4;"
|
|
|
|
|
|
echo "SET GLOBAL character_set_client=utf8mb4;"
|
|
|
|
|
|
echo "SET GLOBAL character_set_connection=utf8mb4;"
|
|
|
|
|
|
echo "SET GLOBAL character_set_results=utf8mb4;"
|
|
|
|
|
|
echo "SET FOREIGN_KEY_CHECKS=0;"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
cat "$temp_file"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "SET FOREIGN_KEY_CHECKS=1;"
|
|
|
|
|
|
} > "$output_file"
|
|
|
|
|
|
|
|
|
|
|
|
rm -f "$temp_file"
|
|
|
|
|
|
log_info "数据导出成功: $output_file"
|
|
|
|
|
|
log_info "文件大小: $(du -h "$output_file" | cut -f1)"
|
|
|
|
|
|
else
|
|
|
|
|
|
rm -f "$temp_file"
|
|
|
|
|
|
log_error "数据导出失败"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 验证导出文件
|
|
|
|
|
|
verify_export() {
|
|
|
|
|
|
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"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -f "$data_file" ]; then
|
|
|
|
|
|
log_error "数据文件不存在: $data_file"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 检查字符集声明
|
|
|
|
|
|
if ! grep -q "SET NAMES utf8mb4" "$structure_file"; then
|
|
|
|
|
|
log_error "表结构文件缺少字符集声明"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! grep -q "SET NAMES utf8mb4" "$data_file"; then
|
|
|
|
|
|
log_error "数据文件缺少字符集声明"
|
|
|
|
|
|
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))"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 导出数据库
|
|
|
|
|
|
export_database() {
|
|
|
|
|
|
log_info "========== 开始导出数据库 =========="
|
|
|
|
|
|
|
|
|
|
|
|
check_config
|
|
|
|
|
|
check_mysqldump
|
|
|
|
|
|
create_backup_dir
|
|
|
|
|
|
export_structure
|
|
|
|
|
|
export_data
|
|
|
|
|
|
verify_export
|
|
|
|
|
|
|
|
|
|
|
|
log_info "========== 数据库导出完成 =========="
|
2026-02-28 15:18:01 +08:00
|
|
|
|
log_info "使用 ./import_database.sh <env> 导入到目标环境"
|
2026-02-28 14:28:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 使用帮助
|
|
|
|
|
|
show_usage() {
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo "用法: $0 [command]"
|
2026-02-28 14:28:40 +08:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo "命令:"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo " export 导出数据库(默认命令)"
|
|
|
|
|
|
echo " help 显示帮助信息"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "说明:"
|
|
|
|
|
|
echo " 此脚本从开发环境导出数据库到 doc/database/backup/ 文件夹"
|
|
|
|
|
|
echo " 生成文件:"
|
|
|
|
|
|
echo " - ccdi_structure.sql (表结构)"
|
|
|
|
|
|
echo " - ccdi_data.sql (数据)"
|
2026-02-28 14:28:40 +08:00
|
|
|
|
echo ""
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo "前置条件:"
|
|
|
|
|
|
echo " 1. 已配置 db_config.conf 文件"
|
|
|
|
|
|
echo " 2. 已安装 MySQL 客户端工具(mysqldump)"
|
2026-02-28 14:28:40 +08:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo "示例:"
|
2026-02-28 15:18:01 +08:00
|
|
|
|
echo " $0 # 导出数据库(默认)"
|
|
|
|
|
|
echo " $0 export # 导出数据库"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "后续操作:"
|
|
|
|
|
|
echo " 使用 ./import_database.sh <env> 导入到目标环境"
|
2026-02-28 14:28:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 主函数
|
|
|
|
|
|
main() {
|
|
|
|
|
|
case "$1" in
|
2026-02-28 15:18:01 +08:00
|
|
|
|
export|"")
|
2026-02-28 14:28:40 +08:00
|
|
|
|
export_database
|
|
|
|
|
|
;;
|
|
|
|
|
|
help|--help|-h)
|
|
|
|
|
|
show_usage
|
|
|
|
|
|
;;
|
|
|
|
|
|
*)
|
|
|
|
|
|
log_error "未知命令: $1"
|
|
|
|
|
|
show_usage
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
;;
|
|
|
|
|
|
esac
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 执行主函数
|
|
|
|
|
|
main "$@"
|