@@ -40,7 +40,8 @@ private void DoShardTable(Object state)
40
40
41
41
// 保留数据的起点
42
42
var today = DateTime . Today ;
43
- var endday = today . AddDays ( - _setting . DataRetention ) ;
43
+ var days = _setting . DataRetention ;
44
+ var endday = today . AddDays ( - days ) ;
44
45
45
46
XTrace . WriteLine ( "检查数据分表,保留数据起始日期:{0:yyyy-MM-dd}" , endday ) ;
46
47
@@ -49,107 +50,106 @@ private void DoShardTable(Object state)
49
50
{
50
51
// 取所有表,清空缓存
51
52
var dal = TraceData . Meta . Session . Dal ;
52
- var dal2 = AppTracer . Meta . Session . Dal ;
53
53
54
54
dal . Tables = null ;
55
55
var tables = dal . Tables ;
56
56
var tnames = tables . Select ( e => e . TableName ) . ToArray ( ) ;
57
57
58
- for ( var dt = today . AddYears ( - 10 ) ; dt < endday ; dt = dt . AddDays ( 1 ) )
58
+ // 检查表结构
59
+ var ts = new List < IDataTable > ( ) ;
60
+ for ( var i = 0 ; i < 31 ; i ++ )
59
61
{
60
- var name = $ "SampleData_ { dt : yyyyMMdd } " ;
61
- if ( name . EqualIgnoreCase ( tnames ) )
62
+ var date = today . AddDays ( 1 - i ) ;
63
+
62
64
{
63
- try
64
- {
65
- dal . Execute ( $ "Drop Table { name } ") ;
66
- }
67
- catch ( Exception ex )
68
- {
69
- XTrace . WriteException ( ex ) ;
70
- }
65
+ var table = TraceData . Meta . Table . DataTable . Clone ( ) as IDataTable ;
66
+ table . TableName = $ "TraceData_{ date : dd} ";
67
+ ts . Add ( table ) ;
71
68
}
72
-
73
- name = $ "TraceData_{ dt : yyyyMMdd} ";
74
- if ( name . EqualIgnoreCase ( tnames ) )
75
69
{
76
- try
77
- {
78
- dal . Execute ( $ "Drop Table { name } ") ;
79
- }
80
- catch ( Exception ex )
81
- {
82
- XTrace . WriteException ( ex ) ;
83
- }
70
+ var table = SampleData . Meta . Table . DataTable . Clone ( ) as IDataTable ;
71
+ table . TableName = $ "SampleData_{ date : dd} ";
72
+ ts . Add ( table ) ;
84
73
}
85
74
}
86
75
87
- // 数据迁移后,原库数据表需要清理。需要重新获取表名列表,因为Stardust/StardustData可能指向同一个数据库
88
- dal2 . Tables = null ;
89
- var tnames2 = dal2 . Tables . Select ( e => e . TableName ) . ToArray ( ) ;
90
- for ( var dt = today . AddYears ( - 10 ) ; dt < endday ; dt = dt . AddDays ( 1 ) )
76
+ if ( ts . Count > 0 )
91
77
{
92
- var name = $ "SampleData_{ dt : yyyyMMdd} ";
93
- if ( name . EqualIgnoreCase ( tnames2 ) )
94
- {
95
- try
96
- {
97
- dal2 . Execute ( $ "Drop Table { name } ") ;
98
- }
99
- catch { }
100
- }
78
+ XTrace . WriteLine ( "检查循环天表[{0}]:{1}" , ts . Count , ts . Join ( "," , e => e . TableName ) ) ;
79
+
80
+ //dal.SetTables(ts.ToArray());
81
+ dal . Db . CreateMetaData ( ) . SetTables ( Migration . On , ts . ToArray ( ) ) ;
101
82
102
- name = $ "TraceData_ { dt : yyyyMMdd } " ;
103
- if ( name . EqualIgnoreCase ( tnames2 ) )
83
+ // 首次建表时,设置为压缩表
84
+ if ( dal . DbType == DatabaseType . MySql )
104
85
{
105
- try
86
+ foreach ( var dt in ts )
106
87
{
107
- dal2 . Execute ( $ "Drop Table { name } ") ;
88
+ dal . Execute ( $ "Alter Table { dt . TableName } ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4 ") ;
108
89
}
109
- catch { }
110
90
}
111
91
}
112
92
113
- // 新建今天明天的表
114
- var ts = new List < IDataTable > ( ) ;
115
- {
116
- var table = TraceData . Meta . Table . DataTable . Clone ( ) as IDataTable ;
117
- table . TableName = $ "TraceData_{ today : yyyyMMdd} ";
118
- ts . Add ( table ) ;
119
- }
120
- {
121
- var table = TraceData . Meta . Table . DataTable . Clone ( ) as IDataTable ;
122
- table . TableName = $ "TraceData_{ today . AddDays ( 1 ) : yyyyMMdd} ";
123
- ts . Add ( table ) ;
124
- }
125
- {
126
- var table = SampleData . Meta . Table . DataTable . Clone ( ) as IDataTable ;
127
- table . TableName = $ "SampleData_{ today : yyyyMMdd} ";
128
- ts . Add ( table ) ;
129
- }
93
+
94
+ // 如果保留时间超过了31天,则使用删除功能清理历史数据,否则使用truncate
95
+ if ( days > 31 )
130
96
{
131
- var table = SampleData . Meta . Table . DataTable . Clone ( ) as IDataTable ;
132
- table . TableName = $ "SampleData_{ today . AddDays ( 1 ) : yyyyMMdd} ";
133
- ts . Add ( table ) ;
97
+ // 31张表里面,每张表都删除指定时间之前的数据
98
+ for ( var i = 0 ; i < 31 ; i ++ )
99
+ {
100
+ TraceData . DeleteBefore ( endday ) ;
101
+ SampleData . DeleteBefore ( endday ) ;
102
+ }
134
103
}
135
-
136
- if ( ts . Count > 0 )
104
+ else
137
105
{
138
- XTrace . WriteLine ( "创建或更新数据表[{0}]:{1}" , ts . Count , ts . Join ( "," , e => e . TableName ) ) ;
106
+ using var showSql = dal . Session . SetShowSql ( true ) ;
139
107
140
- //dal.SetTables(ts.ToArray());
141
- dal . Db . CreateMetaData ( ) . SetTables ( Migration . On , ts . ToArray ( ) ) ;
142
-
143
- // 首次建表时,设置为压缩表
144
- if ( dal . DbType == DatabaseType . MySql )
108
+ // 遍历31张表,只要大于结束时间则安全,否则清空
109
+ for ( var i = 0 ; i < 31 ; i ++ )
145
110
{
146
- foreach ( var dt in ts )
111
+ var dt = today . AddDays ( - i ) ;
112
+ if ( dt >= endday ) continue ;
113
+
114
+ var name = $ "TraceData_{ dt : dd} ";
115
+ if ( name . EqualIgnoreCase ( tnames ) )
116
+ {
117
+ try
118
+ {
119
+ if ( dal . DbType == DatabaseType . SQLite )
120
+ TraceData . DeleteBefore ( endday ) ;
121
+ else
122
+ dal . Execute ( $ "Truncate Table { name } ") ;
123
+ //dal.Session.Truncate(name);
124
+ }
125
+ catch ( Exception ex )
126
+ {
127
+ XTrace . WriteException ( ex ) ;
128
+ }
129
+ }
130
+ name = $ "SampleData_{ dt : dd} ";
131
+ if ( name . EqualIgnoreCase ( tnames ) )
147
132
{
148
- if ( ! dt . TableName . EqualIgnoreCase ( tnames ) )
149
- dal . Execute ( $ "Alter Table { dt . TableName } ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4") ;
133
+ try
134
+ {
135
+ if ( dal . DbType == DatabaseType . SQLite )
136
+ SampleData . DeleteBefore ( endday ) ;
137
+ else
138
+ dal . Execute ( $ "Truncate Table { name } ") ;
139
+ //dal.Session.Truncate(name);
140
+ }
141
+ catch ( Exception ex )
142
+ {
143
+ XTrace . WriteException ( ex ) ;
144
+ }
150
145
}
151
146
}
152
147
}
148
+
149
+ // 数据迁移后,原库数据表需要清理。需要重新获取表名列表,因为Stardust/StardustData可能指向同一个数据库
150
+ DropOldTable ( dal ) ;
151
+ var dal2 = AppTracer . Meta . Session . Dal ;
152
+ DropOldTable ( dal2 ) ;
153
153
}
154
154
catch ( Exception ex )
155
155
{
@@ -159,4 +159,104 @@ private void DoShardTable(Object state)
159
159
160
160
XTrace . WriteLine ( "检查数据表完成" ) ;
161
161
}
162
+
163
+ static void DropOldTable ( DAL dal )
164
+ {
165
+ using var showSql = dal . Session . SetShowSql ( true ) ;
166
+
167
+ dal . Tables = null ;
168
+ var tnames2 = dal . Tables . Select ( e => e . TableName ) . ToArray ( ) ;
169
+ var today = DateTime . Today ;
170
+ for ( var dt = today . AddYears ( - 10 ) ; dt <= today ; dt = dt . AddDays ( 1 ) )
171
+ {
172
+ var name = $ "SampleData_{ dt : yyyyMMdd} ";
173
+ if ( name . EqualIgnoreCase ( tnames2 ) )
174
+ {
175
+ try
176
+ {
177
+ dal . Execute ( $ "Drop Table { name } ") ;
178
+ }
179
+ catch { }
180
+ }
181
+
182
+ name = $ "TraceData_{ dt : yyyyMMdd} ";
183
+ if ( name . EqualIgnoreCase ( tnames2 ) )
184
+ {
185
+ try
186
+ {
187
+ dal . Execute ( $ "Drop Table { name } ") ;
188
+ }
189
+ catch { }
190
+ }
191
+ }
192
+ }
193
+
194
+ /// <summary>修正自动分表。20250103启用新的循环天表</summary>
195
+ public static void FixShardTable ( )
196
+ {
197
+ var dal = TraceData . Meta . Session . Dal ;
198
+ var tables = dal . Tables ;
199
+ if ( tables == null ) return ;
200
+
201
+ using var showSql = dal . Session . SetShowSql ( true ) ;
202
+
203
+ // 从明天起倒推31天,保证31张表,如果旧表则重命名
204
+ var today = DateTime . Today ;
205
+
206
+ // 新建缺失表
207
+ //var ts = new List<IDataTable>();
208
+ for ( var i = 0 ; i < 31 ; i ++ )
209
+ {
210
+ var date = today . AddDays ( 1 - i ) ;
211
+
212
+ var newName = $ "TraceData_{ date : dd} ";
213
+ var table = tables . FirstOrDefault ( e => e . TableName . EqualIgnoreCase ( newName ) ) ;
214
+ if ( table == null )
215
+ {
216
+ var oldName = $ "TraceData_{ date : yyyyMMdd} ";
217
+ table = tables . FirstOrDefault ( e => e . TableName . EqualIgnoreCase ( oldName ) ) ;
218
+ if ( table != null )
219
+ dal . Execute ( $ "Alter Table { table . TableName } Rename To { newName } ") ;
220
+ //else
221
+ //{
222
+ // table = TraceData.Meta.Table.DataTable.Clone() as IDataTable;
223
+ // table.TableName = newName;
224
+ // ts.Add(table);
225
+ //}
226
+ }
227
+
228
+ newName = $ "SampleData_{ date : dd} ";
229
+ table = tables . FirstOrDefault ( e => e . TableName . EqualIgnoreCase ( newName ) ) ;
230
+ if ( table == null )
231
+ {
232
+ var oldName = $ "SampleData_{ date : yyyyMMdd} ";
233
+ table = tables . FirstOrDefault ( e => e . TableName . EqualIgnoreCase ( oldName ) ) ;
234
+ if ( table != null )
235
+ dal . Execute ( $ "Alter Table { table . TableName } Rename To { newName } ") ;
236
+ //else
237
+ //{
238
+ // table = SampleData.Meta.Table.DataTable.Clone() as IDataTable;
239
+ // table.TableName = newName;
240
+ // ts.Add(table);
241
+ //}
242
+ }
243
+ }
244
+
245
+ //if (ts.Count > 0)
246
+ //{
247
+ // XTrace.WriteLine("迁移到循环天表[{0}]:{1}", ts.Count, ts.Join(",", e => e.TableName));
248
+
249
+ // //dal.SetTables(ts.ToArray());
250
+ // dal.Db.CreateMetaData().SetTables(Migration.On, ts.ToArray());
251
+
252
+ // // 首次建表时,设置为压缩表
253
+ // if (dal.DbType == DatabaseType.MySql)
254
+ // {
255
+ // foreach (var dt in ts)
256
+ // {
257
+ // dal.Execute($"Alter Table {dt.TableName} ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4");
258
+ // }
259
+ // }
260
+ //}
261
+ }
162
262
}
0 commit comments