Как я могу очистить базу данных 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стол.

Источник GitHub

Запрос выглядит следующим образом:

      $@"
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
}))
Другие вопросы по тегам