| 123456789101112131415161718192021222324252627282930313233343536 |
- -- 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执行机实例注册';
|