Files
pangolin/server/migrations/mysql/000008_provision.up.sql
T
wangjia f3471ae139 feat(server/db): 数据层多库支持(1/4)— 连接分派 + 双方言迁移管线
- config 增 DB_DRIVER(mysql 默认 | sqlite);DSN 对 sqlite 为文件路径
- db.OpenDriver 按驱动分派:sqlite 用 modernc(纯 Go 免 CGO)+ WAL/
  busy_timeout/foreign_keys/_txlock=immediate;mysql 路径不变
- store.Open 分派;mysql 保留 UTC/collation 断言,sqlite 跳过
- 迁移拆 migrations/{mysql,sqlite}/ 双套,embed 双 FS,migrate 按驱动选源
  与 golang-migrate 驱动;修复 m.Close() 误关调用方 *sql.DB 的坑
- cmd/migrate 串入 DB_DRIVER;集成测试 MigrateUp 签名更新
- 新增 SQLite 时间往返 smoke 测试与端到端迁移测试(免 docker)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 00:01:03 +08:00

38 lines
2.0 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 弹性节点基建(task #14 / tsk_6u0FxmbC7Yeq
-- 厂商 API 适配层与一键更换编排所需的最小附加结构。全部为附加式变更,
-- 不触碰现网生产 EC2deploy/ 的 marzban 机器)。
-- nodes 增补:厂商实例标识与弹性 IP 标识(销毁 / 换 IP 不换机所需)。
-- 凭证仍不入库;这里只存厂商侧的资源 ID,便于幂等地销毁与换绑。
ALTER TABLE nodes
ADD COLUMN provider_instance_id VARCHAR(128) NULL AFTER provider_id,
ADD COLUMN elastic_ip_id VARCHAR(128) NULL AFTER provider_instance_id;
-- node_events 增补 ip_rotated(换 IP 不换机的审计事件)。
ALTER TABLE node_events
MODIFY COLUMN event ENUM('provisioned','probe_pass','probe_fail','marked_up','draining',
'blocked_suspect','blocked_confirmed','replaced','destroyed','ip_rotated') NOT NULL;
-- 开退机幂等表:幂等键 → 已开机节点 uuid。重放同一幂等键不重复开机。
CREATE TABLE provision_idempotency (
idempotency_key VARCHAR(128) NOT NULL PRIMARY KEY,
node_uuid CHAR(36) NOT NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 一键更换编排记录:make-before-break 的可恢复状态机。
-- 进程崩溃后可凭 uuid 续跑,step 标记进度,不重复开机 / 不重复销毁。
CREATE TABLE replacements (
uuid CHAR(36) NOT NULL PRIMARY KEY,
old_node_id BIGINT UNSIGNED NOT NULL,
new_node_id BIGINT UNSIGNED NULL,
pool ENUM('consumable','premium') NOT NULL,
status ENUM('running','done','failed') NOT NULL DEFAULT 'running',
step VARCHAR(32) NOT NULL DEFAULT 'open_new',
detail JSON NULL,
created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
INDEX idx_status (status),
INDEX idx_old_node (old_node_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;