From 0f716e8836e66e6c220fcfb288d1a21a2153affc Mon Sep 17 00:00:00 2001
From: 1 <wentingyear@gmail.com>
Date: Wed, 24 Jun 2026 01:14:52 +0800
Subject: [PATCH] 1
---
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.out.json | 0
全局数据格式.md | 61 ++++
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.out.json | 0
data/目录导读.md | 11
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/summary.tsv | 38 ++
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.err.txt | 0
全局存储体系.md | 4
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.err.txt | 0
管理执行日志.md | 140 +++++++++
data/result/stat/ds_minute_backfill_20260619/background.stderr.log | 7
data/全复权分钟线导入说明.md | 151 ++++++++++
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.out.json | 0
scripts/kline_front_incremental_sync.py | 3
data/result/stat/ds_minute_backfill_20260619_r2/dates.txt | 37 ++
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.err.txt | 0
scripts/ds_minute_backfill.ps1 | 61 ++++
.gitignore | 1
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.err.txt | 0
data/result/stat/ds_minute_backfill_20260619/background.stdout.log | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/background.stderr.log | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.err.txt | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/background.stdout.log | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.out.json | 0
data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.out.json | 0
scripts/import_full_adj_minute_csv.py | 330 ++++++++++++++++++++++
89 files changed, 842 insertions(+), 2 deletions(-)
diff --git a/.gitignore b/.gitignore
index 256c59f..f1e29cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@
scripts/**/__pycache__/
scripts/**/*.pyc
data/*.local.md
+data/raw/
管理端上下文.md
MB-X错误日志.md
MB-X错误日志.md
diff --git a/data/result/stat/ds_minute_backfill_20260619/background.stderr.log b/data/result/stat/ds_minute_backfill_20260619/background.stderr.log
new file mode 100644
index 0000000..36a0b30
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619/background.stderr.log
@@ -0,0 +1,7 @@
+Select-String : ·���о��зǷ��ַ���
+����λ�� D:\manage_system\scripts\ds_minute_backfill.ps1:15 �ַ�: 32
++ ... PASSWORD = (Select-String -LiteralPath $localDoc -Pattern '密码:`([^`] ...
++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ + CategoryInfo : NotSpecified: (:) [Select-String], ArgumentException
+ + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.SelectStringCommand
+
diff --git a/data/result/stat/ds_minute_backfill_20260619/background.stdout.log b/data/result/stat/ds_minute_backfill_20260619/background.stdout.log
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619/background.stdout.log
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/background.stderr.log b/data/result/stat/ds_minute_backfill_20260619_r2/background.stderr.log
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/background.stderr.log
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/background.stdout.log b/data/result/stat/ds_minute_backfill_20260619_r2/background.stdout.log
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/background.stdout.log
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/dates.txt b/data/result/stat/ds_minute_backfill_20260619_r2/dates.txt
new file mode 100644
index 0000000..f4344ed
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/dates.txt
@@ -0,0 +1,37 @@
+2026-04-23
+2026-04-24
+2026-04-27
+2026-04-28
+2026-04-29
+2026-04-30
+2026-05-06
+2026-05-07
+2026-05-08
+2026-05-11
+2026-05-12
+2026-05-13
+2026-05-14
+2026-05-15
+2026-05-18
+2026-05-19
+2026-05-20
+2026-05-21
+2026-05-22
+2026-05-25
+2026-05-26
+2026-05-27
+2026-05-28
+2026-05-29
+2026-06-01
+2026-06-02
+2026-06-03
+2026-06-04
+2026-06-05
+2026-06-08
+2026-06-09
+2026-06-10
+2026-06-11
+2026-06-12
+2026-06-15
+2026-06-16
+2026-06-17
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.out.json
new file mode 100644
index 0000000..7f692bd
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260423_162049.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.out.json
new file mode 100644
index 0000000..3305e3c
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260424_162709.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.out.json
new file mode 100644
index 0000000..75e6c16
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260427_163323.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.out.json
new file mode 100644
index 0000000..d99d0ac
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260428_163932.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.out.json
new file mode 100644
index 0000000..9f185e0
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260429_164538.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.out.json
new file mode 100644
index 0000000..a229dbf
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260430_165136.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.out.json
new file mode 100644
index 0000000..fb65d00
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260506_165739.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.out.json
new file mode 100644
index 0000000..94fa3a8
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260507_170341.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.out.json
new file mode 100644
index 0000000..738ecb5
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260508_170943.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.out.json
new file mode 100644
index 0000000..a456123
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260511_171548.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.out.json
new file mode 100644
index 0000000..cd9e23c
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260512_172203.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.out.json
new file mode 100644
index 0000000..cc9e9a5
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260513_172805.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.out.json
new file mode 100644
index 0000000..fac6cf6
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260514_173409.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.out.json
new file mode 100644
index 0000000..0a1b37a
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260515_174009.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.out.json
new file mode 100644
index 0000000..efff234
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260518_174617.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.out.json
new file mode 100644
index 0000000..db7c8c9
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260519_175222.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.out.json
new file mode 100644
index 0000000..5a94ab9
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260520_175827.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.out.json
new file mode 100644
index 0000000..7e5dfd5
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260521_180436.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.out.json
new file mode 100644
index 0000000..eeeb3a8
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260522_181041.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.out.json
new file mode 100644
index 0000000..e17b632
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260525_181704.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.out.json
new file mode 100644
index 0000000..eae6c40
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260526_182307.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.out.json
new file mode 100644
index 0000000..d70dc19
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260527_182915.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.out.json
new file mode 100644
index 0000000..d46233b
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260528_183527.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.out.json
new file mode 100644
index 0000000..231fc14
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260529_184149.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.out.json
new file mode 100644
index 0000000..68b2ade
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260601_184802.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.out.json
new file mode 100644
index 0000000..319df99
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260602_185414.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.out.json
new file mode 100644
index 0000000..1351732
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260603_190024.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.out.json
new file mode 100644
index 0000000..687b28a
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260604_190634.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.out.json
new file mode 100644
index 0000000..eb193a0
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260605_191246.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.out.json
new file mode 100644
index 0000000..051e1a6
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260608_191917.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.out.json
new file mode 100644
index 0000000..e35ce0a
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260609_192531.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.out.json
new file mode 100644
index 0000000..8f49c26
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260610_193146.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.out.json
new file mode 100644
index 0000000..ee03c2c
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260611_193757.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.out.json
new file mode 100644
index 0000000..053c45a
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260612_194411.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.out.json
new file mode 100644
index 0000000..11e89ba
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260615_195031.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.out.json
new file mode 100644
index 0000000..53ad6cb
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260616_195644.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.err.txt b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.err.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.err.txt
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.out.json b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.out.json
new file mode 100644
index 0000000..f97a0ec
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/ds_minute_sync_20260617_200258.out.json
Binary files differ
diff --git a/data/result/stat/ds_minute_backfill_20260619_r2/summary.tsv b/data/result/stat/ds_minute_backfill_20260619_r2/summary.tsv
new file mode 100644
index 0000000..3664165
--- /dev/null
+++ b/data/result/stat/ds_minute_backfill_20260619_r2/summary.tsv
@@ -0,0 +1,38 @@
+date status run_id started_at finished_at
+2026-04-23 SUCCESS ds_minute_sync_20260423_162049 2026-06-19T16:20:49 2026-06-19T16:27:09
+2026-04-24 SUCCESS ds_minute_sync_20260424_162709 2026-06-19T16:27:09 2026-06-19T16:33:23
+2026-04-27 SUCCESS ds_minute_sync_20260427_163323 2026-06-19T16:33:23 2026-06-19T16:39:32
+2026-04-28 SUCCESS ds_minute_sync_20260428_163932 2026-06-19T16:39:32 2026-06-19T16:45:38
+2026-04-29 SUCCESS ds_minute_sync_20260429_164538 2026-06-19T16:45:38 2026-06-19T16:51:36
+2026-04-30 SUCCESS ds_minute_sync_20260430_165136 2026-06-19T16:51:36 2026-06-19T16:57:39
+2026-05-06 SUCCESS ds_minute_sync_20260506_165739 2026-06-19T16:57:39 2026-06-19T17:03:41
+2026-05-07 SUCCESS ds_minute_sync_20260507_170341 2026-06-19T17:03:41 2026-06-19T17:09:43
+2026-05-08 SUCCESS ds_minute_sync_20260508_170943 2026-06-19T17:09:43 2026-06-19T17:15:48
+2026-05-11 SUCCESS ds_minute_sync_20260511_171548 2026-06-19T17:15:48 2026-06-19T17:22:03
+2026-05-12 SUCCESS ds_minute_sync_20260512_172203 2026-06-19T17:22:03 2026-06-19T17:28:05
+2026-05-13 SUCCESS ds_minute_sync_20260513_172805 2026-06-19T17:28:05 2026-06-19T17:34:09
+2026-05-14 SUCCESS ds_minute_sync_20260514_173409 2026-06-19T17:34:09 2026-06-19T17:40:09
+2026-05-15 SUCCESS ds_minute_sync_20260515_174009 2026-06-19T17:40:09 2026-06-19T17:46:17
+2026-05-18 SUCCESS ds_minute_sync_20260518_174617 2026-06-19T17:46:17 2026-06-19T17:52:22
+2026-05-19 SUCCESS ds_minute_sync_20260519_175222 2026-06-19T17:52:22 2026-06-19T17:58:27
+2026-05-20 SUCCESS ds_minute_sync_20260520_175827 2026-06-19T17:58:27 2026-06-19T18:04:36
+2026-05-21 SUCCESS ds_minute_sync_20260521_180436 2026-06-19T18:04:36 2026-06-19T18:10:41
+2026-05-22 SUCCESS ds_minute_sync_20260522_181041 2026-06-19T18:10:41 2026-06-19T18:17:04
+2026-05-25 SUCCESS ds_minute_sync_20260525_181704 2026-06-19T18:17:04 2026-06-19T18:23:07
+2026-05-26 SUCCESS ds_minute_sync_20260526_182307 2026-06-19T18:23:07 2026-06-19T18:29:15
+2026-05-27 SUCCESS ds_minute_sync_20260527_182915 2026-06-19T18:29:15 2026-06-19T18:35:27
+2026-05-28 SUCCESS ds_minute_sync_20260528_183527 2026-06-19T18:35:27 2026-06-19T18:41:49
+2026-05-29 SUCCESS ds_minute_sync_20260529_184149 2026-06-19T18:41:49 2026-06-19T18:48:02
+2026-06-01 SUCCESS ds_minute_sync_20260601_184802 2026-06-19T18:48:02 2026-06-19T18:54:14
+2026-06-02 SUCCESS ds_minute_sync_20260602_185414 2026-06-19T18:54:14 2026-06-19T19:00:24
+2026-06-03 SUCCESS ds_minute_sync_20260603_190024 2026-06-19T19:00:24 2026-06-19T19:06:34
+2026-06-04 SUCCESS ds_minute_sync_20260604_190634 2026-06-19T19:06:34 2026-06-19T19:12:46
+2026-06-05 SUCCESS ds_minute_sync_20260605_191246 2026-06-19T19:12:46 2026-06-19T19:19:17
+2026-06-08 SUCCESS ds_minute_sync_20260608_191917 2026-06-19T19:19:17 2026-06-19T19:25:31
+2026-06-09 SUCCESS ds_minute_sync_20260609_192531 2026-06-19T19:25:31 2026-06-19T19:31:46
+2026-06-10 SUCCESS ds_minute_sync_20260610_193146 2026-06-19T19:31:46 2026-06-19T19:37:57
+2026-06-11 SUCCESS ds_minute_sync_20260611_193757 2026-06-19T19:37:57 2026-06-19T19:44:11
+2026-06-12 SUCCESS ds_minute_sync_20260612_194411 2026-06-19T19:44:11 2026-06-19T19:50:31
+2026-06-15 SUCCESS ds_minute_sync_20260615_195031 2026-06-19T19:50:31 2026-06-19T19:56:44
+2026-06-16 SUCCESS ds_minute_sync_20260616_195644 2026-06-19T19:56:44 2026-06-19T20:02:58
+2026-06-17 SUCCESS ds_minute_sync_20260617_200258 2026-06-19T20:02:58 2026-06-19T20:09:14
diff --git "a/data/\345\205\250\345\244\215\346\235\203\345\210\206\351\222\237\347\272\277\345\257\274\345\205\245\350\257\264\346\230\216.md" "b/data/\345\205\250\345\244\215\346\235\203\345\210\206\351\222\237\347\272\277\345\257\274\345\205\245\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..a6032c8
--- /dev/null
+++ "b/data/\345\205\250\345\244\215\346\235\203\345\210\206\351\222\237\347\272\277\345\257\274\345\205\245\350\257\264\346\230\216.md"
@@ -0,0 +1,151 @@
+# 全复权分钟线导入说明
+
+创建时间:2026-06-14
+
+## 1. 数据定位
+
+本次新增的是 A 股全复权 1 分钟 K 线数据,作为全局 MySQL 行情底座中的独立公共表使用。
+
+目标表:
+
+- `a_share_minute_price_full_adj`
+- `a_share_minute_full_adj_import_run`
+- `a_share_minute_full_adj_import_file_log`
+
+使用边界:
+
+- 这是全复权分钟线,不替代当前默认分钟线 `a_share_minute_price`。
+- 这是独立口径,不与前复权同步影子表 `a_share_minute_price_front_sync` 混用。
+- 查询必须带 `trade_date`、`symbol`,最好再带 `trade_time` 范围;禁止无边界全表扫描。
+
+## 2. 来源
+
+源压缩包:
+
+```text
+D:\A股日级行情数据近两年2023csv.rar
+```
+
+解压目录:
+
+```text
+D:\manage_system\data\raw\a_share_minute_full_adj_2023_2026_csv
+```
+
+压缩包目录结构:
+
+```text
+2023_front_m/<市场>/price_<股票代码>.csv
+```
+
+CSV 字段:
+
+```text
+timetag,open,high,low,close,volumn,amount
+```
+
+字段说明:
+
+- `timetag`:分钟 bar 时间,格式如 `20230523 09:30:00`
+- `open/high/low/close`:全复权 OHLC
+- `volumn`:源文件字段名如此拼写,入库后映射为 `volume`
+- `amount`:成交额
+
+## 3. 导入结果
+
+导入 run_id:
+
+```text
+full_adj_minute_20260614_rar
+```
+
+导入结果:
+
+| 项目 | 数值 |
+|---|---:|
+| 源 CSV 文件数 | 3161 |
+| 已处理文件数 | 3161 |
+| 有效入库行数 | 422,373,172 |
+| 非空数据起始日期 | 2023-03-24 |
+| 非空数据结束日期 | 2026-06-12 |
+| 源 0 字节文件数 | 732 |
+
+按市场统计:
+
+| 市场 | 文件数 | 入库行数 | 0 字节文件数 |
+|---|---:|---:|---:|
+| BJ | 320 | 44,413,040 | 0 |
+| SH | 2314 | 331,542,089 | 508 |
+| SZ | 527 | 46,418,043 | 224 |
+
+0 字节源文件已记录到 `a_share_minute_full_adj_import_file_log`,不写入行情表。
+
+## 4. 表结构摘要
+
+`a_share_minute_price_full_adj` 主键:
+
+```text
+symbol + trade_date + trade_time
+```
+
+核心字段:
+
+| 字段 | 含义 |
+|---|---|
+| `trade_date` | 交易日 |
+| `trade_time` | 分钟时间 |
+| `bar_time` | 完整 datetime |
+| `symbol` | 股票代码,格式如 `600000.SH` |
+| `market` | `SH` / `SZ` / `BJ` |
+| `open_price` | 全复权开盘价 |
+| `high_price` | 全复权最高价 |
+| `low_price` | 全复权最低价 |
+| `close_price` | 全复权收盘价 |
+| `volume` | 源成交量 |
+| `amount` | 源成交额 |
+| `source_file` | 解压后相对文件路径 |
+| `source_archive` | 来源压缩包路径 |
+| `import_run_id` | 导入批次 |
+
+## 5. 导入脚本与证据
+
+导入脚本:
+
+```text
+scripts/import_full_adj_minute_csv.py
+```
+
+运行 wrapper:
+
+```text
+tmp/run_full_adj_minute_import_20260614.ps1
+```
+
+证据日志:
+
+```text
+tmp/full_adj_minute_import_20260614.stdout.log
+tmp/full_adj_minute_import_20260614.stderr.log
+tmp/full_adj_minute_import_20260614.wrapper.log
+tmp/rar_list_A股日级行情数据近两年2023csv_20260614.txt
+tmp/unrar_A股日级行情数据近两年2023csv_20260614.log
+```
+
+## 6. 查询示例
+
+```sql
+SELECT *
+FROM a_share_minute_price_full_adj
+WHERE symbol = '600000.SH'
+ AND trade_date = '2024-01-02'
+ AND trade_time BETWEEN '09:30:00' AND '10:00:00'
+ORDER BY trade_time;
+```
+
+禁止示例:
+
+```sql
+SELECT COUNT(*) FROM a_share_minute_price_full_adj;
+```
+
+全表统计必须优先使用导入运行表和文件日志表。
diff --git "a/data/\347\233\256\345\275\225\345\257\274\350\257\273.md" "b/data/\347\233\256\345\275\225\345\257\274\350\257\273.md"
index 9dbe2d5..acd10df 100644
--- "a/data/\347\233\256\345\275\225\345\257\274\350\257\273.md"
+++ "b/data/\347\233\256\345\275\225\345\257\274\350\257\273.md"
@@ -14,10 +14,19 @@
## 2. 当前状态
-当前目录暂不放置具体数据文件,仅保留本导读文件用于占位和 Git 跟踪。
+当前目录保存全局数据源说明、数据库索引说明、导入脚本说明和可跨项目复用的数据入口说明。
后续新增全局数据材料时,应先确认其是否满足跨项目复用、统一口径和长期维护要求。
+当前已登记材料:
+
+| 文件 | 用途 |
+|---|---|
+| `数据库索引数据.local.md` | 本机 MySQL 连接和历史索引说明;包含本机敏感信息,不提交远程 |
+| `HTTP与MySQL使用说明.md` | 外部前复权 K 线服务 HTTP/MySQL 使用说明 |
+| `K线同步到本地数据库全景说明.md` | 前复权 K 线同步到本地数据库的全景说明 |
+| `全复权分钟线导入说明.md` | 2026-06-14 新增全复权 1 分钟 K 线入库说明 |
+
## 3. 使用原则
1. 不存放临时文件、缓存文件或单项目私有数据。
diff --git a/scripts/ds_minute_backfill.ps1 b/scripts/ds_minute_backfill.ps1
new file mode 100644
index 0000000..678da89
--- /dev/null
+++ b/scripts/ds_minute_backfill.ps1
@@ -0,0 +1,61 @@
+param(
+ [string]$StartDate = "2026-04-23",
+ [string]$EndDate = "2026-06-17",
+ [string]$LogDir = "D:\manage_system\data\result\stat\ds_minute_backfill_20260619"
+)
+
+$ErrorActionPreference = "Stop"
+$root = Split-Path -Parent $PSScriptRoot
+$script = Join-Path $root "scripts\kline_front_incremental_sync.py"
+$localDoc = Get-ChildItem -LiteralPath (Join-Path $root "data") -Filter "*.local.md" |
+ Select-String -Pattern "mysql://root:" -List |
+ Select-Object -First 1 -ExpandProperty Path
+$sourceDoc = Get-ChildItem -LiteralPath (Join-Path $root "data") -Filter "*.local.md" |
+ Select-String -Pattern "trading_xuntou" -List |
+ Select-Object -First 1 -ExpandProperty Path
+
+New-Item -ItemType Directory -Force -Path $LogDir | Out-Null
+
+$env:TIANXIA_MYSQL_PASSWORD = (Select-String -LiteralPath $localDoc -Pattern 'mysql://root:([^@]+)@' | Select-Object -First 1).Matches[0].Groups[1].Value
+$env:KLINE_SOURCE_MYSQL_PASSWORD = (Select-String -LiteralPath $sourceDoc -Pattern 'Password.*`([^`]+)`' | Select-Object -First 1).Matches[0].Groups[1].Value
+
+$datesPath = Join-Path $LogDir "dates.txt"
+@"
+import os, pymysql
+source = pymysql.connect(host='317w7246e5.vicp.fun', port=50176, user='root', password=os.environ['KLINE_SOURCE_MYSQL_PASSWORD'], database='trading_xuntou', charset='utf8mb4', connect_timeout=10, read_timeout=120)
+local = pymysql.connect(host='127.0.0.1', port=3306, user='root', password=os.environ['TIANXIA_MYSQL_PASSWORD'], database='tianxia', charset='utf8mb4', connect_timeout=10, read_timeout=120)
+with source.cursor() as cur:
+ cur.execute("SELECT trade_date FROM cn_stock_kline_front_coverage_daily WHERE period='1m' AND trade_date BETWEEN %s AND %s AND row_count > 0 ORDER BY trade_date", ('$StartDate', '$EndDate'))
+ source_dates = [str(row[0]) for row in cur.fetchall()]
+with local.cursor() as cur:
+ cur.execute("SELECT DISTINCT trade_date FROM a_share_minute_price WHERE trade_date BETWEEN %s AND %s", ('$StartDate', '$EndDate'))
+ done_dates = {str(row[0]) for row in cur.fetchall()}
+for d in source_dates:
+ if d not in done_dates:
+ print(d)
+source.close()
+local.close()
+"@ | python - | Set-Content -LiteralPath $datesPath -Encoding ASCII
+
+$dates = Get-Content -LiteralPath $datesPath | Where-Object { $_ -match '^\d{4}-\d{2}-\d{2}$' }
+$summaryPath = Join-Path $LogDir "summary.tsv"
+"date`tstatus`trun_id`tstarted_at`tfinished_at" | Set-Content -LiteralPath $summaryPath -Encoding UTF8
+
+foreach ($date in $dates) {
+ $runId = "ds_minute_sync_" + ($date -replace "-", "") + "_" + (Get-Date -Format "HHmmss")
+ $started = Get-Date -Format "s"
+ $out = Join-Path $LogDir "$runId.out.json"
+ $err = Join-Path $LogDir "$runId.err.txt"
+ try {
+ python $script --run-id $runId --periods 1m --start-date $date --end-date $date --minute-max-minutes-per-batch 120 --minute-symbols-per-batch 200 --append-to-main > $out 2> $err
+ $status = if ($LASTEXITCODE -eq 0) { "SUCCESS" } else { "FAILED_$LASTEXITCODE" }
+ } catch {
+ $_ | Out-File -LiteralPath $err -Append -Encoding UTF8
+ $status = "FAILED_EXCEPTION"
+ }
+ $finished = Get-Date -Format "s"
+ "$date`t$status`t$runId`t$started`t$finished" | Add-Content -LiteralPath $summaryPath -Encoding UTF8
+ if ($status -notlike "SUCCESS") {
+ break
+ }
+}
diff --git a/scripts/import_full_adj_minute_csv.py b/scripts/import_full_adj_minute_csv.py
new file mode 100644
index 0000000..fc9665e
--- /dev/null
+++ b/scripts/import_full_adj_minute_csv.py
@@ -0,0 +1,330 @@
+from __future__ import annotations
+
+import argparse
+import os
+import re
+import sys
+import time
+from datetime import datetime
+from pathlib import Path
+
+import pymysql
+
+
+MARKET_SUFFIX = {
+ "SH": ".SH",
+ "SZ": ".SZ",
+ "BJ": ".BJ",
+}
+
+
+def connect(args: argparse.Namespace):
+ password = args.password or os.environ.get("TIANXIA_MYSQL_PASSWORD")
+ if not password:
+ raise RuntimeError("missing MySQL password: pass --password or set TIANXIA_MYSQL_PASSWORD")
+ return pymysql.connect(
+ host=args.host,
+ port=args.port,
+ user=args.user,
+ password=password,
+ database=args.database,
+ charset="utf8mb4",
+ autocommit=False,
+ local_infile=True,
+ )
+
+
+def ensure_schema(conn) -> None:
+ ddl = [
+ """
+ CREATE TABLE IF NOT EXISTS a_share_minute_price_full_adj (
+ trade_date date NOT NULL,
+ trade_time time NOT NULL,
+ bar_time datetime NOT NULL,
+ symbol char(9) NOT NULL,
+ market varchar(8) NOT NULL,
+ open_price decimal(14,4) NULL,
+ high_price decimal(14,4) NULL,
+ low_price decimal(14,4) NULL,
+ close_price decimal(14,4) NULL,
+ volume decimal(24,4) NULL,
+ amount decimal(24,4) NULL,
+ source_file varchar(255) NOT NULL,
+ source_archive varchar(255) NOT NULL,
+ import_run_id varchar(96) NOT NULL,
+ imported_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (symbol, trade_date, trade_time),
+ KEY idx_full_adj_minute_date_symbol_time (trade_date, symbol, trade_time),
+ KEY idx_full_adj_minute_run (import_run_id)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
+ """,
+ """
+ CREATE TABLE IF NOT EXISTS a_share_minute_full_adj_import_run (
+ run_id varchar(96) NOT NULL,
+ started_at datetime NOT NULL,
+ finished_at datetime NULL,
+ status varchar(32) NOT NULL,
+ source_archive varchar(512) NOT NULL,
+ source_root varchar(512) NOT NULL,
+ files_total int NOT NULL DEFAULT 0,
+ files_loaded int NOT NULL DEFAULT 0,
+ rows_loaded bigint NOT NULL DEFAULT 0,
+ min_trade_date date NULL,
+ max_trade_date date NULL,
+ error_message text NULL,
+ PRIMARY KEY (run_id)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
+ """,
+ """
+ CREATE TABLE IF NOT EXISTS a_share_minute_full_adj_import_file_log (
+ id bigint NOT NULL AUTO_INCREMENT,
+ run_id varchar(96) NOT NULL,
+ symbol char(9) NOT NULL,
+ market varchar(8) NOT NULL,
+ source_file varchar(512) NOT NULL,
+ file_size bigint NOT NULL,
+ rows_loaded bigint NOT NULL,
+ started_at datetime NOT NULL,
+ finished_at datetime NOT NULL,
+ duration_ms bigint NOT NULL,
+ status varchar(32) NOT NULL,
+ error_message text NULL,
+ PRIMARY KEY (id),
+ UNIQUE KEY uq_full_adj_file_run (run_id, source_file),
+ KEY idx_full_adj_file_symbol (symbol),
+ KEY idx_full_adj_file_status (status)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
+ """,
+ ]
+ with conn.cursor() as cur:
+ for sql in ddl:
+ cur.execute(sql)
+ conn.commit()
+
+
+def discover_files(root: Path) -> list[Path]:
+ files = sorted(root.rglob("price_*.csv"))
+ if not files:
+ raise RuntimeError(f"no price_*.csv files found under {root}")
+ return files
+
+
+def symbol_for(path: Path) -> tuple[str, str]:
+ market = path.parent.name.upper()
+ suffix = MARKET_SUFFIX.get(market)
+ if not suffix:
+ raise RuntimeError(f"unsupported market directory {market}: {path}")
+ m = re.match(r"price_(\d{6})\.csv$", path.name, re.IGNORECASE)
+ if not m:
+ raise RuntimeError(f"unsupported file name: {path}")
+ return m.group(1) + suffix, market
+
+
+def init_run(conn, run_id: str, source_archive: str, source_root: str, files_total: int) -> None:
+ with conn.cursor() as cur:
+ cur.execute(
+ """
+ INSERT INTO a_share_minute_full_adj_import_run
+ (run_id, started_at, status, source_archive, source_root, files_total)
+ VALUES (%s, NOW(), 'running', %s, %s, %s)
+ ON DUPLICATE KEY UPDATE
+ status='running',
+ source_archive=VALUES(source_archive),
+ source_root=VALUES(source_root),
+ files_total=VALUES(files_total),
+ error_message=NULL
+ """,
+ (run_id, source_archive, source_root, files_total),
+ )
+ conn.commit()
+
+
+def finish_run(conn, run_id: str, status: str, error: str | None = None) -> None:
+ with conn.cursor() as cur:
+ cur.execute(
+ """
+ UPDATE a_share_minute_full_adj_import_run r
+ LEFT JOIN (
+ SELECT
+ import_run_id,
+ COUNT(*) AS rows_loaded,
+ MIN(trade_date) AS min_trade_date,
+ MAX(trade_date) AS max_trade_date
+ FROM a_share_minute_price_full_adj
+ WHERE import_run_id=%s
+ GROUP BY import_run_id
+ ) x ON x.import_run_id = r.run_id
+ SET
+ r.finished_at=NOW(),
+ r.status=%s,
+ r.rows_loaded=COALESCE(x.rows_loaded, r.rows_loaded),
+ r.min_trade_date=COALESCE(x.min_trade_date, r.min_trade_date),
+ r.max_trade_date=COALESCE(x.max_trade_date, r.max_trade_date),
+ r.error_message=%s
+ WHERE r.run_id=%s
+ """,
+ (run_id, status, error, run_id),
+ )
+ conn.commit()
+
+
+def load_file(conn, path: Path, root: Path, archive: str, run_id: str) -> int:
+ symbol, market = symbol_for(path)
+ rel = str(path.relative_to(root)).replace("\\", "/")
+ started = datetime.now()
+ t0 = time.perf_counter()
+ with conn.cursor() as cur:
+ cur.execute("DROP TEMPORARY TABLE IF EXISTS tmp_full_adj_minute_csv")
+ cur.execute(
+ """
+ CREATE TEMPORARY TABLE tmp_full_adj_minute_csv (
+ timetag varchar(19) NOT NULL,
+ open_price decimal(14,4) NULL,
+ high_price decimal(14,4) NULL,
+ low_price decimal(14,4) NULL,
+ close_price decimal(14,4) NULL,
+ volume decimal(24,4) NULL,
+ amount decimal(24,4) NULL
+ ) ENGINE=InnoDB
+ """
+ )
+ cur.execute(
+ """
+ LOAD DATA LOCAL INFILE %s
+ INTO TABLE tmp_full_adj_minute_csv
+ CHARACTER SET utf8mb4
+ FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
+ LINES TERMINATED BY '\n'
+ IGNORE 1 LINES
+ (timetag, open_price, high_price, low_price, close_price, volume, amount)
+ """,
+ (str(path),),
+ )
+ loaded_tmp = cur.rowcount
+ cur.execute(
+ """
+ INSERT INTO a_share_minute_price_full_adj
+ (trade_date, trade_time, bar_time, symbol, market,
+ open_price, high_price, low_price, close_price, volume, amount,
+ source_file, source_archive, import_run_id)
+ SELECT
+ DATE(STR_TO_DATE(timetag, '%%Y%%m%%d %%H:%%i:%%s')),
+ TIME(STR_TO_DATE(timetag, '%%Y%%m%%d %%H:%%i:%%s')),
+ STR_TO_DATE(timetag, '%%Y%%m%%d %%H:%%i:%%s'),
+ %s,
+ %s,
+ open_price,
+ high_price,
+ low_price,
+ close_price,
+ volume,
+ amount,
+ %s,
+ %s,
+ %s
+ FROM tmp_full_adj_minute_csv
+ ON DUPLICATE KEY UPDATE
+ open_price=VALUES(open_price),
+ high_price=VALUES(high_price),
+ low_price=VALUES(low_price),
+ close_price=VALUES(close_price),
+ volume=VALUES(volume),
+ amount=VALUES(amount),
+ source_file=VALUES(source_file),
+ source_archive=VALUES(source_archive),
+ import_run_id=VALUES(import_run_id),
+ imported_at=CURRENT_TIMESTAMP
+ """,
+ (symbol, market, rel, archive, run_id),
+ )
+ inserted = cur.rowcount
+ duration_ms = int((time.perf_counter() - t0) * 1000)
+ cur.execute(
+ """
+ INSERT INTO a_share_minute_full_adj_import_file_log
+ (run_id, symbol, market, source_file, file_size, rows_loaded,
+ started_at, finished_at, duration_ms, status)
+ VALUES (%s, %s, %s, %s, %s, %s, %s, NOW(), %s, 'loaded')
+ ON DUPLICATE KEY UPDATE
+ rows_loaded=VALUES(rows_loaded),
+ file_size=VALUES(file_size),
+ finished_at=VALUES(finished_at),
+ duration_ms=VALUES(duration_ms),
+ status='loaded',
+ error_message=NULL
+ """,
+ (run_id, symbol, market, rel, path.stat().st_size, loaded_tmp, started, duration_ms),
+ )
+ cur.execute(
+ """
+ UPDATE a_share_minute_full_adj_import_run
+ SET files_loaded = (
+ SELECT COUNT(*) FROM a_share_minute_full_adj_import_file_log
+ WHERE run_id=%s AND status='loaded'
+ )
+ WHERE run_id=%s
+ """,
+ (run_id, run_id),
+ )
+ conn.commit()
+ return loaded_tmp if loaded_tmp >= 0 else inserted
+
+
+def main() -> int:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--source-root", required=True)
+ parser.add_argument("--source-archive", required=True)
+ parser.add_argument("--run-id")
+ parser.add_argument("--host", default="127.0.0.1")
+ parser.add_argument("--port", type=int, default=3306)
+ parser.add_argument("--user", default="root")
+ parser.add_argument("--password")
+ parser.add_argument("--database", default="tianxia")
+ parser.add_argument("--limit", type=int)
+ parser.add_argument("--skip-loaded", action="store_true")
+ args = parser.parse_args()
+
+ root = Path(args.source_root).resolve()
+ files = discover_files(root)
+ if args.limit:
+ files = files[: args.limit]
+ run_id = args.run_id or "full_adj_minute_" + datetime.now().strftime("%Y%m%d_%H%M%S")
+
+ conn = connect(args)
+ try:
+ ensure_schema(conn)
+ init_run(conn, run_id, args.source_archive, str(root), len(files))
+ loaded_total = 0
+ with conn.cursor() as cur:
+ loaded_files = set()
+ if args.skip_loaded:
+ cur.execute(
+ "SELECT source_file FROM a_share_minute_full_adj_import_file_log WHERE run_id=%s AND status='loaded'",
+ (run_id,),
+ )
+ loaded_files = {row[0] for row in cur.fetchall()}
+ for idx, path in enumerate(files, 1):
+ rel = str(path.relative_to(root)).replace("\\", "/")
+ if rel in loaded_files:
+ continue
+ rows = load_file(conn, path, root, args.source_archive, run_id)
+ loaded_total += rows
+ if idx % 10 == 0 or idx == 1 or idx == len(files):
+ print(f"{datetime.now():%Y-%m-%d %H:%M:%S} loaded {idx}/{len(files)} files; last={rel}; rows={rows}; total_rows_seen={loaded_total}", flush=True)
+ finish_run(conn, run_id, "completed")
+ print(f"completed run_id={run_id} files={len(files)} rows_seen={loaded_total}")
+ return 0
+ except Exception as exc:
+ conn.rollback()
+ try:
+ finish_run(conn, run_id, "failed", str(exc))
+ except Exception:
+ pass
+ print(f"failed run_id={run_id}: {exc}", file=sys.stderr)
+ return 1
+ finally:
+ conn.close()
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/scripts/kline_front_incremental_sync.py b/scripts/kline_front_incremental_sync.py
index 03936ed..0576255 100644
--- a/scripts/kline_front_incremental_sync.py
+++ b/scripts/kline_front_incremental_sync.py
@@ -99,9 +99,10 @@
extra.extend(["--batch", "--raw"])
if skip_column_names:
extra.append("--skip-column-names")
- cmd = mysql_cmd(conn, extra + ["-e", sql])
+ cmd = mysql_cmd(conn, extra)
proc = subprocess.run(
cmd,
+ input=sql,
text=True,
capture_output=True,
env=mysql_env(conn),
diff --git "a/\345\205\250\345\261\200\345\255\230\345\202\250\344\275\223\347\263\273.md" "b/\345\205\250\345\261\200\345\255\230\345\202\250\344\275\223\347\263\273.md"
index c9b758d..5b7251a 100644
--- "a/\345\205\250\345\261\200\345\255\230\345\202\250\344\275\223\347\263\273.md"
+++ "b/\345\205\250\345\261\200\345\255\230\345\202\250\344\275\223\347\263\273.md"
@@ -47,11 +47,14 @@
|---|---|---|
| `a_share_daily_price` | 默认 A 股前复权日线 K 线 | 当前默认日线主表 |
| `a_share_minute_price` | A 股分钟 K 线 | 当前默认分钟线主表,体量最大 |
+| `a_share_minute_price_full_adj` | A 股全复权 1 分钟 K 线 | 新增全复权分钟线公共表;不替代默认分钟线,查询必须带 `trade_date + symbol + trade_time` 边界 |
| `a_share_daily_front_adj_missing_ohlc_20230101_20260508` | 前复权源包中停牌 / 无 OHLC 行审计 | 不能补价进默认 K 线表 |
| `a_share_daily_price_backup_before_front_adj_20260523_1808` | 前复权切换前旧日线备份 | 只用于追溯旧口径 |
| `a_share_daily_price_front_sync` | 前复权日线同步增量 / 影子表 | 用于同步和补数审计,不替代默认主表 |
| `a_share_minute_price_front_sync` | 前复权分钟线同步增量 / 影子表 | 用于同步和补数审计,不替代默认主表 |
| `a_share_kline_front_sync_run` | K 线同步运行记录 | 用于追踪同步批次、行数和状态 |
+| `a_share_minute_full_adj_import_run` | 全复权分钟线导入批次 | 记录 `full_adj_minute_20260614_rar` 等导入批次、文件数、行数和日期范围 |
+| `a_share_minute_full_adj_import_file_log` | 全复权分钟线文件级导入日志 | 记录每个源 CSV 的市场、代码、文件大小、入库行数;0 字节源文件在此表留痕 |
### 4.2 A 股基础维表和元数据表
@@ -172,3 +175,4 @@
## 9. 变更记录
- 2026-06-03:首次建立全局存储体系文档;根据本机 MySQL `tianxia` 的 `information_schema`、数据库索引文档和 stock-data 文件镜像整理当前公共表边界。
+- 2026-06-14:新增全复权 1 分钟 K 线公共表 `a_share_minute_price_full_adj`,来源为 `D:\A股日级行情数据近两年2023csv.rar`;导入批次 `full_adj_minute_20260614_rar`,3161 个 CSV 已处理,有效入库 422,373,172 行,非空日期范围 `2023-03-24` 到 `2026-06-12`;详见 `data/全复权分钟线导入说明.md`。
diff --git "a/\345\205\250\345\261\200\346\225\260\346\215\256\346\240\274\345\274\217.md" "b/\345\205\250\345\261\200\346\225\260\346\215\256\346\240\274\345\274\217.md"
index 8cc9e79..d489818 100644
--- "a/\345\205\250\345\261\200\346\225\260\346\215\256\346\240\274\345\274\217.md"
+++ "b/\345\205\250\345\261\200\346\225\260\346\215\256\346\240\274\345\274\217.md"
@@ -117,6 +117,66 @@
| `sync_run_id` | `varchar(96)` | indexed | 同步运行 ID |
| `synced_at` | `timestamp` | auto update | 同步写入时间 |
+### `a_share_minute_price_full_adj`
+
+A 股全复权 1 分钟 K 线公共表。该表是全复权口径,不替代默认分钟线主表 `a_share_minute_price`,也不与前复权同步影子表混用。
+
+| 字段 | 类型 | 约束 | 含义 |
+|---|---|---|---|
+| `trade_date` | `date` | PK | 交易日 |
+| `trade_time` | `time` | PK | 分钟时间 |
+| `bar_time` | `datetime` | indexed | 完整 bar 时间 |
+| `symbol` | `char(9)` | PK | 股票代码,形如 `600000.SH`、`000001.SZ`、`920000.BJ` |
+| `market` | `varchar(8)` | not null | 市场,`SH` / `SZ` / `BJ` |
+| `open_price` | `decimal(14,4)` | nullable | 全复权开盘价 |
+| `high_price` | `decimal(14,4)` | nullable | 全复权最高价 |
+| `low_price` | `decimal(14,4)` | nullable | 全复权最低价 |
+| `close_price` | `decimal(14,4)` | nullable | 全复权收盘价 |
+| `volume` | `decimal(24,4)` | nullable | 源成交量 |
+| `amount` | `decimal(24,4)` | nullable | 源成交额 |
+| `source_file` | `varchar(255)` | not null | 解压后相对源文件路径 |
+| `source_archive` | `varchar(255)` | not null | 来源压缩包路径 |
+| `import_run_id` | `varchar(96)` | indexed | 导入批次 |
+| `imported_at` | `timestamp` | auto | 入库时间 |
+
+主键:`symbol + trade_date + trade_time`。
+
+查询约束:必须带 `trade_date`、`symbol`,最好同时限制 `trade_time` 范围;全表统计优先读 `a_share_minute_full_adj_import_run` 和 `a_share_minute_full_adj_import_file_log`。
+
+### `a_share_minute_full_adj_import_run`
+
+全复权分钟线导入批次记录表。
+
+| 字段 | 类型 | 约束 | 含义 |
+|---|---|---|---|
+| `run_id` | `varchar(96)` | PK | 导入批次 ID |
+| `started_at` / `finished_at` | `datetime` | indexed / nullable | 开始和结束时间 |
+| `status` | `varchar(32)` | indexed | 运行状态 |
+| `source_archive` | `varchar(512)` | not null | 来源压缩包 |
+| `source_root` | `varchar(512)` | not null | 解压根目录 |
+| `files_total` / `files_loaded` | `int` | not null | 文件总数和已处理文件数 |
+| `rows_loaded` | `bigint` | not null | 有效入库行数 |
+| `min_trade_date` / `max_trade_date` | `date` | nullable | 非空数据日期范围 |
+| `error_message` | `text` | nullable | 失败信息 |
+
+### `a_share_minute_full_adj_import_file_log`
+
+全复权分钟线文件级导入日志。
+
+| 字段 | 类型 | 约束 | 含义 |
+|---|---|---|---|
+| `id` | `bigint` | PK auto_increment | 日志 ID |
+| `run_id` | `varchar(96)` | indexed | 导入批次 |
+| `symbol` | `char(9)` | indexed | 股票代码 |
+| `market` | `varchar(8)` | indexed | 市场 |
+| `source_file` | `varchar(512)` | unique with run | 源文件相对路径 |
+| `file_size` | `bigint` | not null | 源文件大小 |
+| `rows_loaded` | `bigint` | not null | 该文件入库行数;0 表示源文件为空或无有效行 |
+| `started_at` / `finished_at` | `datetime` | not null | 文件处理时间 |
+| `duration_ms` | `bigint` | not null | 文件处理耗时 |
+| `status` | `varchar(32)` | indexed | 文件处理状态 |
+| `error_message` | `text` | nullable | 文件级错误 |
+
### `a_share_kline_front_sync_run`
K 线同步运行记录。
@@ -415,3 +475,4 @@
## 11. 变更记录
- 2026-06-03:首次建立全局数据格式文档;根据本机 MySQL `information_schema`、数据库索引文档和 stock-data 脚本整理公共表字段。
+- 2026-06-14:新增 `a_share_minute_price_full_adj`、`a_share_minute_full_adj_import_run`、`a_share_minute_full_adj_import_file_log` 的字段 schema,登记全复权 1 分钟 K 线公共表和导入审计表。
diff --git "a/\347\256\241\347\220\206\346\211\247\350\241\214\346\227\245\345\277\227.md" "b/\347\256\241\347\220\206\346\211\247\350\241\214\346\227\245\345\277\227.md"
new file mode 100644
index 0000000..a8236a6
--- /dev/null
+++ "b/\347\256\241\347\220\206\346\211\247\350\241\214\346\227\245\345\277\227.md"
@@ -0,0 +1,140 @@
+# 管理执行日志
+
+## 2026-06-16 16:26:30 MGMT-DS-20260616-KLINE-SYNC
+
+关联事项:全局行情数据同步
+
+执行人员:management
+
+动作类型:数据同步
+
+执行目标:使用 ds 同步 2026-06-16 可用的 A 股前复权 K 线数据到本地全局数据库。
+
+执行过程:
+
+1. 读取 ds 技能说明,确认同步脚本 `scripts/kline_front_incremental_sync.py` 可用并通过 `py_compile`。
+2. 查询源端与本地覆盖范围,确认源端日线已有 `2026-06-16`,源端分钟线覆盖表最新为 `2026-06-12`,`2026-06-16` 分钟线覆盖行数为 `0`。
+3. 执行日线同步 run_id=`ds_daily_sync_20260616_162459`,从 `2026-06-11` 同步到 `2026-06-16`。
+4. 同步后校验本地主表 `a_share_daily_price` 在 `2026-06-16` 有 `5513` 行;镜像表本次 run 写入 `22044` 行。
+
+使用命令或 skill:`ds`;`python scripts/kline_front_incremental_sync.py --run-id ds_daily_sync_20260616_162459 --periods 1d --append-to-main`
+
+关键输出:
+
+- 日线源行数:`22044`
+- 日线镜像写入行数:`22044`
+- 日线主表追加行数:`22044`
+- 本地 `2026-06-16` 日线主表行数:`5513`
+- 源端 `2026-06-16` 分钟线覆盖行数:`0`
+- 源端分钟线覆盖表最新日期:`2026-06-12`
+
+自检结果:日线同步完成并通过本地行数校验;分钟线因源端尚无 `2026-06-16` 覆盖数据,本次未同步。
+
+异常 / 偏离:源端分钟线未提供 `2026-06-16` 数据,不触发外部 HTTP 补数任务,不写外部数据库。
+
+当前状态:部分完成
+
+## 2026-06-19 16:25:00 MGMT-DS-20260619-KLINE-SYNC
+
+关联事项:全局行情数据同步
+
+执行人员:management
+
+动作类型:数据同步 / 脚本修复
+
+执行目标:使用 ds 同步截至 2026-06-19 源端可用的 A 股前复权日线与分钟线数据到本地全局数据库。
+
+执行过程:
+
+1. 读取 ds 技能说明,确认 `scripts/kline_front_incremental_sync.py` 可用并通过 `py_compile`。
+2. 查询覆盖范围:源端日线最新为 `2026-06-18`,源端 `2026-06-19` 日线行数为 `0`;源端分钟线覆盖表最新为 `2026-06-17`,`2026-06-19` 分钟线覆盖行数为 `0`。
+3. 执行日线同步 run_id=`ds_daily_sync_20260619_155322`,从 `2026-06-17` 同步到 `2026-06-18`。
+4. 分钟线先执行 `2026-04-21`,数据已落镜像表和主表各 `1324777` 行;收尾写 run log 时触发 Windows 命令行长度限制。
+5. 修复 `scripts/kline_front_incremental_sync.py` 的 MySQL 调用方式:长 SQL 改为 stdin 输入,避免 `-e <large sql>` 触发命令行长度限制。
+6. 补齐 `2026-04-21` run_id=`ds_minute_sync_20260421_155345` 的状态为 `SUCCESS`。
+7. 使用优化参数完成 `2026-04-22` 分钟线同步,run_id=`ds_minute_sync_20260422_161255`,写入和追加 `1324777` 行。
+8. 新增并启动后台分日补齐脚本 `scripts/ds_minute_backfill.ps1`,从 `2026-04-23` 到 `2026-06-17` 按交易日继续同步,日志目录为 `data/result/stat/ds_minute_backfill_20260619_r2`。
+
+使用命令或 skill:`ds`;`python scripts/kline_front_incremental_sync.py --periods 1d --append-to-main`;`python scripts/kline_front_incremental_sync.py --periods 1m --minute-max-minutes-per-batch 120 --minute-symbols-per-batch 200 --append-to-main`;`scripts/ds_minute_backfill.ps1`
+
+关键输出:
+
+- 日线 run_id:`ds_daily_sync_20260619_155322`
+- 日线同步范围:`2026-06-17` 至 `2026-06-18`
+- 日线源行数 / 镜像写入 / 主表追加:`11016 / 11016 / 11016`
+- 分钟线已完成日期:`2026-04-21`、`2026-04-22`
+- 分钟线后台待补日期数:`37`
+- 分钟线后台 PID:`51640`
+- 分钟线后台日志目录:`data/result/stat/ds_minute_backfill_20260619_r2`
+
+自检结果:日线已同步到源端最新;分钟线因缺口约 `51690549` 行,已转入后台分日任务。源端尚无 `2026-06-19` 日线和分钟线数据。
+
+异常 / 偏离:`2026-04-21` 分钟线 run log 首次收尾因 Windows 命令行长度限制失败;已修复脚本并手工恢复该 run 的成功状态。未写外部数据库,未触发外部 HTTP 补数。
+
+当前状态:部分完成,分钟线后台同步中
+
+## 2026-06-23 04:10:00 MGMT-DS-20260623-KLINE-SYNC
+
+关联事项:全局行情数据同步
+
+执行人员:management
+
+动作类型:数据同步
+
+执行目标:使用 ds 同步截至 2026-06-23 源端可用的 A 股前复权 K 线数据到本地全局数据库。
+
+执行过程:
+
+1. 读取 ds 技能说明,确认 `scripts/kline_front_incremental_sync.py` 可用并通过 `py_compile`。
+2. 查询覆盖范围:源端日线最新为 `2026-06-22`,源端 `2026-06-23` 日线行数为 `0`;源端分钟线覆盖表最新为 `2026-06-17`,`2026-06-17` 之后至 `2026-06-23` 覆盖行数为 `0`。
+3. 执行日线同步 run_id=`ds_daily_sync_20260623_040911`,从 `2026-06-19` 同步到 `2026-06-22`。
+4. 同步后校验本地主表 `a_share_daily_price` 在 `2026-06-22` 有 `5510` 行,本地主表最大日线日期为 `2026-06-22`。
+
+使用命令或 skill:`ds`;`python scripts/kline_front_incremental_sync.py --run-id ds_daily_sync_20260623_040911 --periods 1d --append-to-main`
+
+关键输出:
+
+- 日线同步范围:`2026-06-19` 至 `2026-06-22`
+- 日线源行数 / 镜像写入 / 主表追加:`5510 / 5510 / 5510`
+- 本地 `2026-06-22` 日线主表行数:`5510`
+- 源端分钟线覆盖表最新日期:`2026-06-17`
+- 源端 `2026-06-17` 之后至 `2026-06-23` 分钟线覆盖行数:`0`
+
+自检结果:日线已同步到源端最新;分钟线源端无新增数据,本次未执行分钟线写入。
+
+异常 / 偏离:源端尚无 `2026-06-23` 日线数据,也无 `2026-06-17` 之后的分钟线覆盖数据。未写外部数据库,未触发外部 HTTP 补数。
+
+当前状态:完成源端可用范围同步
+
+## 2026-06-23 20:46:00 MGMT-DS-20260623-KLINE-SYNC-2
+
+关联事项:全局行情数据同步
+
+执行人员:management
+
+动作类型:数据同步
+
+执行目标:再次使用 ds 检查并同步 2026-06-23 当日源端新增的 A 股前复权 K 线数据。
+
+执行过程:
+
+1. 读取 ds 技能说明,确认 `scripts/kline_front_incremental_sync.py` 可用并通过 `py_compile`。
+2. 查询覆盖范围:源端日线最新已更新为 `2026-06-23`,源端 `2026-06-23` 日线行数为 `5513`;源端分钟线覆盖表最新仍为 `2026-06-17`,`2026-06-17` 之后至 `2026-06-23` 覆盖行数为 `0`。
+3. 执行日线同步 run_id=`ds_daily_sync_20260623_204520`,同步 `2026-06-23`。
+4. 同步后校验本地主表 `a_share_daily_price` 在 `2026-06-23` 有 `5513` 行,本地主表最大日线日期为 `2026-06-23`。
+
+使用命令或 skill:`ds`;`python scripts/kline_front_incremental_sync.py --run-id ds_daily_sync_20260623_204520 --periods 1d --append-to-main`
+
+关键输出:
+
+- 日线同步范围:`2026-06-23` 至 `2026-06-23`
+- 日线源行数 / 镜像写入 / 主表追加:`5513 / 5513 / 5513`
+- 本地 `2026-06-23` 日线主表行数:`5513`
+- 源端分钟线覆盖表最新日期:`2026-06-17`
+- 源端 `2026-06-17` 之后至 `2026-06-23` 分钟线覆盖行数:`0`
+
+自检结果:日线已同步到源端最新;分钟线源端无新增数据,本次未执行分钟线写入。
+
+异常 / 偏离:未写外部数据库,未触发外部 HTTP 补数。
+
+当前状态:完成源端可用范围同步
--
Gitblit v1.9.3