diff --git a/数据库/DeepSeaDeleteSchedule.xml b/数据库/DeepSeaDeleteSchedule.xml new file mode 100644 index 0000000..bd48aba Binary files /dev/null and b/数据库/DeepSeaDeleteSchedule.xml differ 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