数据库由MySQL向PostgreSQL过渡优化,尚未进行全局统一

pull/40/head
echo 5 months ago
parent 4246920d7c
commit 38113a581c

@ -26,6 +26,7 @@ CREATE TABLE fault_records (
title VARCHAR(200) NOT NULL COMMENT '故障标题',
description TEXT COMMENT '故障详细描述',
affected_nodes JSON COMMENT '受影响的节点列表',
affected_clusters JSON COMMENT '受影响的集群列表',
root_cause TEXT COMMENT '根本原因分析',
repair_suggestion TEXT COMMENT '修复建议',
status ENUM('detected', 'analyzing', 'repairing', 'resolved', 'failed') NOT NULL DEFAULT 'detected' COMMENT '状态',
@ -70,30 +71,42 @@ CREATE TABLE exec_logs (
KEY idx_execution_status (execution_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='执行日志表';
-- 1.3 集群状态表
DROP TABLE IF EXISTS cluster_status;
CREATE TABLE cluster_status (
-- 1.3 节点信息表 (原 cluster_status 表,优化后)
DROP TABLE IF EXISTS nodes;
CREATE TABLE nodes (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
cluster_id BIGINT NOT NULL COMMENT '集群ID',
node_id VARCHAR(50) NOT NULL COMMENT '节点标识',
node_name VARCHAR(100) NOT NULL COMMENT '节点名称',
ip_address VARCHAR(15) NOT NULL COMMENT 'IP地址',
node_role ENUM('NameNode', 'DataNode', 'ResourceManager', 'NodeManager') NOT NULL COMMENT '节点角色',
node_status ENUM('online', 'offline', 'maintenance', 'unknown') NOT NULL DEFAULT 'unknown' COMMENT '节点状态',
cpu_usage DECIMAL(5,2) COMMENT 'CPU使用率(%)',
memory_usage DECIMAL(5,2) COMMENT '内存使用率(%)',
disk_usage DECIMAL(5,2) COMMENT '磁盘使用率(%)',
health_score INT DEFAULT 100 COMMENT '健康评分(0-100)',
uuid VARCHAR(36) NOT NULL COMMENT '节点唯一标识UUID',
cluster_id BIGINT NOT NULL COMMENT '所属集群ID',
hostname VARCHAR(100) NOT NULL COMMENT '节点主机名',
ip_address VARCHAR(45) NOT NULL COMMENT '节点IP地址',
status ENUM('healthy', 'unhealthy', 'warning', 'unknown') NOT NULL DEFAULT 'unknown' COMMENT '节点健康状态',
cpu_usage DECIMAL(5, 2) COMMENT 'CPU使用率 (%)',
memory_usage DECIMAL(5, 2) COMMENT '内存使用率 (%)',
disk_usage DECIMAL(5, 2) COMMENT '磁盘使用率 (%)',
last_heartbeat TIMESTAMP COMMENT '最后心跳时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_uuid (uuid),
KEY idx_cluster_id (cluster_id),
UNIQUE KEY uk_cluster_hostname (cluster_id, hostname)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='节点信息表';
-- 1.4 集群-节点关系表(一对多:一个节点只属于一个集群)
DROP TABLE IF EXISTS cluster_node_mapping;
CREATE TABLE cluster_node_mapping (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
cluster_id BIGINT NOT NULL COMMENT '集群ID',
node_id BIGINT NOT NULL COMMENT '节点ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_node_id (node_id),
UNIQUE KEY uk_cluster_node (cluster_id, node_id),
KEY idx_cluster_id (cluster_id),
KEY idx_node_status (node_status),
KEY idx_last_heartbeat (last_heartbeat)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='集群状态表';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='集群-节点关系表:节点唯一绑定至一个集群';
-- 1.4 系统日志表
DROP TABLE IF EXISTS system_logs;
@ -124,19 +137,23 @@ CREATE TABLE system_logs (
-- 2. 配置管理与用户表
-- =====================================================
-- 2.1 集群信息表
-- 2.1 集群信息表 (优化后)
DROP TABLE IF EXISTS clusters;
CREATE TABLE clusters (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
cluster_name VARCHAR(100) NOT NULL COMMENT '集群名称',
cluster_type VARCHAR(50) NOT NULL COMMENT '集群类型 (e.g., Hadoop, Kubernetes)',
uuid VARCHAR(36) NOT NULL COMMENT '集群唯一标识UUID',
name VARCHAR(100) NOT NULL COMMENT '集群名称',
type VARCHAR(50) NOT NULL COMMENT '集群类型 (e.g., Hadoop, Kubernetes)',
node_count INT DEFAULT 0 COMMENT '集群节点数量',
health_status ENUM('healthy', 'warning', 'error', 'unknown') NOT NULL DEFAULT 'unknown' COMMENT '集群健康状态',
description TEXT COMMENT '集群描述',
config_info JSON COMMENT '集群配置信息 (e.g., NameNode地址)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_cluster_name (cluster_name)
UNIQUE KEY uk_uuid (uuid),
UNIQUE KEY uk_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='集群信息表';
-- 2.2 角色表
@ -286,10 +303,11 @@ CREATE TABLE repair_templates (
-- 故障记录表关联集群
ALTER TABLE fault_records
ADD COLUMN cluster_id BIGINT COMMENT '关联集群ID' AFTER fault_id,
ADD CONSTRAINT fk_fault_records_cluster_id
FOREIGN KEY (cluster_id) REFERENCES clusters(id)
ON DELETE SET NULL ON UPDATE CASCADE;
ADD COLUMN cluster_id BIGINT COMMENT '关联集群ID' AFTER fault_id;
-- 外键约束将在所有表创建后统一添加
-- ADD CONSTRAINT fk_fault_records_cluster_id
-- FOREIGN KEY (cluster_id) REFERENCES clusters(id)
-- ON DELETE SET NULL ON UPDATE CASCADE;
-- 执行日志表关联故障记录表
ALTER TABLE exec_logs
@ -303,17 +321,31 @@ ADD CONSTRAINT fk_system_logs_fault_id
FOREIGN KEY (fault_id) REFERENCES fault_records(fault_id)
ON DELETE SET NULL ON UPDATE CASCADE;
-- 节点与集群外键约束(在所有表创建后统一添加)
ALTER TABLE nodes
ADD CONSTRAINT fk_nodes_cluster
FOREIGN KEY (cluster_id) REFERENCES clusters(id)
ON DELETE CASCADE ON UPDATE CASCADE;
-- 集群-节点关系表外键约束
ALTER TABLE cluster_node_mapping
ADD CONSTRAINT fk_cnm_cluster
FOREIGN KEY (cluster_id) REFERENCES clusters(id)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE cluster_node_mapping
ADD CONSTRAINT fk_cnm_node
FOREIGN KEY (node_id) REFERENCES nodes(id)
ON DELETE CASCADE ON UPDATE CASCADE;
-- 系统日志表关联集群
ALTER TABLE system_logs
ADD CONSTRAINT fk_system_logs_cluster_id
FOREIGN KEY (cluster_id) REFERENCES clusters(id)
ON DELETE SET NULL ON UPDATE CASCADE;
-- 集群状态表关联集群
ALTER TABLE cluster_status
ADD CONSTRAINT fk_cluster_status_cluster_id
FOREIGN KEY (cluster_id) REFERENCES clusters(id)
ON DELETE CASCADE ON UPDATE CASCADE;
-- 节点信息表关联集群 (外键已在CREATE TABLE中定义)
-- ALTER TABLE nodes ADD CONSTRAINT fk_nodes_cluster FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE ON UPDATE CASCADE;
-- 角色-权限映射表关联
ALTER TABLE role_permission_mapping
@ -376,9 +408,9 @@ ON DELETE SET NULL ON UPDATE CASCADE;
-- =====================================================
-- 插入默认集群
INSERT INTO clusters (cluster_name, cluster_type, description, config_info) VALUES
('Hadoop主集群', 'Hadoop', '生产环境主Hadoop集群', '{"namenode_uri": "hdfs://nn1.hadoop.prod:8020"}'),
('Hadoop测试集群', 'Hadoop', '用于测试的Hadoop集群', '{"namenode_uri": "hdfs://nn.hadoop.test:8020"}');
INSERT INTO clusters (uuid, name, type, description, config_info) VALUES
('a1b2c3d4-e5f6-7890-1234-567890abcdef', 'Hadoop主集群', 'Hadoop', '生产环境主Hadoop集群', '{"namenode_uri": "hdfs://nn1.hadoop.prod:8020"}'),
('b2c3d4e5-f6a7-8901-2345-67890abcdef1', 'Hadoop测试集群', 'Hadoop', '用于测试的Hadoop集群', '{"namenode_uri": "hdfs://nn.hadoop.test:8020"}');
-- 插入默认系统角色
INSERT INTO roles (role_name, role_key, description, is_system_role) VALUES
@ -477,12 +509,232 @@ WHERE u.username = 'admin' AND r.role_key = 'super_admin';
INSERT INTO user_cluster_mapping (user_id, cluster_id, role_id)
SELECT u.id, c.id, r.id
FROM users u, clusters c, roles r
WHERE u.username = 'admin' AND c.cluster_name = 'Hadoop主集群' AND r.role_key = 'cluster_admin';
WHERE u.username = 'admin' AND c.name = 'Hadoop主集群' AND r.role_key = 'cluster_admin';
INSERT INTO user_cluster_mapping (user_id, cluster_id, role_id)
SELECT u.id, c.id, r.id
FROM users u, clusters c, roles r
WHERE u.username = 'admin' AND c.cluster_name = 'Hadoop测试集群' AND r.role_key = 'cluster_admin';
WHERE u.username = 'admin' AND c.name = 'Hadoop测试集群' AND r.role_key = 'cluster_admin';
-- =====================================================
-- 触发器:数据一致性校验、关联同步、操作日志记录
-- 覆盖表nodes、cluster_node_mapping、fault_records并对clusters做节点计数聚合
-- 设计原则:
-- 1) BEFORE 阶段进行有效性校验与变更合法性检查;
-- 2) AFTER 阶段进行关联数据同步与操作日志记录;
-- 3) DELETE 阶段维护一致性与日志记录;
-- 4) 使用最小化逻辑,依赖唯一与外键约束,避免全表扫描;
-- 5) 所有触发器均带有详细注释,便于维护与排障。
-- =====================================================
DELIMITER $$
-- -------------------------------
-- nodes 表触发器
-- -------------------------------
-- BEFORE INSERT基本有效性校验
DROP TRIGGER IF EXISTS tr_nodes_bi;
CREATE TRIGGER tr_nodes_bi BEFORE INSERT ON nodes
FOR EACH ROW
BEGIN
-- 数据有效性验证
IF NEW.hostname IS NULL OR NEW.hostname = '' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'nodes.hostname 不能为空';
END IF;
IF NEW.ip_address IS NULL OR NEW.ip_address = '' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'nodes.ip_address 不能为空';
END IF;
END$$
-- BEFORE UPDATE变更合法性校验
DROP TRIGGER IF EXISTS tr_nodes_bu;
CREATE TRIGGER tr_nodes_bu BEFORE UPDATE ON nodes
FOR EACH ROW
BEGIN
-- 数据有效性验证
IF NEW.hostname IS NULL OR NEW.hostname = '' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'nodes.hostname 不能为空';
END IF;
IF NEW.ip_address IS NULL OR NEW.ip_address = '' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'nodes.ip_address 不能为空';
END IF;
END$$
-- AFTER INSERT同步映射 + 更新集群计数 + 操作日志
DROP TRIGGER IF EXISTS tr_nodes_ai;
CREATE TRIGGER tr_nodes_ai AFTER INSERT ON nodes
FOR EACH ROW
BEGIN
-- 关联数据同步
IF NEW.cluster_id IS NOT NULL THEN
INSERT INTO cluster_node_mapping (cluster_id, node_id)
VALUES (NEW.cluster_id, NEW.id)
ON DUPLICATE KEY UPDATE cluster_id = VALUES(cluster_id), updated_at = CURRENT_TIMESTAMP;
-- 更新集群节点计数(增)
UPDATE clusters SET node_count = node_count + 1 WHERE id = NEW.cluster_id;
END IF;
-- 操作日志记录
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NULL, NEW.cluster_id, NOW(), NEW.hostname, 'db_trigger', 'INFO', CONCAT('Nodes INSERT: id=', NEW.id, ', cluster=', NEW.cluster_id));
END$$
-- AFTER UPDATE若归属集群变化同步映射与计数 + 操作日志
DROP TRIGGER IF EXISTS tr_nodes_au;
CREATE TRIGGER tr_nodes_au AFTER UPDATE ON nodes
FOR EACH ROW
BEGIN
IF (NEW.cluster_id <> OLD.cluster_id) THEN
INSERT INTO cluster_node_mapping (cluster_id, node_id)
VALUES (NEW.cluster_id, NEW.id)
ON DUPLICATE KEY UPDATE cluster_id = VALUES(cluster_id), updated_at = CURRENT_TIMESTAMP;
-- 更新计数:旧集群减,新集群加
IF OLD.cluster_id IS NOT NULL THEN
UPDATE clusters SET node_count = GREATEST(node_count - 1, 0) WHERE id = OLD.cluster_id;
END IF;
IF NEW.cluster_id IS NOT NULL THEN
UPDATE clusters SET node_count = node_count + 1 WHERE id = NEW.cluster_id;
END IF;
END IF;
-- 操作日志记录
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NULL, NEW.cluster_id, NOW(), NEW.hostname, 'db_trigger', 'INFO', CONCAT('Nodes UPDATE: id=', NEW.id, ', cluster=', NEW.cluster_id));
END$$
-- AFTER DELETE维护集群计数 + 操作日志
DROP TRIGGER IF EXISTS tr_nodes_ad;
CREATE TRIGGER tr_nodes_ad AFTER DELETE ON nodes
FOR EACH ROW
BEGIN
IF OLD.cluster_id IS NOT NULL THEN
UPDATE clusters SET node_count = GREATEST(node_count - 1, 0) WHERE id = OLD.cluster_id;
END IF;
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NULL, OLD.cluster_id, NOW(), OLD.hostname, 'db_trigger', 'INFO', CONCAT('Nodes DELETE: id=', OLD.id, ', cluster=', OLD.cluster_id));
END$$
-- -------------------------------
-- cluster_node_mapping 表触发器
-- -------------------------------
-- BEFORE INSERT有效性与唯一性提示依赖唯一约束
DROP TRIGGER IF EXISTS tr_cnm_bi;
CREATE TRIGGER tr_cnm_bi BEFORE INSERT ON cluster_node_mapping
FOR EACH ROW
BEGIN
IF NEW.cluster_id IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'cluster_node_mapping.cluster_id 不能为空';
END IF;
IF NEW.node_id IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'cluster_node_mapping.node_id 不能为空';
END IF;
-- 若节点已绑定其它集群,阻止插入,提示使用 UPDATE 修改归属
IF EXISTS (SELECT 1 FROM cluster_node_mapping WHERE node_id = NEW.node_id AND cluster_id <> NEW.cluster_id) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '节点已绑定其它集群请使用UPDATE修改归属';
END IF;
END$$
-- AFTER INSERT同步 nodes.cluster_id + 日志
DROP TRIGGER IF EXISTS tr_cnm_ai;
CREATE TRIGGER tr_cnm_ai AFTER INSERT ON cluster_node_mapping
FOR EACH ROW
BEGIN
UPDATE nodes n SET n.cluster_id = NEW.cluster_id WHERE n.id = NEW.node_id;
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NULL, NEW.cluster_id, NOW(), 'db', 'db_trigger', 'INFO', CONCAT('CNM INSERT: node_id=', NEW.node_id, ', cluster=', NEW.cluster_id));
END$$
-- BEFORE UPDATE有效性校验
DROP TRIGGER IF EXISTS tr_cnm_bu;
CREATE TRIGGER tr_cnm_bu BEFORE UPDATE ON cluster_node_mapping
FOR EACH ROW
BEGIN
IF NEW.cluster_id IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'cluster_node_mapping.cluster_id 不能为空';
END IF;
END$$
-- AFTER UPDATE同步 nodes.cluster_id + 日志
DROP TRIGGER IF EXISTS tr_cnm_au;
CREATE TRIGGER tr_cnm_au AFTER UPDATE ON cluster_node_mapping
FOR EACH ROW
BEGIN
UPDATE nodes n SET n.cluster_id = NEW.cluster_id WHERE n.id = NEW.node_id;
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NULL, NEW.cluster_id, NOW(), 'db', 'db_trigger', 'INFO', CONCAT('CNM UPDATE: node_id=', NEW.node_id, ', cluster=', NEW.cluster_id));
END$$
-- AFTER DELETE解除 nodes.cluster_id + 日志
DROP TRIGGER IF EXISTS tr_cnm_ad;
CREATE TRIGGER tr_cnm_ad AFTER DELETE ON cluster_node_mapping
FOR EACH ROW
BEGIN
UPDATE nodes n SET n.cluster_id = NULL WHERE n.id = OLD.node_id AND n.cluster_id = OLD.cluster_id;
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NULL, OLD.cluster_id, NOW(), 'db', 'db_trigger', 'INFO', CONCAT('CNM DELETE: node_id=', OLD.node_id, ', cluster=', OLD.cluster_id));
END$$
-- -------------------------------
-- fault_records 表触发器
-- -------------------------------
-- BEFORE INSERTJSON有效性验证
DROP TRIGGER IF EXISTS tr_fault_bi;
CREATE TRIGGER tr_fault_bi BEFORE INSERT ON fault_records
FOR EACH ROW
BEGIN
IF NEW.affected_nodes IS NOT NULL AND JSON_VALID(NEW.affected_nodes) = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'fault_records.affected_nodes 必须为合法JSON';
END IF;
IF NEW.affected_clusters IS NOT NULL AND JSON_VALID(NEW.affected_clusters) = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'fault_records.affected_clusters 必须为合法JSON';
END IF;
END$$
-- BEFORE UPDATEJSON有效性校验
DROP TRIGGER IF EXISTS tr_fault_bu;
CREATE TRIGGER tr_fault_bu BEFORE UPDATE ON fault_records
FOR EACH ROW
BEGIN
IF NEW.affected_nodes IS NOT NULL AND JSON_VALID(NEW.affected_nodes) = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'fault_records.affected_nodes 必须为合法JSON';
END IF;
IF NEW.affected_clusters IS NOT NULL AND JSON_VALID(NEW.affected_clusters) = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'fault_records.affected_clusters 必须为合法JSON';
END IF;
END$$
-- AFTER INSERT记录操作日志
DROP TRIGGER IF EXISTS tr_fault_ai;
CREATE TRIGGER tr_fault_ai AFTER INSERT ON fault_records
FOR EACH ROW
BEGIN
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NEW.fault_id, NULL, NOW(), 'db', 'db_trigger', 'INFO', CONCAT('Fault INSERT: fault_id=', NEW.fault_id, ', level=', NEW.fault_level));
END$$
-- AFTER UPDATE记录操作日志
DROP TRIGGER IF EXISTS tr_fault_au;
CREATE TRIGGER tr_fault_au AFTER UPDATE ON fault_records
FOR EACH ROW
BEGIN
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), NEW.fault_id, NULL, NOW(), 'db', 'db_trigger', 'INFO', CONCAT('Fault UPDATE: fault_id=', NEW.fault_id, ', status=', NEW.status));
END$$
-- AFTER DELETE记录操作日志
DROP TRIGGER IF EXISTS tr_fault_ad;
CREATE TRIGGER tr_fault_ad AFTER DELETE ON fault_records
FOR EACH ROW
BEGIN
INSERT INTO system_logs (log_id, fault_id, cluster_id, timestamp, host, service, log_level, message)
VALUES (REPLACE(UUID(), '-', ''), OLD.fault_id, NULL, NOW(), 'db', 'db_trigger', 'INFO', CONCAT('Fault DELETE: fault_id=', OLD.fault_id));
END$$
DELIMITER ;
-- 插入修复脚本模板
INSERT INTO repair_templates (template_name, fault_type, script_content, risk_level, description, parameters) VALUES

@ -0,0 +1,398 @@
-- =====================================================
-- 故障检测系统数据库建表脚本 (MySQL 优化版)
-- 数据库: MySQL 8.0+
-- 字符集: utf8mb4
-- 创建时间: 2025年
-- 说明: 参照原始脚本的分段与注释风格进行重构
-- =====================================================
-- 创建数据库
CREATE DATABASE IF NOT EXISTS hadoop_fault_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hadoop_fault_db;
-- =====================================================
-- 1. 核心业务表
-- =====================================================
-- 1.1 故障记录表
DROP TABLE IF EXISTS fault_records;
CREATE TABLE fault_records (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
fault_id VARCHAR(32) NOT NULL COMMENT '故障唯一标识',
cluster_id BIGINT COMMENT '关联集群ID',
fault_type VARCHAR(50) NOT NULL COMMENT '故障类型',
fault_level ENUM('low','medium','high','critical') NOT NULL DEFAULT 'medium' COMMENT '故障级别',
title VARCHAR(200) NOT NULL COMMENT '故障标题',
description TEXT COMMENT '故障详细描述',
affected_nodes JSON COMMENT '受影响的节点列表',
affected_clusters JSON COMMENT '受影响的集群列表',
root_cause TEXT COMMENT '根本原因分析',
repair_suggestion TEXT COMMENT '修复建议',
status ENUM('detected','analyzing','repairing','resolved','failed') NOT NULL DEFAULT 'detected' COMMENT '状态',
assignee VARCHAR(50) COMMENT '负责人',
reporter VARCHAR(50) DEFAULT 'system' COMMENT '报告人',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
resolved_at TIMESTAMP NULL COMMENT '解决时间',
PRIMARY KEY (id),
UNIQUE KEY uk_fault_id (fault_id),
KEY idx_fault_type (fault_type),
KEY idx_status (status),
KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='故障记录表';
-- 1.2 执行日志表
DROP TABLE IF EXISTS exec_logs;
CREATE TABLE exec_logs (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
exec_id VARCHAR(32) NOT NULL COMMENT '执行唯一标识',
fault_id VARCHAR(32) NOT NULL COMMENT '关联故障ID',
command_type VARCHAR(50) NOT NULL COMMENT '命令类型',
script_path VARCHAR(255) COMMENT '脚本路径',
command_content TEXT NOT NULL COMMENT '执行的命令内容',
target_nodes JSON COMMENT '目标执行节点',
risk_level ENUM('low','medium','high') NOT NULL DEFAULT 'medium' COMMENT '风险级别',
execution_status ENUM('pending','running','success','failed','timeout') NOT NULL DEFAULT 'pending' COMMENT '执行状态',
start_time TIMESTAMP NULL COMMENT '开始执行时间',
end_time TIMESTAMP NULL COMMENT '结束执行时间',
duration INT COMMENT '执行时长(秒)',
stdout_log LONGTEXT COMMENT '标准输出日志',
stderr_log LONGTEXT COMMENT '错误输出日志',
exit_code INT COMMENT '退出码',
operator VARCHAR(50) DEFAULT 'system' COMMENT '操作人',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_exec_id (exec_id),
KEY idx_fault_id (fault_id),
KEY idx_execution_status (execution_status),
KEY idx_start_time (start_time),
KEY idx_end_time (end_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='执行日志表';
-- 1.3 节点信息表
DROP TABLE IF EXISTS nodes;
CREATE TABLE nodes (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
uuid VARCHAR(36) NOT NULL COMMENT '节点唯一标识UUID',
cluster_id BIGINT NOT NULL COMMENT '所属集群ID',
hostname VARCHAR(100) NOT NULL COMMENT '节点主机名',
ip_address VARCHAR(45) NOT NULL COMMENT '节点IP地址',
status ENUM('healthy','unhealthy','warning','unknown') NOT NULL DEFAULT 'unknown' COMMENT '节点健康状态',
cpu_usage DECIMAL(5,2) COMMENT 'CPU使用率 (%)',
memory_usage DECIMAL(5,2) COMMENT '内存使用率 (%)',
disk_usage DECIMAL(5,2) COMMENT '磁盘使用率 (%)',
last_heartbeat TIMESTAMP COMMENT '最后心跳时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_uuid (uuid),
KEY idx_cluster_id (cluster_id),
UNIQUE KEY uk_cluster_hostname (cluster_id, hostname),
KEY idx_status (status),
KEY idx_last_heartbeat (last_heartbeat),
KEY idx_ip_address (ip_address)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='节点信息表';
-- 1.4 集群-节点关系表
DROP TABLE IF EXISTS cluster_node_mapping;
CREATE TABLE cluster_node_mapping (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
cluster_id BIGINT NOT NULL COMMENT '集群ID',
node_id BIGINT NOT NULL COMMENT '节点ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_node_id (node_id),
UNIQUE KEY uk_cluster_node (cluster_id, node_id),
KEY idx_cluster_id (cluster_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='集群-节点关系表:节点唯一绑定至一个集群';
-- 1.5 系统日志表
DROP TABLE IF EXISTS system_logs;
CREATE TABLE system_logs (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
log_id VARCHAR(32) NOT NULL COMMENT '日志唯一标识',
fault_id VARCHAR(32) COMMENT '关联故障ID',
cluster_id BIGINT COMMENT '关联集群ID',
timestamp TIMESTAMP NOT NULL COMMENT '日志时间戳',
host VARCHAR(100) NOT NULL COMMENT '主机名',
service VARCHAR(50) NOT NULL COMMENT '服务名',
log_level ENUM('DEBUG','INFO','WARN','ERROR','FATAL') NOT NULL COMMENT '日志级别',
message LONGTEXT NOT NULL COMMENT '日志消息',
exception LONGTEXT COMMENT '异常堆栈',
raw_log LONGTEXT COMMENT '原始日志内容',
processed BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否已处理',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (id),
UNIQUE KEY uk_log_id (log_id),
KEY idx_fault_id (fault_id),
KEY idx_cluster_id (cluster_id),
KEY idx_timestamp (timestamp),
KEY idx_log_level (log_level),
KEY idx_processed (processed)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统日志表';
-- =====================================================
-- 2. 配置管理与用户表
-- =====================================================
-- 2.1 集群信息表
DROP TABLE IF EXISTS clusters;
CREATE TABLE clusters (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
uuid VARCHAR(36) NOT NULL COMMENT '集群唯一标识UUID',
name VARCHAR(100) NOT NULL COMMENT '集群名称',
type VARCHAR(50) NOT NULL COMMENT '集群类型',
node_count INT DEFAULT 0 COMMENT '集群节点数量',
health_status ENUM('healthy','warning','error','unknown') NOT NULL DEFAULT 'unknown' COMMENT '集群健康状态',
description TEXT COMMENT '集群描述',
config_info JSON COMMENT '集群配置信息',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_uuid (uuid),
UNIQUE KEY uk_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='集群信息表';
-- 2.2 角色表
DROP TABLE IF EXISTS roles;
CREATE TABLE roles (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
role_name VARCHAR(50) NOT NULL COMMENT '角色名称',
role_key VARCHAR(50) NOT NULL COMMENT '角色唯一标识',
description VARCHAR(255) COMMENT '角色描述',
is_system_role BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为系统内置角色',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_role_key (role_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- 2.3 权限表
DROP TABLE IF EXISTS permissions;
CREATE TABLE permissions (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
permission_name VARCHAR(100) NOT NULL COMMENT '权限名称',
permission_key VARCHAR(100) NOT NULL COMMENT '权限唯一标识',
description VARCHAR(255) COMMENT '权限描述',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (id),
UNIQUE KEY uk_permission_key (permission_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';
-- 2.4 角色-权限映射表
DROP TABLE IF EXISTS role_permission_mapping;
CREATE TABLE role_permission_mapping (
role_id BIGINT NOT NULL COMMENT '角色ID',
permission_id BIGINT NOT NULL COMMENT '权限ID',
PRIMARY KEY (role_id, permission_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色-权限映射表';
-- 2.5 用户-角色映射表
DROP TABLE IF EXISTS user_role_mapping;
CREATE TABLE user_role_mapping (
user_id BIGINT NOT NULL COMMENT '用户ID',
role_id BIGINT NOT NULL COMMENT '角色ID',
PRIMARY KEY (user_id, role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户-角色映射表';
-- 2.6 用户与集群映射表
DROP TABLE IF EXISTS user_cluster_mapping;
CREATE TABLE user_cluster_mapping (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
cluster_id BIGINT NOT NULL COMMENT '集群ID',
role_id BIGINT NOT NULL COMMENT '角色ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (id),
UNIQUE KEY uk_user_cluster (user_id, cluster_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户与集群映射表';
-- 2.7 应用统一配置表
DROP TABLE IF EXISTS app_configurations;
CREATE TABLE app_configurations (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
config_type ENUM('system','alert_rule','notification','llm') NOT NULL COMMENT '配置类型',
config_key VARCHAR(100) NOT NULL COMMENT '配置键',
config_value JSON NOT NULL COMMENT '配置值 (JSON格式)',
description VARCHAR(500) COMMENT '配置描述',
is_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_config_type_key (config_type, config_key),
KEY idx_is_enabled (is_enabled)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='应用统一配置表';
-- 2.8 用户表
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
username VARCHAR(50) NOT NULL COMMENT '用户名',
email VARCHAR(100) NOT NULL COMMENT '邮箱',
password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希',
full_name VARCHAR(100) NOT NULL COMMENT '姓名',
is_active BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否激活',
last_login TIMESTAMP NULL COMMENT '最后登录时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_username (username),
UNIQUE KEY uk_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 2.9 操作审计表
DROP TABLE IF EXISTS audit_logs;
CREATE TABLE audit_logs (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
user_id BIGINT COMMENT '用户ID',
cluster_id BIGINT COMMENT '集群ID',
role_id BIGINT COMMENT '角色ID',
username VARCHAR(50) NOT NULL COMMENT '用户名',
action VARCHAR(100) NOT NULL COMMENT '操作动作',
resource_type VARCHAR(50) NOT NULL COMMENT '资源类型',
resource_id VARCHAR(100) COMMENT '资源ID',
ip_address VARCHAR(45) NOT NULL COMMENT 'IP地址',
request_data JSON COMMENT '请求数据',
response_status INT COMMENT '响应状态码',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (id),
KEY idx_user_id (user_id),
KEY idx_cluster_id (cluster_id),
KEY idx_role_id (role_id),
KEY idx_action (action),
KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作审计表';
-- =====================================================
-- 3. 扩展表
-- =====================================================
-- 3.1 修复脚本模板表
DROP TABLE IF EXISTS repair_templates;
CREATE TABLE repair_templates (
id BIGINT AUTO_INCREMENT COMMENT '主键ID',
template_name VARCHAR(100) NOT NULL COMMENT '模板名称',
fault_type VARCHAR(50) NOT NULL COMMENT '适用故障类型',
script_content TEXT NOT NULL COMMENT '脚本内容',
risk_level ENUM('low','medium','high') NOT NULL DEFAULT 'medium' COMMENT '风险级别',
description TEXT COMMENT '模板描述',
parameters JSON COMMENT '参数定义',
created_by VARCHAR(50) COMMENT '创建人',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_template_name (template_name),
KEY idx_fault_type (fault_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='修复脚本模板表';
-- =====================================================
-- 4. 外键约束
-- =====================================================
ALTER TABLE fault_records ADD CONSTRAINT fk_fault_records_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE exec_logs ADD CONSTRAINT fk_exec_logs_fault_id FOREIGN KEY (fault_id) REFERENCES fault_records(fault_id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE system_logs ADD CONSTRAINT fk_system_logs_fault_id FOREIGN KEY (fault_id) REFERENCES fault_records(fault_id) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE nodes ADD CONSTRAINT fk_nodes_cluster FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE cluster_node_mapping ADD CONSTRAINT fk_cnm_cluster FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE cluster_node_mapping ADD CONSTRAINT fk_cnm_node FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE system_logs ADD CONSTRAINT fk_system_logs_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE role_permission_mapping ADD CONSTRAINT fk_rp_mapping_role_id FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE role_permission_mapping ADD CONSTRAINT fk_rp_mapping_permission_id FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE user_role_mapping ADD CONSTRAINT fk_ur_mapping_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE user_role_mapping ADD CONSTRAINT fk_ur_mapping_role_id FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE user_cluster_mapping ADD CONSTRAINT fk_mapping_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE user_cluster_mapping ADD CONSTRAINT fk_mapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE user_cluster_mapping ADD CONSTRAINT fk_mapping_role_id FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE audit_logs ADD CONSTRAINT fk_audit_logs_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE audit_logs ADD CONSTRAINT fk_audit_logs_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE audit_logs ADD CONSTRAINT fk_audit_logs_role_id FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE SET NULL ON UPDATE CASCADE;
-- =====================================================
-- 5. 初始化数据
-- =====================================================
INSERT INTO clusters (uuid, name, type, description, config_info) VALUES
('a1b2c3d4-e5f6-7890-1234-567890abcdef', 'Hadoop主集群', 'Hadoop', '生产环境主Hadoop集群', '{"namenode_uri": "hdfs://nn1.hadoop.prod:8020"}'),
('b2c3d4e5-f6a7-8901-2345-67890abcdef1', 'Hadoop测试集群', 'Hadoop', '用于测试的Hadoop集群', '{"namenode_uri": "hdfs://nn.hadoop.test:8020"}');
INSERT INTO roles (role_name, role_key, description, is_system_role) VALUES
('超级管理员', 'super_admin', '拥有系统所有权限', TRUE),
('集群管理员', 'cluster_admin', '管理指定集群的所有功能', TRUE),
('普通操作员', 'operator', '执行常规操作,如查看和执行修复任务', TRUE),
('只读观察员', 'viewer', '只能查看数据,不能进行任何修改操作', TRUE);
INSERT INTO permissions (permission_name, permission_key, description) VALUES
('查看用户', 'user:read', '查看用户列表和详情'),
('创建用户', 'user:create', '创建新用户'),
('编辑用户', 'user:update', '修改用户信息'),
('删除用户', 'user:delete', '删除用户'),
('查看角色', 'role:read', '查看角色列表和详情'),
('创建角色', 'role:create', '创建自定义角色'),
('编辑角色', 'role:update', '修改角色信息'),
('删除角色', 'role:delete', '删除自定义角色'),
('分配权限', 'role:assign_permissions', '为角色分配权限'),
('查看集群', 'cluster:read', '查看集群列表和状态'),
('添加集群', 'cluster:create', '添加新集群'),
('编辑集群', 'cluster:update', '修改集群配置'),
('删除集群', 'cluster:delete', '删除集群'),
('查看故障', 'fault:read', '查看故障记录'),
('分析故障', 'fault:analyze', '执行故障分析'),
('修复故障', 'fault:repair', '执行修复操作'),
('查看系统日志', 'log:read', '查看系统运行日志'),
('查看审计日志', 'audit:read', '查看用户操作审计');
-- 超级管理员拥有所有权限
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'super_admin';
-- 集群管理员权限
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'cluster_admin' AND p.permission_key IN (
'cluster:read', 'cluster:update',
'fault:read', 'fault:analyze', 'fault:repair',
'log:read'
);
-- 普通操作员权限
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'operator' AND p.permission_key IN (
'fault:read', 'fault:repair', 'log:read'
);
-- 只读观察员权限
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'viewer' AND p.permission_key IN (
'user:read', 'role:read', 'cluster:read', 'fault:read', 'log:read', 'audit:read'
);
INSERT INTO app_configurations (config_type, config_key, config_value, description, is_enabled) VALUES
('system', 'system.name', '{"value": "故障检测系统"}', '系统名称', TRUE),
('system', 'log.retention.days', '{"value": 90}', '日志保留天数', TRUE),
('system', 'repair.auto.enabled', '{"value": false}', '是否启用自动修复', TRUE),
('llm', 'api.timeout', '{"value": 30}', 'LLM API超时时间(秒)', TRUE);
INSERT INTO app_configurations (config_type, config_key, config_value, description, is_enabled) VALUES
('alert_rule', 'CPU使用率过高', '{"metric": "cpu_usage", "condition": ">", "threshold": 85, "severity": "high"}', 'CPU使用率超过85%时触发告警', TRUE),
('alert_rule', '内存使用率过高', '{"metric": "memory_usage", "condition": ">", "threshold": 90, "severity": "high"}', '内存使用率超过90%时触发告警', TRUE),
('alert_rule', '节点离线', '{"metric": "node_status", "condition": "=", "value": "offline", "severity": "critical"}', '节点离线时触发告警', TRUE);
INSERT INTO app_configurations (config_type, config_key, config_value, description, is_enabled) VALUES
('notification', '默认邮件通知', '{"type": "email", "triggers": ["high", "critical"], "recipients": ["admin@example.com"]}', '向管理员发送高危和严重故障的邮件通知', TRUE);
INSERT INTO users (username, email, password_hash, full_name, is_active) VALUES
('admin', 'admin@example.com', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewdBPj/RK.s5uDjS', '系统管理员', TRUE);
INSERT INTO user_role_mapping (user_id, role_id)
SELECT u.id, r.id FROM users u, roles r WHERE u.username = 'admin' AND r.role_key = 'super_admin';
INSERT INTO user_cluster_mapping (user_id, cluster_id, role_id)
SELECT u.id, c.id, r.id FROM users u, clusters c, roles r WHERE u.username = 'admin' AND c.name = 'Hadoop主集群' AND r.role_key = 'cluster_admin';
INSERT INTO user_cluster_mapping (user_id, cluster_id, role_id)
SELECT u.id, c.id, r.id FROM users u, clusters c, roles r WHERE u.username = 'admin' AND c.name = 'Hadoop测试集群' AND r.role_key = 'cluster_admin';
-- =====================================================
-- 脚本执行完成
-- =====================================================
SELECT 'MySQL schema created successfully!' AS message;

@ -0,0 +1,489 @@
-- =====================================================
-- 故障检测系统数据库建表脚本 (PostgreSQL 优化版)
-- 数据库: PostgreSQL 14+
-- 字符集: UTF8
-- 创建时间: 2025年
-- 说明: 参照原始脚本的分段与注释风格进行重构
-- 注意: 请在目标数据库中执行本脚本(不包含 CREATE DATABASE
-- =====================================================
-- =====================================================
-- 1. 核心业务表
-- =====================================================
-- 1.1 集群信息表
CREATE TABLE IF NOT EXISTS clusters (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
uuid UUID NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL UNIQUE,
type VARCHAR(50) NOT NULL,
node_count INT NOT NULL DEFAULT 0,
health_status VARCHAR(20) NOT NULL DEFAULT 'unknown',
description TEXT,
config_info JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT clusters_health_status_chk CHECK (health_status IN ('healthy','warning','error','unknown'))
);
-- 表与字段注释
COMMENT ON TABLE clusters IS '集群信息表';
COMMENT ON COLUMN clusters.id IS '主键ID';
COMMENT ON COLUMN clusters.uuid IS '集群唯一标识(UUID)';
COMMENT ON COLUMN clusters.name IS '集群名称';
COMMENT ON COLUMN clusters.type IS '集群类型';
COMMENT ON COLUMN clusters.node_count IS '集群节点数量';
COMMENT ON COLUMN clusters.config_info IS '集群配置信息(JSONB)';
COMMENT ON COLUMN clusters.health_status IS '集群健康状态(healthy/warning/error/unknown)';
COMMENT ON COLUMN clusters.description IS '集群描述';
COMMENT ON COLUMN clusters.created_at IS '创建时间';
COMMENT ON COLUMN clusters.updated_at IS '更新时间';
-- 1.2 节点信息表
CREATE TABLE IF NOT EXISTS nodes (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
uuid UUID NOT NULL UNIQUE,
cluster_id BIGINT NOT NULL REFERENCES clusters(id) ON DELETE CASCADE ON UPDATE CASCADE,
hostname VARCHAR(100) NOT NULL,
ip_address INET NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'unknown',
cpu_usage NUMERIC(5,2),
memory_usage NUMERIC(5,2),
disk_usage NUMERIC(5,2),
last_heartbeat TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT nodes_status_chk CHECK (status IN ('healthy','unhealthy','warning','unknown')),
CONSTRAINT nodes_cpu_chk CHECK (cpu_usage IS NULL OR (cpu_usage >= 0 AND cpu_usage <= 100)),
CONSTRAINT nodes_mem_chk CHECK (memory_usage IS NULL OR (memory_usage >= 0 AND memory_usage <= 100)),
CONSTRAINT nodes_disk_chk CHECK (disk_usage IS NULL OR (disk_usage >= 0 AND disk_usage <= 100))
);
-- 表与字段注释
COMMENT ON TABLE nodes IS '节点信息表';
COMMENT ON COLUMN nodes.id IS '主键ID';
COMMENT ON COLUMN nodes.uuid IS '节点唯一标识(UUID)';
COMMENT ON COLUMN nodes.cluster_id IS '所属集群ID';
COMMENT ON COLUMN nodes.hostname IS '节点主机名';
COMMENT ON COLUMN nodes.ip_address IS '节点IP地址(INET, 兼容IPv4/IPv6)';
COMMENT ON COLUMN nodes.status IS '节点健康状态(healthy/unhealthy/warning/unknown)';
COMMENT ON COLUMN nodes.cpu_usage IS 'CPU使用率(%)';
COMMENT ON COLUMN nodes.memory_usage IS '内存使用率(%)';
COMMENT ON COLUMN nodes.disk_usage IS '磁盘使用率(%)';
COMMENT ON COLUMN nodes.last_heartbeat IS '最后心跳时间';
COMMENT ON COLUMN nodes.created_at IS '创建时间';
COMMENT ON COLUMN nodes.updated_at IS '更新时间';
-- 唯一索引:集群内主机名唯一(与 MySQL 的 uk_cluster_hostname 命名保持一致)
CREATE UNIQUE INDEX IF NOT EXISTS uk_cluster_hostname ON nodes(cluster_id, hostname);
CREATE INDEX IF NOT EXISTS idx_nodes_cluster_id ON nodes(cluster_id);
CREATE INDEX IF NOT EXISTS idx_nodes_status ON nodes(status);
CREATE INDEX IF NOT EXISTS idx_nodes_last_heartbeat ON nodes(last_heartbeat);
CREATE INDEX IF NOT EXISTS idx_nodes_ip_address ON nodes(ip_address);
-- 1.3 故障记录表
CREATE TABLE IF NOT EXISTS fault_records (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
fault_id VARCHAR(32) NOT NULL UNIQUE,
cluster_id BIGINT REFERENCES clusters(id) ON DELETE SET NULL ON UPDATE CASCADE,
fault_type VARCHAR(50) NOT NULL,
fault_level VARCHAR(20) NOT NULL DEFAULT 'medium',
title VARCHAR(200) NOT NULL,
description TEXT,
affected_nodes JSONB,
affected_clusters JSONB,
root_cause TEXT,
repair_suggestion TEXT,
status VARCHAR(20) NOT NULL DEFAULT 'detected',
assignee VARCHAR(50),
reporter VARCHAR(50) NOT NULL DEFAULT 'system',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
resolved_at TIMESTAMPTZ,
CONSTRAINT fault_records_level_chk CHECK (fault_level IN ('low','medium','high','critical')),
CONSTRAINT fault_records_status_chk CHECK (status IN ('detected','analyzing','repairing','resolved','failed'))
);
-- 表与字段注释
COMMENT ON TABLE fault_records IS '故障记录表';
COMMENT ON COLUMN fault_records.id IS '主键ID';
COMMENT ON COLUMN fault_records.fault_id IS '故障唯一标识';
COMMENT ON COLUMN fault_records.cluster_id IS '关联集群ID';
COMMENT ON COLUMN fault_records.fault_type IS '故障类型';
COMMENT ON COLUMN fault_records.title IS '故障标题';
COMMENT ON COLUMN fault_records.description IS '故障详细描述';
COMMENT ON COLUMN fault_records.affected_nodes IS '受影响的节点列表(JSONB)';
COMMENT ON COLUMN fault_records.affected_clusters IS '受影响的集群列表(JSONB)';
COMMENT ON COLUMN fault_records.root_cause IS '根本原因分析';
COMMENT ON COLUMN fault_records.repair_suggestion IS '修复建议';
COMMENT ON COLUMN fault_records.fault_level IS '故障级别(low/medium/high/critical)';
COMMENT ON COLUMN fault_records.status IS '状态(detected/analyzing/repairing/resolved/failed)';
COMMENT ON COLUMN fault_records.assignee IS '负责人';
COMMENT ON COLUMN fault_records.reporter IS '报告人';
COMMENT ON COLUMN fault_records.created_at IS '创建时间';
COMMENT ON COLUMN fault_records.updated_at IS '更新时间';
COMMENT ON COLUMN fault_records.resolved_at IS '解决时间';
CREATE INDEX IF NOT EXISTS idx_fault_records_type ON fault_records(fault_type);
CREATE INDEX IF NOT EXISTS idx_fault_records_status ON fault_records(status);
CREATE INDEX IF NOT EXISTS idx_fault_records_created_at ON fault_records(created_at);
-- 1.4 执行日志表
CREATE TABLE IF NOT EXISTS exec_logs (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
exec_id VARCHAR(32) NOT NULL UNIQUE,
fault_id VARCHAR(32) NOT NULL REFERENCES fault_records(fault_id) ON DELETE CASCADE ON UPDATE CASCADE,
command_type VARCHAR(50) NOT NULL,
script_path VARCHAR(255),
command_content TEXT NOT NULL,
target_nodes JSONB,
risk_level VARCHAR(20) NOT NULL DEFAULT 'medium',
execution_status VARCHAR(20) NOT NULL DEFAULT 'pending',
start_time TIMESTAMPTZ,
end_time TIMESTAMPTZ,
duration INT,
stdout_log TEXT,
stderr_log TEXT,
exit_code INT,
operator VARCHAR(50) NOT NULL DEFAULT 'system',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT exec_logs_risk_chk CHECK (risk_level IN ('low','medium','high')),
CONSTRAINT exec_logs_status_chk CHECK (execution_status IN ('pending','running','success','failed','timeout')),
CONSTRAINT exec_logs_duration_chk CHECK (duration IS NULL OR duration >= 0)
);
-- 表与字段注释
COMMENT ON TABLE exec_logs IS '执行日志表';
COMMENT ON COLUMN exec_logs.id IS '主键ID';
COMMENT ON COLUMN exec_logs.exec_id IS '执行唯一标识';
COMMENT ON COLUMN exec_logs.fault_id IS '关联故障ID';
COMMENT ON COLUMN exec_logs.command_type IS '命令类型';
COMMENT ON COLUMN exec_logs.script_path IS '脚本路径';
COMMENT ON COLUMN exec_logs.command_content IS '执行的命令内容';
COMMENT ON COLUMN exec_logs.stdout_log IS '标准输出日志';
COMMENT ON COLUMN exec_logs.stderr_log IS '错误输出日志';
COMMENT ON COLUMN exec_logs.target_nodes IS '目标执行节点(JSONB)';
COMMENT ON COLUMN exec_logs.risk_level IS '风险级别(low/medium/high)';
COMMENT ON COLUMN exec_logs.execution_status IS '执行状态(pending/running/success/failed/timeout)';
COMMENT ON COLUMN exec_logs.start_time IS '开始执行时间';
COMMENT ON COLUMN exec_logs.end_time IS '结束执行时间';
COMMENT ON COLUMN exec_logs.duration IS '执行时长(秒)';
COMMENT ON COLUMN exec_logs.exit_code IS '退出码';
COMMENT ON COLUMN exec_logs.operator IS '操作人';
COMMENT ON COLUMN exec_logs.created_at IS '创建时间';
COMMENT ON COLUMN exec_logs.updated_at IS '更新时间';
CREATE INDEX IF NOT EXISTS idx_exec_logs_fault_id ON exec_logs(fault_id);
CREATE INDEX IF NOT EXISTS idx_exec_logs_status ON exec_logs(execution_status);
CREATE INDEX IF NOT EXISTS idx_exec_logs_start_time ON exec_logs(start_time);
CREATE INDEX IF NOT EXISTS idx_exec_logs_end_time ON exec_logs(end_time);
-- 1.5 系统日志表
CREATE TABLE IF NOT EXISTS system_logs (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
log_id VARCHAR(32) NOT NULL UNIQUE,
fault_id VARCHAR(32) REFERENCES fault_records(fault_id) ON DELETE SET NULL ON UPDATE CASCADE,
cluster_id BIGINT REFERENCES clusters(id) ON DELETE SET NULL ON UPDATE CASCADE,
timestamp TIMESTAMPTZ NOT NULL,
host VARCHAR(100) NOT NULL,
service VARCHAR(50) NOT NULL,
log_level VARCHAR(10) NOT NULL,
message TEXT NOT NULL,
exception TEXT,
raw_log TEXT,
processed BOOLEAN NOT NULL DEFAULT FALSE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT system_logs_level_chk CHECK (log_level IN ('DEBUG','INFO','WARN','ERROR','FATAL'))
);
-- 表与字段注释
COMMENT ON TABLE system_logs IS '系统日志表';
COMMENT ON COLUMN system_logs.log_id IS '日志唯一标识';
COMMENT ON COLUMN system_logs.id IS '主键ID';
COMMENT ON COLUMN system_logs.fault_id IS '关联故障ID';
COMMENT ON COLUMN system_logs.cluster_id IS '关联集群ID';
COMMENT ON COLUMN system_logs.timestamp IS '日志时间戳';
COMMENT ON COLUMN system_logs.host IS '主机名';
COMMENT ON COLUMN system_logs.service IS '服务名';
COMMENT ON COLUMN system_logs.log_level IS '日志级别(DEBUG/INFO/WARN/ERROR/FATAL)';
COMMENT ON COLUMN system_logs.message IS '日志消息';
COMMENT ON COLUMN system_logs.raw_log IS '原始日志内容';
COMMENT ON COLUMN system_logs.processed IS '是否已处理';
COMMENT ON COLUMN system_logs.exception IS '异常堆栈';
COMMENT ON COLUMN system_logs.created_at IS '创建时间';
CREATE INDEX IF NOT EXISTS idx_system_logs_fault_id ON system_logs(fault_id);
CREATE INDEX IF NOT EXISTS idx_system_logs_cluster_id ON system_logs(cluster_id);
CREATE INDEX IF NOT EXISTS idx_system_logs_timestamp ON system_logs(timestamp);
CREATE INDEX IF NOT EXISTS idx_system_logs_level ON system_logs(log_level);
CREATE INDEX IF NOT EXISTS idx_system_logs_processed ON system_logs(processed);
-- 2.1 角色表
CREATE TABLE IF NOT EXISTS roles (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
role_name VARCHAR(50) NOT NULL,
role_key VARCHAR(50) NOT NULL UNIQUE,
description VARCHAR(255),
is_system_role BOOLEAN NOT NULL DEFAULT FALSE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 表注释
COMMENT ON TABLE roles IS '角色表';
COMMENT ON COLUMN roles.id IS '主键ID';
COMMENT ON COLUMN roles.role_name IS '角色名称';
COMMENT ON COLUMN roles.role_key IS '角色唯一标识';
COMMENT ON COLUMN roles.description IS '角色描述';
COMMENT ON COLUMN roles.is_system_role IS '是否为系统内置角色';
COMMENT ON COLUMN roles.created_at IS '创建时间';
COMMENT ON COLUMN roles.updated_at IS '更新时间';
-- 2.2 权限表
CREATE TABLE IF NOT EXISTS permissions (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
permission_name VARCHAR(100) NOT NULL,
permission_key VARCHAR(100) NOT NULL UNIQUE,
description VARCHAR(255),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 表注释
COMMENT ON TABLE permissions IS '权限表';
COMMENT ON COLUMN permissions.id IS '主键ID';
COMMENT ON COLUMN permissions.permission_name IS '权限名称';
COMMENT ON COLUMN permissions.permission_key IS '权限唯一标识';
COMMENT ON COLUMN permissions.description IS '权限描述';
COMMENT ON COLUMN permissions.created_at IS '创建时间';
-- 2.3 角色-权限映射表
CREATE TABLE IF NOT EXISTS role_permission_mapping (
role_id BIGINT NOT NULL REFERENCES roles(id) ON DELETE CASCADE ON UPDATE CASCADE,
permission_id BIGINT NOT NULL REFERENCES permissions(id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (role_id, permission_id)
);
-- 表注释
COMMENT ON TABLE role_permission_mapping IS '角色-权限映射表';
COMMENT ON COLUMN role_permission_mapping.role_id IS '角色ID';
COMMENT ON COLUMN role_permission_mapping.permission_id IS '权限ID';
-- 2.4 用户表
CREATE TABLE IF NOT EXISTS users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(100) NOT NULL,
is_active BOOLEAN NOT NULL DEFAULT TRUE,
last_login TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 表注释
COMMENT ON TABLE users IS '用户表';
COMMENT ON COLUMN users.id IS '主键ID';
COMMENT ON COLUMN users.username IS '用户名';
COMMENT ON COLUMN users.email IS '邮箱';
COMMENT ON COLUMN users.password_hash IS '密码哈希';
COMMENT ON COLUMN users.full_name IS '姓名';
COMMENT ON COLUMN users.is_active IS '是否激活';
COMMENT ON COLUMN users.last_login IS '最后登录时间';
COMMENT ON COLUMN users.created_at IS '创建时间';
COMMENT ON COLUMN users.updated_at IS '更新时间';
-- 2.5 用户-角色映射表
CREATE TABLE IF NOT EXISTS user_role_mapping (
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE,
role_id BIGINT NOT NULL REFERENCES roles(id) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (user_id, role_id)
);
-- 表注释
COMMENT ON TABLE user_role_mapping IS '用户-角色映射表';
COMMENT ON COLUMN user_role_mapping.user_id IS '用户ID';
COMMENT ON COLUMN user_role_mapping.role_id IS '角色ID';
-- 2.6 用户与集群映射表
CREATE TABLE IF NOT EXISTS user_cluster_mapping (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE,
cluster_id BIGINT NOT NULL REFERENCES clusters(id) ON DELETE CASCADE ON UPDATE CASCADE,
role_id BIGINT NOT NULL REFERENCES roles(id) ON DELETE CASCADE ON UPDATE CASCADE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT uk_user_cluster UNIQUE (user_id, cluster_id)
);
-- 表注释
COMMENT ON TABLE user_cluster_mapping IS '用户与集群映射表';
COMMENT ON COLUMN user_cluster_mapping.id IS '主键ID';
COMMENT ON COLUMN user_cluster_mapping.user_id IS '用户ID';
COMMENT ON COLUMN user_cluster_mapping.cluster_id IS '集群ID';
COMMENT ON COLUMN user_cluster_mapping.role_id IS '角色ID';
COMMENT ON COLUMN user_cluster_mapping.created_at IS '创建时间';
-- 2.7 应用统一配置表
CREATE TABLE IF NOT EXISTS app_configurations (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
config_type VARCHAR(20) NOT NULL,
config_key VARCHAR(100) NOT NULL,
config_value JSONB NOT NULL,
description VARCHAR(500),
is_enabled BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT uk_app_config UNIQUE (config_type, config_key),
CONSTRAINT app_config_type_chk CHECK (config_type IN ('system','alert_rule','notification','llm'))
);
-- 表与字段注释
COMMENT ON TABLE app_configurations IS '应用统一配置表';
COMMENT ON COLUMN app_configurations.config_value IS '配置值(JSONB)';
COMMENT ON COLUMN app_configurations.id IS '主键ID';
COMMENT ON COLUMN app_configurations.config_type IS '配置类型(system/alert_rule/notification/llm)';
COMMENT ON COLUMN app_configurations.config_key IS '配置键';
COMMENT ON COLUMN app_configurations.description IS '配置描述';
COMMENT ON COLUMN app_configurations.is_enabled IS '是否启用';
COMMENT ON COLUMN app_configurations.created_at IS '创建时间';
COMMENT ON COLUMN app_configurations.updated_at IS '更新时间';
CREATE INDEX IF NOT EXISTS idx_app_config_enabled ON app_configurations(is_enabled);
-- 3.1 修复脚本模板表
CREATE TABLE IF NOT EXISTS repair_templates (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
template_name VARCHAR(100) NOT NULL UNIQUE,
fault_type VARCHAR(50) NOT NULL,
script_content TEXT NOT NULL,
risk_level VARCHAR(20) NOT NULL DEFAULT 'medium',
description TEXT,
parameters JSONB,
created_by VARCHAR(50),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT repair_templates_risk_chk CHECK (risk_level IN ('low','medium','high'))
);
-- 表与字段注释
COMMENT ON TABLE repair_templates IS '修复脚本模板表';
COMMENT ON COLUMN repair_templates.parameters IS '模板参数定义(JSONB)';
COMMENT ON COLUMN repair_templates.id IS '主键ID';
COMMENT ON COLUMN repair_templates.template_name IS '模板名称';
COMMENT ON COLUMN repair_templates.fault_type IS '适用故障类型';
COMMENT ON COLUMN repair_templates.script_content IS '脚本内容';
COMMENT ON COLUMN repair_templates.risk_level IS '风险级别(low/medium/high)';
COMMENT ON COLUMN repair_templates.description IS '模板描述';
COMMENT ON COLUMN repair_templates.created_by IS '创建人';
COMMENT ON COLUMN repair_templates.created_at IS '创建时间';
COMMENT ON COLUMN repair_templates.updated_at IS '更新时间';
CREATE INDEX IF NOT EXISTS idx_repair_templates_fault_type ON repair_templates(fault_type);
-- 4.1 操作审计表
CREATE TABLE IF NOT EXISTS audit_logs (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id BIGINT REFERENCES users(id) ON DELETE SET NULL ON UPDATE CASCADE,
cluster_id BIGINT REFERENCES clusters(id) ON DELETE SET NULL ON UPDATE CASCADE,
role_id BIGINT REFERENCES roles(id) ON DELETE SET NULL ON UPDATE CASCADE,
username VARCHAR(50) NOT NULL,
action VARCHAR(100) NOT NULL,
resource_type VARCHAR(50) NOT NULL,
resource_id VARCHAR(100),
ip_address INET NOT NULL,
request_data JSONB,
response_status INT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 表与字段注释
COMMENT ON TABLE audit_logs IS '操作审计表';
COMMENT ON COLUMN audit_logs.ip_address IS '请求来源IP(INET, 兼容IPv4/IPv6)';
COMMENT ON COLUMN audit_logs.id IS '主键ID';
COMMENT ON COLUMN audit_logs.user_id IS '用户ID';
COMMENT ON COLUMN audit_logs.cluster_id IS '集群ID';
COMMENT ON COLUMN audit_logs.role_id IS '角色ID';
COMMENT ON COLUMN audit_logs.username IS '用户名';
COMMENT ON COLUMN audit_logs.action IS '操作动作';
COMMENT ON COLUMN audit_logs.resource_type IS '资源类型';
COMMENT ON COLUMN audit_logs.resource_id IS '资源ID';
COMMENT ON COLUMN audit_logs.request_data IS '请求数据(JSONB)';
COMMENT ON COLUMN audit_logs.response_status IS '响应状态码';
COMMENT ON COLUMN audit_logs.created_at IS '创建时间';
CREATE INDEX IF NOT EXISTS idx_audit_logs_user_id ON audit_logs(user_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_cluster_id ON audit_logs(cluster_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_role_id ON audit_logs(role_id);
CREATE INDEX IF NOT EXISTS idx_audit_logs_action ON audit_logs(action);
CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON audit_logs(created_at);
-- =====================================================
-- 5. 初始化数据
-- =====================================================
INSERT INTO clusters (uuid, name, type, description, config_info) VALUES
('a1b2c3d4-e5f6-7890-1234-567890abcdef'::uuid, 'Hadoop主集群', 'Hadoop', '生产环境主Hadoop集群', '{"namenode_uri": "hdfs://nn1.hadoop.prod:8020"}'),
('b2c3d4e5-f6a7-8901-2345-67890abcdef1'::uuid, 'Hadoop测试集群', 'Hadoop', '用于测试的Hadoop集群', '{"namenode_uri": "hdfs://nn.hadoop.test:8020"}');
INSERT INTO roles (role_name, role_key, description, is_system_role) VALUES
('超级管理员', 'super_admin', '拥有系统所有权限', TRUE),
('集群管理员', 'cluster_admin', '管理指定集群的所有功能', TRUE),
('普通操作员', 'operator', '执行常规操作,如查看和执行修复任务', TRUE),
('只读观察员', 'viewer', '只能查看数据,不能进行任何修改操作', TRUE);
INSERT INTO permissions (permission_name, permission_key, description) VALUES
('查看用户', 'user:read', '查看用户列表和详情'),
('创建用户', 'user:create', '创建新用户'),
('编辑用户', 'user:update', '修改用户信息'),
('删除用户', 'user:delete', '删除用户'),
('查看角色', 'role:read', '查看角色列表和详情'),
('创建角色', 'role:create', '创建自定义角色'),
('编辑角色', 'role:update', '修改角色信息'),
('删除角色', 'role:delete', '删除自定义角色'),
('分配权限', 'role:assign_permissions', '为角色分配权限'),
('查看集群', 'cluster:read', '查看集群列表和状态'),
('添加集群', 'cluster:create', '添加新集群'),
('编辑集群', 'cluster:update', '修改集群配置'),
('删除集群', 'cluster:delete', '删除集群'),
('查看故障', 'fault:read', '查看故障记录'),
('分析故障', 'fault:analyze', '执行故障分析'),
('修复故障', 'fault:repair', '执行修复操作'),
('查看系统日志', 'log:read', '查看系统运行日志'),
('查看审计日志', 'audit:read', '查看用户操作审计');
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'super_admin';
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'cluster_admin' AND p.permission_key IN (
'cluster:read', 'cluster:update',
'fault:read', 'fault:analyze', 'fault:repair',
'log:read'
);
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'operator' AND p.permission_key IN (
'fault:read', 'fault:repair', 'log:read'
);
INSERT INTO role_permission_mapping (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p WHERE r.role_key = 'viewer' AND p.permission_key IN (
'user:read', 'role:read', 'cluster:read', 'fault:read', 'log:read', 'audit:read'
);
INSERT INTO app_configurations (config_type, config_key, config_value, description, is_enabled) VALUES
('system', 'system.name', '{"value": "故障检测系统"}', '系统名称', TRUE),
('system', 'log.retention.days', '{"value": 90}', '日志保留天数', TRUE),
('system', 'repair.auto.enabled', '{"value": false}', '是否启用自动修复', TRUE),
('llm', 'api.timeout', '{"value": 30}', 'LLM API超时时间(秒)', TRUE);
INSERT INTO app_configurations (config_type, config_key, config_value, description, is_enabled) VALUES
('alert_rule', 'CPU使用率过高', '{"metric": "cpu_usage", "condition": ">", "threshold": 85, "severity": "high"}', 'CPU使用率超过85%时触发告警', TRUE),
('alert_rule', '内存使用率过高', '{"metric": "memory_usage", "condition": ">", "threshold": 90, "severity": "high"}', '内存使用率超过90%时触发告警', TRUE),
('alert_rule', '节点离线', '{"metric": "node_status", "condition": "=", "value": "offline", "severity": "critical"}', '节点离线时触发告警', TRUE);
INSERT INTO app_configurations (config_type, config_key, config_value, description, is_enabled) VALUES
('notification', '默认邮件通知', '{"type": "email", "triggers": ["high", "critical"], "recipients": ["admin@example.com"]}', '向管理员发送高危和严重故障的邮件通知', TRUE);
INSERT INTO users (username, email, password_hash, full_name, is_active) VALUES
('admin', 'admin@example.com', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewdBPj/RK.s5uDjS', '系统管理员', TRUE);
INSERT INTO user_role_mapping (user_id, role_id)
SELECT u.id, r.id FROM users u, roles r WHERE u.username = 'admin' AND r.role_key = 'super_admin';
INSERT INTO user_cluster_mapping (user_id, cluster_id, role_id)
SELECT u.id, c.id, r.id FROM users u, clusters c, roles r WHERE u.username = 'admin' AND c.name = 'Hadoop主集群' AND r.role_key = 'cluster_admin';
INSERT INTO user_cluster_mapping (user_id, cluster_id, role_id)
SELECT u.id, c.id, r.id FROM users u, clusters c, roles r WHERE u.username = 'admin' AND c.name = 'Hadoop测试集群' AND r.role_key = 'cluster_admin';
-- =====================================================
-- 脚本执行完成
-- =====================================================
SELECT 'PostgreSQL schema created successfully!' AS message;
-- =====================================================
-- 兼容性与差异说明(仅注释,不影响执行)
-- 1) JSONB/INET/UUID 为 PostgreSQL 原生类型MySQL 脚本对应 JSON/VARCHAR(45)/VARCHAR(36)
-- 2) CHECK 约束在 PostgreSQL 中强制生效MySQL 8.0 也支持,但历史版本可能忽略
-- 3) 索引创建统一在表后分组声明;与 MySQL 的 KEY/UNIQUE KEY 语法在风格上保持一致
-- 4) 字符集与排序规则:请确保数据库级设置为 ENCODING UTF8LC_COLLATE/LC_CTYPE 与业务一致
Loading…
Cancel
Save