Files
ccdi/export_database.sh
wkc 79f00f30d8 refactor: 分离数据库导出和导入脚本,优化文件结构
改进内容:
1. 创建独立的 import_database.sh 导入脚本
   - 从 doc/database/backup/ 读取 SQL 文件
   - 支持导入到 dev/test/prod 环境
   - 自动验证导入结果

2. 简化 export_database.sh 导出脚本
   - 只负责导出数据库到 backup 文件夹
   - 移除导入功能,职责单一
   - 添加后续操作提示

3. 优化文件结构
   - backup 文件夹只保留 SQL 备份文件
   - 配置文件和脚本统一放在根目录
   - 移动操作指南到 doc/database/ 目录

4. 更新操作指南
   - 详细说明两个脚本的用法
   - 完整的迁移流程示例
   - 常见问题解答

文件变更:
- 新增: import_database.sh (独立导入脚本)
- 修改: export_database.sh (简化为导出专用)
- 移动: export_guide.md -> doc/database/数据库迁移操作指南.md
- 删除: doc/database/backup/ 中的非 SQL 文件

使用方法:
- 导出: ./export_database.sh
- 导入: ./import_database.sh <dev|test|prod>
2026-02-28 15:18:01 +08:00

259 lines
6.9 KiB
Bash
Raw 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
# CCDI 数据库导出脚本
# 功能:从开发环境导出数据库到 backup 文件夹
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 \
--default-character-set=utf8mb4 \
--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}"
echo "-- 字符集: utf8mb4"
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 \
--default-character-set=utf8mb4 \
--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}"
echo "-- 字符集: utf8mb4"
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 "========== 数据库导出完成 =========="
log_info "使用 ./import_database.sh <env> 导入到目标环境"
}
# 使用帮助
show_usage() {
echo "用法: $0 [command]"
echo ""
echo "命令:"
echo " export 导出数据库(默认命令)"
echo " help 显示帮助信息"
echo ""
echo "说明:"
echo " 此脚本从开发环境导出数据库到 doc/database/backup/ 文件夹"
echo " 生成文件:"
echo " - ccdi_structure.sql (表结构)"
echo " - ccdi_data.sql (数据)"
echo ""
echo "前置条件:"
echo " 1. 已配置 db_config.conf 文件"
echo " 2. 已安装 MySQL 客户端工具mysqldump"
echo ""
echo "示例:"
echo " $0 # 导出数据库(默认)"
echo " $0 export # 导出数据库"
echo ""
echo "后续操作:"
echo " 使用 ./import_database.sh <env> 导入到目标环境"
}
# 主函数
main() {
case "$1" in
export|"")
export_database
;;
help|--help|-h)
show_usage
;;
*)
log_error "未知命令: $1"
show_usage
exit 1
;;
esac
}
# 执行主函数
main "$@"