From 799fb8ff06b4c5f3789bb0c83e785c0b5d6e51cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?liming=20=E8=94=A1?= Date: Tue, 28 Jul 2026 09:59:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0"=E5=AE=9A=E6=97=B6=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=95=B0=E6=8D=AE=E5=BA=93S1270=E4=B8=80=E5=B9=B4?= =?UTF-8?q?=E4=BB=A5=E4=B8=8A=E6=95=B0=E6=8D=AE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 数据库/DeepSeaDeleteSchedule.xml | Bin 0 -> 3664 bytes 数据库/TaskSchedule.sql | 103 +++++++++++++++++++++++++++++++ 数据库/sqlSchedule.bat | 14 +++++ 数据库/说明.md | 5 ++ 4 files changed, 122 insertions(+) create mode 100644 数据库/DeepSeaDeleteSchedule.xml create mode 100644 数据库/TaskSchedule.sql create mode 100644 数据库/sqlSchedule.bat create mode 100644 数据库/说明.md diff --git a/数据库/DeepSeaDeleteSchedule.xml b/数据库/DeepSeaDeleteSchedule.xml new file mode 100644 index 0000000000000000000000000000000000000000..bd48aba2c61643b0b6bd915ee7562f5b870bd029 GIT binary patch literal 3664 zcmbW4-%cAx6voeWq`rfddth-W|Fm@!0xed7MA$SJMUh36=CyU~J9}X>Tlg2- zDON5)NLimEkug^EUEWWOd`yz{^7~F^#JudZiF}3c7Qb!VCi2L3h~X7E*~N#*}N3F*?aJJ>=!#`e1Ol}cFy{UXM*P=d>Xqt ztYbqKLZr}&^pxKzI+Le(JNEalUq-Fd;a`7#?BRVIpChxA?BhQtFHZh=n2eGO@B3oy z(8d`)c8Q_zvgf>%?Hk^Vw>Pixkf=2$^jt4T(_HfkiFu0ZlE*W-TD`YqO12VsJU}*- z52by*d-y8J%=W0u{gdYGSq7}T+DFuTmkdTOu4O2BtOXAaurjdUoTo$Vh?)2E3{}_a z+SR=7*~~Fc9#^FcPS4*DChe&+Q2Vg8(ui{C%seQ>dt%qd8TBW6EV)lpX zt_~$m%lGoSkFqY)LVD=BPkFzT`$JKaGZ2-TE*c$TRM%Uf#@hE9wcU4znTS2O$#;j@ zSM-1_Mq1rqZj+s>SxIQDzMyx5*>%SjpYhOIJEWiKPsv>AP?$e>gRo= zuK6ael8f}}=%_HC6S|-z%uHE3;eB**d@V{CCoXkCsRkuxuhKCk?8EIo@dMC>ZrO4qdPd{xavK*f6Fr+Q}vwV1*hbL zZZ*28)}w2t5&Ba-;hUcRu^m#mA&=a1K_Vl9#g zF%I}=GNNCLhyGTcbMwe?bo|86EzVcZ&}KTJ9e*}yXA4oM!BCOjI-}bp@p7YOOHa}g?vG_Yot=_{{ hxlyV^$oDEn9+&R~YYXg4D~!tfruja&`oGt){{i`zL>>SD literal 0 HcmV?d00001 diff --git a/数据库/TaskSchedule.sql b/数据库/TaskSchedule.sql new file mode 100644 index 0000000..ff88290 --- /dev/null +++ b/数据库/TaskSchedule.sql @@ -0,0 +1,103 @@ + +/*定期删除数据存储过程*/ +CREATE PROCEDURE sp_DeleteOldData_Batch + @BatchSize INT = 10000, -- 每批删除的行数 + @DelayMs INT = 100 -- 每批之间的延迟(毫秒) +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @TotalDeleted INT; + DECLARE @BatchDeleted INT; + DECLARE @CutoffDate DATETIME; + DECLARE @StartTime DATETIME; + DECLARE @DelayTime VARCHAR(12); + + SET @CutoffDate = DATEADD(YEAR, -1, GETDATE()); + SET @StartTime = GETDATE(); + + PRINT '开始删除一年前的数据,截止时间:' + CONVERT(VARCHAR, @CutoffDate, 120); + + BEGIN TRY + -- ============ 删除 BlankingData ============ + SET @TotalDeleted = 0; + SET @BatchDeleted = 1; + + PRINT '开始删除 BlankingData 表数据...'; + + WHILE @BatchDeleted > 0 + BEGIN + DELETE TOP (@BatchSize) FROM dbo.BlankingData + WHERE OutTime < @CutoffDate; + + SET @BatchDeleted = @@ROWCOUNT; + SET @TotalDeleted = @TotalDeleted + @BatchDeleted; + + -- 每批之间短暂延迟,减少锁争用 + IF @BatchDeleted > 0 AND @DelayMs > 0 + BEGIN + SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3); + WAITFOR DELAY @DelayTime; + END + END + + PRINT 'BlankingData 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。'; + + + -- ============ 删除 FeedingData ============ + SET @TotalDeleted = 0; + SET @BatchDeleted = 1; + + PRINT '开始删除 FeedingData 表数据...'; + + WHILE @BatchDeleted > 0 + BEGIN + DELETE TOP (@BatchSize) FROM dbo.FeedingData + WHERE CreateTime < @CutoffDate; + + SET @BatchDeleted = @@ROWCOUNT; + SET @TotalDeleted = @TotalDeleted + @BatchDeleted; + + IF @BatchDeleted > 0 AND @DelayMs > 0 + BEGIN + SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3); + WAITFOR DELAY @DelayTime; + END + END + + PRINT 'FeedingData 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。'; + + + -- ============ 删除 tb_alarm ============ + SET @TotalDeleted = 0; + SET @BatchDeleted = 1; + + PRINT '开始删除 tb_alarm 表数据...'; + + WHILE @BatchDeleted > 0 + BEGIN + DELETE TOP (@BatchSize) FROM dbo.tb_alarm + WHERE EndTime < @CutoffDate; + + SET @BatchDeleted = @@ROWCOUNT; + SET @TotalDeleted = @TotalDeleted + @BatchDeleted; + + IF @BatchDeleted > 0 AND @DelayMs > 0 + BEGIN + SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3); + WAITFOR DELAY @DelayTime; + END + END + + PRINT 'tb_alarm 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。'; + + PRINT '所有表数据删除完成,总耗时:' + + CAST(DATEDIFF(SECOND, @StartTime, GETDATE()) AS VARCHAR) + ' 秒。'; + + END TRY + BEGIN CATCH + PRINT '数据删除失败:' + ERROR_MESSAGE(); + THROW; + END CATCH +END +GO \ No newline at end of file diff --git a/数据库/sqlSchedule.bat b/数据库/sqlSchedule.bat new file mode 100644 index 0000000..cb64585 --- /dev/null +++ b/数据库/sqlSchedule.bat @@ -0,0 +1,14 @@ +@echo off + +:: 设置日志文件路径 +set LOGFILE=D:\BatLogs\DeleteOldData_%date:~0,4%%date:~5,2%%date:~8,2%.log + +:: 如果 D:\BatLogs 目录不存在,则创建 +if not exist "D:\BatLogs" mkdir "D:\BatLogs" + +sqlcmd -S .\SQLEXPRESS -d S1270 -E -Q "EXEC sp_DeleteOldData_Batch" >> "%LOGFILE%" + +echo. >> "%LOGFILE%" +exit /b %ERRORLEVEL% + +pause \ No newline at end of file diff --git a/数据库/说明.md b/数据库/说明.md new file mode 100644 index 0000000..a279c8d --- /dev/null +++ b/数据库/说明.md @@ -0,0 +1,5 @@ +定时删除数据库S1270一年以上的数据 +1. 根据文件TaskSchedule.sql创建删除数据存储过程 +2. 在D盘创建文件夹MyBat, 存放sqlSchedule.bat +3. 打开windows的任务计划程序,导入DeepSeaDeleteSchedule.xml +4. 运行DeepSeaDeleteSchedule,查看D:\BatLogs中的日志,验证定时删除是否正常 \ No newline at end of file