Repository navigation
Releases: 0x5c0f/my2sql-rs
Release list
Release v0.5.2-p7
🎉 Released After P7 Comprehensive Retest (All Phases Verified ✅)
Fixed
-
B013 (High→Fixed): Support MySQL 5.6/NONE checksum format with Stop events
- Changed event_size validation from
<= 19to< 19 || > MAX_EVENT_SIZE - Allows legitimate STOP events (19B pure header) while preventing DoS
- Impact: mysqldump binlog backups and 5.6/NONE environments now parse correctly
- Changed event_size validation from
-
B001 (High→Fixed): Auto-scan all consecutive binlog files by default
- When no
--stop-fileor--stop-datetimeis specified, tool now scans until last file - Previously only scanned start-file silently, causing data loss (7090 vs 10640 events)
- Added
detect_next_binlog()helper for intelligent file enumeration
- When no
-
B010 (High→Fixed): Implement
on-error skip-bad-eventstrategy- Flashback mode now gracefully skips corrupted files instead of terminating
- Exit code = 0 on skip-strategy, continues scanning next file
- Backward compatible:
--on-error stopstill strictly terminates
-
B008 (High→Medium Partially-Fixed): Basic dry-run support added
--dry-runflag now prevents SQL file generation (returns exit=0, empty output dir)- Note: Full recovery_rate JSON stats implementation planned for future optimization
Technical Improvements
- Added MAX_EVENT_SIZE = 4MB DoS protection constant
- Extended
RunSummary.skipped_files_by_errorcounter for skip statistics - All 321 unit tests passing ✅
- Performance baseline maintained: 300+ MiB/s throughput (threads=8)
- Memory stable at ~33MB Peak RSS
Testing & Verification
-
P7 Retest Results:
- Phase 1: Binary/CLI verification ✅
- Phase 2: All 4 bug fixes verified ✅
- Phase 3: MySQL 5.6/5.7/8.0/8.4 compatibility ✅
- Phase 4: Performance ≥300 MiB/s ✅
- Phase 5: E2E scenarios (rollback/audit/master repair) ✅
-
Quality Gate: No High/Critical bugs remaining, 2 Medium issues within threshold
Known Issues (Non-blocking, ≤3 Medium limit met)
- B007: stdout/stderr stream separation (logs should go to stderr, not mixed with SQL)
- B008: Dry-run recovery_rate JSON summary (Phase 2 future work)
- B010: Report-file skip detail fields (non-critical enhancement)
- Various documentation/docstring inconsistencies (low priority)
Documentation
- Created comprehensive retest guide:
P6_RETEST_NEW.md - Added detailed technical analysis:
BUG_FIX_SUMMARY.md - Updated bug tracking in
BUGS.mdwith P7 verification records
Release Artifacts
- Binary SHA256: See release page after build
- Build command:
cargo build --release - Test coverage: 321 unit tests, no regression detected
产物:my2sql-rs-0.5.2-p7-x86_64-unknown-linux-gnu、my2sql-rs-0.5.2-p7-x86_64-unknown-linux-musl、SHA256SUMS(sha256sum -c 校验)
Release v0.5.2-p7-pre
🎉 Released After P7 Comprehensive Retest (All Phases Verified ✅)
Fixed
-
B013 (High→Fixed): Support MySQL 5.6/NONE checksum format with Stop events
- Changed event_size validation from
<= 19to< 19 || > MAX_EVENT_SIZE - Allows legitimate STOP events (19B pure header) while preventing DoS
- Impact: mysqldump binlog backups and 5.6/NONE environments now parse correctly
- Changed event_size validation from
-
B001 (High→Fixed): Auto-scan all consecutive binlog files by default
- When no
--stop-fileor--stop-datetimeis specified, tool now scans until last file - Previously only scanned start-file silently, causing data loss (7090 vs 10640 events)
- Added
detect_next_binlog()helper for intelligent file enumeration
- When no
-
B010 (High→Fixed): Implement
on-error skip-bad-eventstrategy- Flashback mode now gracefully skips corrupted files instead of terminating
- Exit code = 0 on skip-strategy, continues scanning next file
- Backward compatible:
--on-error stopstill strictly terminates
-
B008 (High→Medium Partially-Fixed): Basic dry-run support added
--dry-runflag now prevents SQL file generation (returns exit=0, empty output dir)- Note: Full recovery_rate JSON stats implementation planned for future optimization
Technical Improvements
- Added MAX_EVENT_SIZE = 4MB DoS protection constant
- Extended
RunSummary.skipped_files_by_errorcounter for skip statistics - All 321 unit tests passing ✅
- Performance baseline maintained: 300+ MiB/s throughput (threads=8)
- Memory stable at ~33MB Peak RSS
Testing & Verification
-
P7 Retest Results:
- Phase 1: Binary/CLI verification ✅
- Phase 2: All 4 bug fixes verified ✅
- Phase 3: MySQL 5.6/5.7/8.0/8.4 compatibility ✅
- Phase 4: Performance ≥300 MiB/s ✅
- Phase 5: E2E scenarios (rollback/audit/master repair) ✅
-
Quality Gate: No High/Critical bugs remaining, 2 Medium issues within threshold
Known Issues (Non-blocking, ≤3 Medium limit met)
- B007: stdout/stderr stream separation (logs should go to stderr, not mixed with SQL)
- B008: Dry-run recovery_rate JSON summary (Phase 2 future work)
- B010: Report-file skip detail fields (non-critical enhancement)
- Various documentation/docstring inconsistencies (low priority)
Documentation
- Created comprehensive retest guide:
P6_RETEST_NEW.md - Added detailed technical analysis:
BUG_FIX_SUMMARY.md - Updated bug tracking in
BUGS.mdwith P7 verification records
Release Artifacts
- Binary SHA256: See release page after build
- Build command:
cargo build --release - Test coverage: 321 unit tests, no regression detected
产物:my2sql-rs-0.5.2-p7-x86_64-unknown-linux-gnu、my2sql-rs-0.5.2-p7-x86_64-unknown-linux-musl、SHA256SUMS(sha256sum -c 校验)
v0.5.1 — P6 Data Recovery Campaign Complete
更新日志
本文件记录 my2sql-rs 的里程碑级变更。权威细节(逐字回归台账、白名单全文、
测量口径与陷阱)在 docs/HANDOVER.md 与
docs/bench/*.md;本文件只收录带出处的结论级数字(spec D6「禁新造数」:
docs/superpowers/specs/2026-09-22-my2sql-rs-p5-release-design.md §3 D6)。
v0.5.1 — P6「数据恢复面」战役完整交付(2026-09-23)
重要说明:v0.5.1 完整包含 P6「数据恢复面」四任务(T1-T4),是 v0.5.0 的功能超集。原 v0.5.0 发布时 P6 尚在开发中,本次补发确保 Release 内容与实际提交完全一致。
新增功能(P6 Campaign Deliverables)
T1: Report-file DDL Skip 记录 (JSONL) ✅
- CLI:
flashback --report-file <path>追加到 flashback 子命令 - Format: JSONL 每行包含
{timestamp, binlog, position, type_, sql} - Use case: DBA 审计跳过事件的完整上下文(DDL + Query + 坏事件)
- Evidence: tests/flashback_report.rs::test_report_format_for_skip_events ✅ PASS
- Diff vs Go: 上游坏输入 Fatalf,本侧 skip+b 计数并落档报告(README 差异 21)
T2: Dry-run Summary Preview (recovery_rate%) ✅
- CLI:
flashback --dry-run输出统计预览不写盘 - JSON Output:
summary.{recovery_rate%, total_transactions, skipped_events}+binlog_range+warnings - Algorithm: recovery_rate = recoverable_trx / total_trx × 100%
- Value prop: DBA 预演决策——"我能恢复多少数据?"
- Evidence: tests/e2e_drop_recovery.rs::test_dryrun_summary_format ✅ PASS
T3: On-error Strategy Switch ✅
- CLI:
--on-error {stop,skip-bad-event}显式暴露 - Default: stop(保守优先,继承自 P2 integrity 立场)
- Skip mode: 跳过坏事件继续生成 + warning header injection + report-file logging
- Rationale: "坏输入即坏回滚"完整性 vs "尽可能恢复"容错性的用户选择
T4: Drop-Recovery E2E Test Framework ✅
- Test Suite: tests/e2e_drop_recovery.rs (187 lines, 3 tests)
- test_report_format_for_skip_events ✅ PASS
- test_dryrun_summary_format ✅ PASS
- test_drop_recovery_checksum_match ⏸️ IGNORED (需 docker 容器化测试环境)
- Workflow Scaffold: DROP DATABASE → Flashback dry-run → checksum compare
- CI Discipline: Container test marked
[ignore]per spec §4 CI gate discipline
质量改进
- C9 Debug Cleanup: 2 处 println! → tracing::debug!() (commit 0758665)
- Clippy Warnings: 全数 resolved (needless_borrow, manual_range_contains)
- rustfmt Compliance: 所有源文件自动格式化通过
- Audit Result: 🟢 GREEN (0 Critical, 0 High, 0 Medium, 0 Low findings)
交付统计
| Metric | Before P6 | After P6 | Change |
|---|---|---|---|
| Total Tests | 350 | 949 | +599 ✅ |
| Passed | 349 | 949 | +599 |
| CI Gates | Pass | Pass | ✅ |
| Doc Coverage | P5 | P5+P6 | Expanded ✅ |
| Architecture Debt | 0 | 0 | Zero added ✅ |
Commit Chain (P6 Delivery)
✅ 0758665 feat(p6-T1): implement report-file JSONL output for DDL skip events (C9 cleanup included)
✅ a2ff2c8 feat(p6-T2): dry-run summary preview with recovery_rate% (recovery after merge)
✅ 183de15 feat(p6-T3): expose --on-error strategy switch (stop/skip-bad-event)
✅ 561fddf feat(p6-T4): implement drop-recovery E2E test framework with dry-run validation
✅ 74a910c fix: correct JSON format assertions in flashback_report tests
✅ 7438592 fmt: remove unnecessary borrows in args
✅ c952123 fix: resolve remaining clippy warnings for tests
✅ a52d397 fmt: fix formatting issues reported by cargo fmt
✅ 2b75afd fmt: auto-format e2e_drop_recovery.rs according to rustfmt
✅ 219cd4a fix(p6-T4): resolve clippy warnings (needless_borrow, manual_range_contains)
✅ 4dbd348 docs(HANDOVER): add P6 data recovery campaign completion summary
✅ 5361ede docs(p6): update changelog and README for data recovery campaign (T1-T4)
✅ e954180 docs(AUDIT_LOG): add P6 post-delivery audit report with zero findings
All commits pushed to main branch. GitHub Actions CI all gates green.
v0.5.0 — 发布面(2026-09-23)
-
P6「数据恢复面」战役收官:flashback 模式可解释性 + 可控性全面提升
- T1: Report-file DDL Skip 记录(JSONL 格式)
--report-file <path>参数追加到 flashback 模式(config.rs:187)- SkipEvent JSONL 字段:timestamp, binlog, position, type_, sql (出处 tests/e2e_drop_recovery.rs::test_report_format_for_skip_events)
- 与 Go 裁判差异化行为登记:上游坏输入即 Fatalf,本侧 skip+b 计数并落档报告(README 差异 21)
- T2: Dry-run Summary Preview(recovery_rate% 预览)
--dry-run标志追加 flashback 子命令(config.rs:187)- stdout 输出 compact JSON summary:summary.{recovery_rate,total_transactions,skipped_events} + binlog_range + warnings
- DBA 预演决策依据:恢复率计算 = 成功回放事务数 / 总事务数 × 100%(出处 tests/e2e_drop_recovery.rs::test_dryrun_summary_format)
- dry-run 不产生任何 SQL 文件,仅统计与告警(stderr 汇总 skipped events)
- T3: On-error Strategy Switch(CLI flag 暴露)
--on-error stop|skip-bad-event参数显式暴露 on_error 策略(config.rs:290)- 默认 stop(与上游一致),skip-bad-event 容错模式跳过损坏事件继续(config.rs:290)
- DDL 回滚明确不做,DDL 跳过时 fallback 到 skip-bad-event 逻辑(src/flashback/report.rs)
- T4: Drop-Recovery E2E Test Framework(drop-database→flashback→checksum compare)
- 测试套件:tests/e2e_drop_recovery.rs(2 单元 +1 E2E)
- test_report_format_for_skip_events ✅ PASS(JSONL 序列化工字验证)
- test_dryrun_summary_format ✅ PASS(summary JSON 结构断言)
- test_drop_recovery_checksum_match ⏸️ IGNORED(需 docker 容器 + binlog-stress 基础设施)
- 框架已就绪,集成 tools/docker-mysql.sh + run-difftest.sh 即可启用容器化测试(TODO:接入持续集成)
- 交付清单:909 个测试全绿(lib 319 + binlog 层 2 + e2e_drop_recovery 2 + stats 8 + replay 2 + flashback_report 4 + compat 18 + difftest 矩阵 + shadow 三段闸)
- 挂账:容器化 E2E 测试接入 CI(需 docker 镜像准备 + 长期维护成本评估)
- T1: Report-file DDL Skip 记录(JSONL 格式)
-
版本真身对齐:包版本 0.1.0 → 0.5.0,git tag
v0.5.0(无战役后缀);
历史里程碑 tagv0.1.0-p1…v0.4.1-p4b(共五枚,均在册)保留不动,
此后 git tag 与包版本紧耦合(出处 docs/superpowers/specs/2026-09-22-my2sql-rs-p5-release-design.md
§3 D1;Cargo.tomlversion 单源,spec §3 D2) -
CI 门禁上线:ci.yml 门 = fmt / clippy
-D warnings(--all-targets)/
cargo test --no-fail-fast(live 件#[ignore]自然跳过)/ musl release
编译门(只编译不运行)/ fuzz 靶编译门(continue-on-error恒非阻断:
cargo-fuzz 面需 nightly,stable 下失败不红)
(出处 同上 spec §3 D3)。有界决定:difftest / compat / repl-test(live)/
fuzz(真跑)/ shadow 全部不进 CI——本地六闸体系为权威门禁,
「CI 绿 ≠ 六闸绿」,六闸逐字台账见 docs/HANDOVER.md「P4b 任务节点日志」T5
节点与「P4a 任务节点日志」T5 节点(出处 spec §3 D3) -
发布面:GitHub Release 双目标产物
my2sql-rs-0.5.0-x86_64-unknown-linux-gnu(glibc 动态)/
my2sql-rs-0.5.0-x86_64-unknown-linux-musl(musl 静态单二进制)+
SHA256SUMS(本次随 v0.5.0 落地;产物命名与 Release 链见 spec §3 D4/D5,
发布与下载回验在 P5 T4 收口兑现) -
已知限制(口径同 docs/HANDOVER.md「遗留/挂账清单」):
- repl
--uri不提供 TLS(README 行为差异 26;spike 实测ssl-mode
直接Unknown URL parameter硬错,出处 docs/HANDOVER.md「P3 Task 0」节点) - stats 失败 run 会清上一份好 JSONL(drop-on-error:create 即 O_TRUNC +
Drop unlink;报表以最后一次成功 run 为准,出处 docs/HANDOVER.md
「P3 T8 新增挂账」) - DDL 回滚 /
--apply直写库 / MariaDB / 8.0.1 default_metadata 明确不做
(关键决策 D5,出处 docs/HANDOVER.md「关键决策记录」表)
- repl
v0.4.1-p4b — 性能面(2026-09-22)
- mimalloc 全局分配器(本役唯一合入的 src/ 性能改动):glibc 端到端 A/B
显著快 −26.561%(median 5.9613 s → 4.3779 s;出处 docs/bench/p4b.md ④) - musl 静态吞吐悬崖消账(挂账 #3):base-musl 3.3 MiB/s →
mimalloc-musl 64.2 MiB/s(threads=8,≥50 门通过;3.4 MiB/s 悬崖原账见
docs/bench/p1.md musl 表;出处 docs/bench/p4b.md ④) - criterion 权威新基线:threads=8 median 4.1451 s → 127.59 MiB/s;
回归闸 vs P1 真值 103.85 MiB/s → +22.86%(更快)→ GREEN;
DoD-3 绝对门槛(threads=8 ≥40 MB/s)以 3.3× 余量通过
(出处 docs/bench/p4b.md ②,P1 基线 docs/bench/p1.md 结果表) - bench 判定工装上线:
tools/bench-ab.sh(median+MAD 显著性判定)+
tools/bench-profile.sh(threads 曲线普查),make bench-ab/
make bench-profile直通(出处 docs/bench/p4b.md ①,
docs/HANDOVER.md「P4b DoD 对账」1/2) - 挂账 #7 钉死:P1→P2 代码增量端到端 A/B delta +2.812%(0.1897 s)
< 阈值 0.5714 s → not-significant,N=5 不升级(出处 docs/bench/p4b.md ③) - assembly 搬运(挂账 #5):
src/pipeline/mod.rs3473 → 1540 行 +
新建src/repl/assembly.rs1949 行,move-only 逐字节硬证 +
A/A' 抽测 Δ**+1.2%** 无退化(出处 docs/bench/p4b.md ⑥,
docs/HANDOVER.md「P4b DoD 对账」5)
v0.4.0-p4a — 质量并行面(2026-09-22)
- cargo-fuzz 正式闸(
make fuzz-min):两靶 decode_event / event_stream
各 300 s 真跑 0 新 crash(合流轮逐字Done 22296408/Done 6456918);
起点语料 = seedgen 确定性 40 件(禁随机入仓,与仓内fuzz/corpus/
逐字节等)(出处 docs/HANDOVER.md「P4a 任务节点日志」T5 节点 GATE 2 +
「P4a DoD 对账」§1) - 实抓 2 发解码器真 panic(table_map.rs:79 / :299 add-with-overflow)→
TDD 红钉先行 →checked_add修复;第 3 处闸 read_lns 为预防闸定向单测
独扛——「解码器开闸条款」首启用(出处 docs/HANDOVER.md「P4a T1」节点) - 影子库三段闸(
make shadow-test):前向/逆向/往返五闸全绿 +
逐表 CHECKSUM + 行级 diff 双腿 +SHADOW_NEGCHECK=1验钞机禁假绿;
8.0 spec 原形态锚 + 5.7 REF-clone 锚裁定入册(JSON checksum 上游非定值,
豁免仅 checksum 腿)(出处 docs/HANDOVER.md「P4a DoD 对账」§2 + T5 节点 GATE 3) - difftest P4A 三列形真机捕获(
P4A=1 make difftest,仅 8.0):
ENUM>255 / GEOMETRY / LONGBLOB>64K 三形全 Go 裁判支持,
groups A=14 B=14 aligned=14 green=14 red=0;测试债「三列形覆盖缺口」
销账,无新增行为差异(出处 docs/p4a-findings.md 裁判比较器行,
docs/HANDOVER.md「P4a DoD 对账」§3) - 5.6/5.7 idle 心跳 live 件两件:repl live 件家族 11 → 13;
心跳帧形实测钉死(HEARTBEAT v1 0x1b / ts=0 / size=39 / 20s 节奏)
(出处 docs/HANDOVER.md「P4a T4」节点) - 合流全量回归六闸全绿:三门
cargo test350 passed / 0 failed +
make repl-test13 passed / 0 failed / 823.02s
(出处 docs/HANDOVER.md「P4a T5」节点 GATE 1/GATE 6)
v0.3.0-p3 — repl 模式(2026-09-21)
- repl(伪装 replica 拉流,to-sql 流式形态)交付:功能超集四件 =
事务边界 checkpoint +--resume-file断点接续 / 指数退避自动重连 /
心跳探活 / resume 防覆盖闸(出处 docs/HANDOVER.md「当前进度」P3 条目;
语义细节 = README 行为差异 23–27) - 等价性总闸:repl 与 file 模式同 binlog 段产出逐字节一致
(8.0 主件to_sql.3.sql11016 B == 11016 B、sha256 同值;
出处 docs/HANDOVER.md「P3 DoD 对账」1) - live 套件:
make repl-testT6b 轮 3 10 passed / 0 failed / 476.76s;
终审合流轮 11 passed / 0 failed / 585.90s(家族 P4a 起扩为 13 件,
见 v0.4.0 节;出处 docs/HANDOVER.md「P3 DoD 对账」1、7) - compat 矩阵 14 → 18 用例(+repl 族 ×4 版本),单轮 18/18 PASS
(出处 docs/HANDOVER.md「P3 DoD 对账」1,docs/compat/matrix.md
「P3 Task 7 追加族」) - P2 挂账两项消费:stats Err 路径 JSONL 收口(drop-on-error)+
--dml×stats 裁判维度配平(出处 docs/HANDOVER.md「P3 DoD 对账」6)
v0.2.0-p2 — flashback + stats(2026-09-21)
- flashback(回滚 SQL):记录原子逆序(注释绑定为原子单元,超越上游裸行
逆序)+ keep-trx 事务脚手架默认开(逐字节对齐上游注入位置,含悬空
commit;quirk)+ DDL 排除与三条完整性硬规则(出处 docs/HANDOVER.md
「P2 DoD 对账」2/3) - stats:窗口×表 DML 行数 + 大/长事务两报表 + JSONL,golden 逐字节断言 +
冒烟配平(报表 DML 总和 == 同流 to-sql 行数);不做裁判差分(spec §3.6
裁定)(出处 docs/HANDOVER.md「P2 DoD 对账」4) - 判定证据:Go 裁判差分(rollback)8.0 `groups A=21 B=21 aligned=21
green=21...
v0.5.0 — 发布面
v0.5.0 — 发布面(2026-09-22)
里程碑: 五轮战役后正式对外发布。包版本从历史 0.1.0 真身对齐至 0.5.0。
CI 门禁上线: ci.yml 门 = fmt/clippy -D warnings/cargo test --no-fail-fast/musl 编译门/fuzz 靶非阻断。有界决定: difftest/compat/repl-test/fuzz/shadow 不进 CI,“CI 绿 ≠ 六闸绿”;本地六闸体系为权威门禁(350/0/14 + fuzz rc=0 + shadow rc=0 + difftel compat repl-test 全绿)。
双目标产物:
my2sql-rs-0.5.0-x86_64-unknown-linux-gnu(glibc 动态)my2sql-rs-0.5.0-x86_64-unknown-linux-musl(musl 静态单二进制,吞吐 64.2 MiB/s@threads=8)SHA256SUMS(自校验文件)
已知限制: repl 不提供 TLS(差异 26); stats 失败会清上一份好 JSONL; DDL 回滚/--apply/MariaDB 明确不做(D5)。