改进内容: 1. export_database.sh - 将数据库配置直接内置在脚本顶部 - 移除外部配置文件依赖 - 配置项: DB_HOST, DB_PORT, DB_USER, DB_PASS, DB_NAME 2. import_database.sh - 将三个环境的配置内置在脚本顶部 - 配置项: DEV_DB_*, TEST_DB_*, PROD_DB_* - 无需额外配置文件 3. 更新操作指南 - 反映配置内置的变化 - 更新配置步骤说明 - 更新文件结构说明 优点: - 使用更简单,无需创建配置文件 - 配置集中在一处,易于管理 - 减少文件依赖 使用方法: 1. 编辑 export_database.sh 顶部配置数据库信息 2. 编辑 import_database.sh 顶部配置目标环境数据库信息 3. ./export_database.sh # 导出数据库 4. ./import_database.sh <dev|test|prod> # 导入到目标环境
270 lines
7.1 KiB
Bash
270 lines
7.1 KiB
Bash
#!/bin/bash
|
||
|
||
# CCDI 数据库导出脚本
|
||
# 功能:从开发环境导出数据库到 backup 文件夹
|
||
|
||
set -e # 遇到错误立即退出
|
||
|
||
# =====================================================
|
||
# 数据库配置(请根据实际情况修改)
|
||
# =====================================================
|
||
|
||
# 源数据库配置(开发环境)
|
||
DB_HOST="116.62.17.81"
|
||
DB_PORT="3306"
|
||
DB_USER="root"
|
||
DB_PASS="Kfcx@1234"
|
||
DB_NAME="ccdi"
|
||
|
||
# 导出文件配置
|
||
BACKUP_DIR="doc/database/backup"
|
||
STRUCTURE_FILE="ccdi_structure.sql"
|
||
DATA_FILE="ccdi_data.sql"
|
||
|
||
# mysqldump 参数配置
|
||
CHARACTER_SET="utf8mb4"
|
||
MAX_ALLOWED_PACKET="512M"
|
||
|
||
# =====================================================
|
||
# 脚本逻辑(无需修改)
|
||
# =====================================================
|
||
|
||
# 颜色定义
|
||
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)"
|
||
|
||
# 检查 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 "$DB_HOST" \
|
||
-P "$DB_PORT" \
|
||
-u "$DB_USER" \
|
||
-p"$DB_PASS" \
|
||
--no-data \
|
||
--skip-triggers \
|
||
--skip-add-drop-table \
|
||
--default-character-set=$CHARACTER_SET \
|
||
--single-transaction \
|
||
--max_allowed_packet=$MAX_ALLOWED_PACKET \
|
||
"$DB_NAME" > "$temp_file" 2>/dev/null
|
||
|
||
if [ $? -eq 0 ]; then
|
||
# 添加字符集声明到文件头部
|
||
{
|
||
echo "-- CCDI 数据库表结构"
|
||
echo "-- 导出时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
||
echo "-- 源数据库: ${DB_HOST}:${DB_PORT}/${DB_NAME}"
|
||
echo "-- 字符集: ${CHARACTER_SET}"
|
||
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 "$DB_HOST" \
|
||
-P "$DB_PORT" \
|
||
-u "$DB_USER" \
|
||
-p"$DB_PASS" \
|
||
--no-create-info \
|
||
--skip-triggers \
|
||
--default-character-set=$CHARACTER_SET \
|
||
--single-transaction \
|
||
--complete-insert \
|
||
--extended-insert \
|
||
--max_allowed_packet=$MAX_ALLOWED_PACKET \
|
||
"$DB_NAME" > "$temp_file" 2>/dev/null
|
||
|
||
if [ $? -eq 0 ]; then
|
||
# 添加字符集声明到文件头部
|
||
{
|
||
echo "-- CCDI 数据库数据"
|
||
echo "-- 导出时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
||
echo "-- 源数据库: ${DB_HOST}:${DB_PORT}/${DB_NAME}"
|
||
echo "-- 字符集: ${CHARACTER_SET}"
|
||
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_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 " 数据库配置已内置在脚本顶部,请根据实际情况修改"
|
||
echo " 配置项: DB_HOST, DB_PORT, DB_USER, DB_PASS, DB_NAME"
|
||
echo ""
|
||
echo "前置条件:"
|
||
echo " 已安装 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 "$@"
|