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