改进内容: 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>
259 lines
6.9 KiB
Bash
259 lines
6.9 KiB
Bash
#!/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 "$@"
|