Files
2025-08-26 21:34:11 +08:00

264 lines
8.9 KiB
Bash
Executable File

#!/bin/bash
# 数据库初始化脚本 - 清空指定表数据并保留特定记录
# 使用方法: ./init-database.sh [数据库配置]
set -e
# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日志函数
log() { echo -e "${GREEN}[$(date +'%H:%M:%S')]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
info() { echo -e "${BLUE}[INFO]${NC} $1"; }
# 默认配置
MYSQL_HOST=${MYSQL_HOST:-"127.0.0.1"}
MYSQL_PORT=${MYSQL_PORT:-"3306"}
MYSQL_USER=${MYSQL_USER:-"root"}
MYSQL_PASSWORD=${MYSQL_PASSWORD:-"123456"}
MYSQL_DATABASE=${MYSQL_DATABASE:-"test"}
# 加载配置文件(如果提供)
CONFIG_FILE=${1:-"custom-config.env"}
if [ -f "$CONFIG_FILE" ]; then
. "$CONFIG_FILE"
log "已加载配置文件: $CONFIG_FILE"
fi
echo "==================== 数据库初始化脚本 ===================="
echo "目标数据库: $MYSQL_HOST:$MYSQL_PORT/$MYSQL_DATABASE"
echo "用户: $MYSQL_USER"
echo ""
# 确认操作
warn "⚠️ 此操作将清空以下表的数据:"
echo "📋 完全清空的表:"
echo " - t_device_info (设备信息)"
echo " - t_device_info_history (设备历史)"
echo " - t_device_user (设备用户关联)"
echo " - t_alert_info (告警信息)"
echo " - t_alert_action_log (告警操作日志)"
echo " - t_device_message (设备消息)"
echo " - t_device_message_detail (设备消息详情)"
echo " - t_user_health_data (用户健康数据)"
echo " - sys_org_units (组织单位)"
echo " - sys_user_org (用户组织关联)"
echo " - sys_position (职位信息)"
echo " - sys_user_postion (用户职位关联)"
echo ""
echo "📋 保留特定记录的表:"
echo " - t_customer_config (保留 id=0 的记录)"
echo " - t_interface (保留 customer_id=1 的记录)"
echo " - t_health_data_config (保留 customer_id=1 的记录)"
echo ""
read -p "确认执行数据库初始化操作? 此操作不可逆! (yes/N): " confirm
if [ "$confirm" != "yes" ]; then
log "操作已取消"
exit 0
fi
# 测试数据库连接
log "测试数据库连接..."
if ! mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SELECT 1;" > /dev/null 2>&1; then
error "无法连接到数据库,请检查配置"
exit 1
fi
log "✅ 数据库连接成功"
# 检查数据库是否存在
log "检查目标数据库..."
if ! mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "USE \`$MYSQL_DATABASE\`;" > /dev/null 2>&1; then
error "数据库 '$MYSQL_DATABASE' 不存在"
exit 1
fi
log "✅ 目标数据库存在"
# 创建备份
BACKUP_FILE="backup/database_backup_$(date +%Y%m%d_%H%M%S).sql"
mkdir -p backup
log "创建数据库备份..."
mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \
--single-transaction --routines --triggers "$MYSQL_DATABASE" > "$BACKUP_FILE"
log "✅ 备份完成: $BACKUP_FILE"
# 执行数据库初始化
log "开始执行数据库初始化..."
# 创建SQL脚本
# 显示操作前的数据统计
log "查询操作前的数据统计..."
mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" << 'EOF'
SELECT '=== 操作前数据统计 ===' as info;
SELECT 't_device_info' as table_name, COUNT(*) as current_count FROM t_device_info
UNION ALL
SELECT 't_alert_info', COUNT(*) FROM t_alert_info
UNION ALL
SELECT 't_user_health_data', COUNT(*) FROM t_user_health_data
UNION ALL
SELECT 'sys_org_units', COUNT(*) FROM sys_org_units
UNION ALL
SELECT 't_customer_config', COUNT(*) FROM t_customer_config
UNION ALL
SELECT 't_interface', COUNT(*) FROM t_interface
UNION ALL
SELECT 't_health_data_config', COUNT(*) FROM t_health_data_config;
EOF
echo ""
read -p "查看数据统计后,确认继续执行清理操作? (yes/N): " final_confirm
if [ "$final_confirm" != "yes" ]; then
log "操作已取消"
exit 0
fi
cat > temp_init.sql << 'EOF'
-- 数据库初始化脚本
-- 清空指定表数据并保留特定记录
-- 设置SQL模式
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
-- 开始事务
START TRANSACTION;
-- 显示操作前统计
SELECT '=== 开始数据清理操作 ===' as info;
-- 1. 完全清空的表
DELETE FROM t_device_info;
SELECT CONCAT('✅ t_device_info 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM t_device_info_history;
SELECT CONCAT('✅ t_device_info_history 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM t_device_user;
SELECT CONCAT('✅ t_device_user 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM t_alert_info;
SELECT CONCAT('✅ t_alert_info 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM t_alert_action_log;
SELECT CONCAT('✅ t_alert_action_log 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM t_device_message;
SELECT CONCAT('✅ t_device_message 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM t_device_message_detail;
SELECT CONCAT('✅ t_device_message_detail 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM t_user_health_data;
SELECT CONCAT('✅ t_user_health_data 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM sys_org_units;
SELECT CONCAT('✅ sys_org_units 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM sys_user_org;
SELECT CONCAT('✅ sys_user_org 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM sys_position;
SELECT CONCAT('✅ sys_position 清空完成, 删除记录数: ', ROW_COUNT()) as result;
DELETE FROM sys_user_postion;
SELECT CONCAT('✅ sys_user_postion 清空完成, 删除记录数: ', ROW_COUNT()) as result;
-- 2. 保留特定记录的表
-- t_customer_config: 保留 id=0 的记录
DELETE FROM t_customer_config WHERE id != 0;
SELECT CONCAT('✅ t_customer_config 部分清理完成, 删除记录数: ', ROW_COUNT(), ', 保留 id=0 记录') as result;
-- t_interface: 保留 customer_id=1 的记录
DELETE FROM t_interface WHERE customer_id != 1;
SELECT CONCAT('✅ t_interface 部分清理完成, 删除记录数: ', ROW_COUNT(), ', 保留 customer_id=1 记录') as result;
-- t_health_data_config: 保留 customer_id=1 的记录
DELETE FROM t_health_data_config WHERE customer_id != 1;
SELECT CONCAT('✅ t_health_data_config 部分清理完成, 删除记录数: ', ROW_COUNT(), ', 保留 customer_id=1 记录') as result;
-- 重置自增ID到合理值
ALTER TABLE t_device_info AUTO_INCREMENT = 1;
ALTER TABLE t_alert_info AUTO_INCREMENT = 1;
ALTER TABLE sys_org_units AUTO_INCREMENT = 1;
ALTER TABLE t_device_message AUTO_INCREMENT = 1;
-- 恢复外键检查
SET foreign_key_checks = 1;
-- 提交事务
COMMIT;
-- 显示最终结果统计
SELECT '=== 最终数据统计 ===' as result;
SELECT 't_device_info' as table_name, COUNT(*) as remaining_count FROM t_device_info
UNION ALL
SELECT 't_device_info_history', COUNT(*) FROM t_device_info_history
UNION ALL
SELECT 't_device_user', COUNT(*) FROM t_device_user
UNION ALL
SELECT 't_alert_info', COUNT(*) FROM t_alert_info
UNION ALL
SELECT 't_alert_action_log', COUNT(*) FROM t_alert_action_log
UNION ALL
SELECT 't_device_message', COUNT(*) FROM t_device_message
UNION ALL
SELECT 't_device_message_detail', COUNT(*) FROM t_device_message_detail
UNION ALL
SELECT 't_user_health_data', COUNT(*) FROM t_user_health_data
UNION ALL
SELECT 'sys_org_units', COUNT(*) FROM sys_org_units
UNION ALL
SELECT 'sys_user_org', COUNT(*) FROM sys_user_org
UNION ALL
SELECT 'sys_position', COUNT(*) FROM sys_position
UNION ALL
SELECT 'sys_user_postion', COUNT(*) FROM sys_user_postion;
SELECT '=== 保留的配置记录 ===' as result;
SELECT 't_customer_config' as table_name, COUNT(*) as remaining_count FROM t_customer_config
UNION ALL
SELECT 't_interface', COUNT(*) FROM t_interface WHERE customer_id = 1
UNION ALL
SELECT 't_health_data_config', COUNT(*) FROM t_health_data_config WHERE customer_id = 1;
EOF
# 执行SQL脚本
log "执行数据库初始化SQL..."
mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < temp_init.sql
if [ $? -eq 0 ]; then
log "✅ 数据库初始化完成"
else
error "❌ 数据库初始化失败"
warn "可以使用备份文件恢复: mysql -h$MYSQL_HOST -P$MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE < $BACKUP_FILE"
exit 1
fi
# 清理临时文件
rm -f temp_init.sql
echo ""
echo "==================== 初始化完成 ===================="
log "🎉 数据库初始化成功完成!"
echo ""
echo "📊 操作总结:"
echo " - 备份文件: $BACKUP_FILE"
echo " - 清空表数量: 12个表"
echo " - 保留配置表: 3个表 (特定记录)"
echo ""
echo "📋 下一步操作:"
echo " - 重启应用服务: docker-compose restart ljwx-boot"
echo " - 验证系统功能: 访问管理后台和监控大屏"
echo " - 导入新的业务数据"
echo ""
echo "🔄 如需恢复数据:"
echo " mysql -h$MYSQL_HOST -P$MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE < $BACKUP_FILE"