Как я могу очистить базу данных Hangfire SQL, сохраняя выполнение реальных заданий
Я использую Hangfire уже более года, с консолью Hangfire, и в некоторых таблицах, похоже, есть старая информация из просроченных заданий.
Я создал несколько скриптов для очистки таблицы Set, но это не кажется правильным, я имею в виду, что там были миллионы записей.
declare @total int = 0
declare @count int = 1
while(@count>0)
begin
delete from [HangFire].[Set] where [key] in (
SELECT top 10000 [key]
FROM [HangFire].[Set]
left join hangfire.job on job.Id = SUBSTRING([Key], 19, LEN([Key]) - 19)
WHERE [Key] LIKE 'console:%'
and job.id is null
)
set @count = @@ROWCOUNT
set @total = @total + @count
print @total
end
И таблица Hash тоже имеет миллионы записей.
Я пропустил какую-то настройку в Hangfire, чтобы удалить все эти записи после успешного выполнения задания?
это размер моей базы данных, почти 2 ГБ для 3 тыс. заданий
1 ответ
По состоянию на конец апреля 2023 года Hangfire представляет новуюSqlServerStorageOptions
опция называется. ЭтоTimeSpan
который используется для поиска и удаления старых записей вState
стол.
Запрос выглядит следующим образом:
$@"
set deadlock_priority low;
set transaction isolation level read committed;
set xact_abort on;
set lock_timeout 1000;
;with cte as (
select s.[JobId], s.[Id]
from [{schemaName}].[State] s with (forceseek)
where s.[CreatedAt] < dateadd(minute, @expireMin, @now)
and exists (
select * from [{schemaName}].[Job] j with (forceseek)
where j.[Id] = s.[JobId] and j.[StateId] != s.[Id]))
delete top(@count) from cte option (maxdop 1);";
Где@expireMin
определяется как(long)_stateExpirationTimeout.Negate().TotalMinutes
, и_stateExpirationTimeout
устанавливается изInactiveStateExpirationTimeout
Вы можете установить этот параметр во время настройки приложения .NET Core следующим образом:
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection", new SqlServerStorageOptions
{
InactiveStateExpirationTimeout = TimeSpan.FromDays(1)
// ... other configuration options
}))