1.0.579.sql 2.5 KB

123456789101112131415161718192021222324252627282930313233343536
  1. -- 1.0.579 —— 工作包 B:ETL 执行机实例注册表。
  2. -- 背景:2026-09-24 aidopdev 连接耗尽(1040)。执行机身份此前由配置/环境变量决定,
  3. -- 无法在页面上查看与切换,也看不出有几个后端进程连着同一个库。
  4. -- 本脚本只建表,不写入任何指派。
  5. --
  6. -- 指派语义(勿自动化):is_runner=1 的那一行是当前 ETL 执行机,**只由人工指派**。
  7. -- 后端注册器(EtlInstanceRegistrar)插入新行时 is_runner 恒为 0,从不自荐。
  8. -- 建表后如果一行都不指派,定时 ETL 就不会运行——这是设计,不是故障。
  9. --
  10. -- 唯一性:「最多一行 is_runner=1」在 MySQL 里没有直接可用的约束表达(无部分索引),
  11. -- 由写入侧在同一事务内把其余行置 0 来保证。这里只对 instance_id 建唯一索引。
  12. --
  13. -- 人工指派示例(把某台指为执行机,同事务内清掉其余):
  14. -- START TRANSACTION;
  15. -- UPDATE ado_etl_instance SET is_runner=0, update_time=NOW() WHERE is_runner=1;
  16. -- UPDATE ado_etl_instance SET is_runner=1, update_time=NOW() WHERE instance_id='机器名:进程ID:启动时间';
  17. -- COMMIT;
  18. -- 切换后最迟 60 秒(AidopRunnerState.FreshnessWindow)生效,**不需要重启进程**。
  19. --
  20. -- 幂等:IF NOT EXISTS,可重复执行。
  21. CREATE TABLE IF NOT EXISTS ado_etl_instance (
  22. id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
  23. instance_id VARCHAR(200) NOT NULL COMMENT '实例标识:机器名:进程ID:启动时间',
  24. machine_name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '机器名',
  25. process_id INT NOT NULL DEFAULT 0 COMMENT '进程ID',
  26. app_version VARCHAR(64) DEFAULT NULL COMMENT '入口程序集版本,仅供排障',
  27. is_runner TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否被指派为ETL执行机,仅人工指派',
  28. started_at DATETIME NOT NULL COMMENT '进程启动时间',
  29. last_heartbeat_at DATETIME NOT NULL COMMENT '最近心跳,据此判存活',
  30. create_time DATETIME NOT NULL COMMENT '创建时间',
  31. update_time DATETIME NOT NULL COMMENT '更新时间',
  32. PRIMARY KEY (id),
  33. UNIQUE KEY uk_ado_etl_instance_instance_id (instance_id),
  34. KEY ix_ado_etl_instance_runner (is_runner, last_heartbeat_at)
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ETL执行机实例注册';