Как я могу безопасно сбросить Hangfire в чистое состояние?

#c# #sql-server #hangfire

#c# #sql-сервер #hangfire

Вопрос:

У меня установлен сервер с Hangfire. Я некоторое время не проверял это, и, похоже, одно повторяющееся задание вышло из строя. Он перестал работать, а затем скопился с повторными попытками, что, похоже, привело к полной блокировке.

Я хотел бы очистить свою базу данных и начать все сначала. Могу ли я просто удалить данные из всех таблиц или мне следует удалить таблицы и позволить Hangfire воссоздать их для меня? Рискую ли я чем-нибудь, делая это?

Hangfire.Состояние, использующее всю базовую базу данных Azure объемом 2 ГБ. введите описание изображения здесь

Ответ №1:

В итоге я отбросил таблицы, сначала запрос вообще не работал, он просто продолжал работать, и ничего не произошло. Затем я использовал TRUNCATE TABLE [HangFire].[State] , и после этого все работало как по волшебству. Вот сценарий, который я использовал для Hangfire 1.5.6 UseSqlServerStorage :

 GO
PRINT N'Dropping [HangFire].[FK_HangFire_State_Job]...';


GO
ALTER TABLE [HangFire].[State] DROP CONSTRAINT [FK_HangFire_State_Job];


GO
PRINT N'Dropping [HangFire].[FK_HangFire_JobParameter_Job]...';


GO
ALTER TABLE [HangFire].[JobParameter] DROP CONSTRAINT [FK_HangFire_JobParameter_Job];


GO
PRINT N'Dropping [HangFire].[Schema]...';


GO
DROP TABLE [HangFire].[Schema];


GO
PRINT N'Dropping [HangFire].[Job]...';


GO
DROP TABLE [HangFire].[Job];


GO
PRINT N'Dropping [HangFire].[State]...';


GO
DROP TABLE [HangFire].[State];


GO
PRINT N'Dropping [HangFire].[JobParameter]...';


GO
DROP TABLE [HangFire].[JobParameter];


GO
PRINT N'Dropping [HangFire].[JobQueue]...';


GO
DROP TABLE [HangFire].[JobQueue];


GO
PRINT N'Dropping [HangFire].[Server]...';


GO
DROP TABLE [HangFire].[Server];


GO
PRINT N'Dropping [HangFire].[List]...';


GO
DROP TABLE [HangFire].[List];


GO
PRINT N'Dropping [HangFire].[Set]...';


GO
DROP TABLE [HangFire].[Set];


GO
PRINT N'Dropping [HangFire].[Counter]...';


GO
DROP TABLE [HangFire].[Counter];


GO
PRINT N'Dropping [HangFire].[Hash]...';


GO
DROP TABLE [HangFire].[Hash];


GO
PRINT N'Dropping [HangFire].[AggregatedCounter]...';


GO
DROP TABLE [HangFire].[AggregatedCounter];


GO
PRINT N'Dropping [HangFire]...';


GO
DROP SCHEMA [HangFire];


GO
PRINT N'Update complete.';


GO
  

Комментарии:

1. Но не забудьте снова добавить внешние ключи после их удаления. Кстати, лучше обновиться до последней версии 1.6.5 , с ваших версий было много исправлений для обоих Hangfire. Core и Hangfire.SQLServer, чтобы не сталкиваться с подобными проблемами.

Ответ №2:

Я видел здесь довольно интересное решение

 TRUNCATE TABLE [HangFire].[AggregatedCounter]
TRUNCATE TABLE [HangFire].[Counter]
TRUNCATE TABLE [HangFire].[JobParameter]
TRUNCATE TABLE [HangFire].[JobQueue]
TRUNCATE TABLE [HangFire].[List]
TRUNCATE TABLE [HangFire].[State]
DELETE FROM [HangFire].[Job]
DBCC CHECKIDENT ('[HangFire].[Job]', reseed, 0)
UPDATE [HangFire].[Hash] SET Value = 1 WHERE Field = 'LastJobId'
  

Это в основном усекает все таблицы и сбрасывает начальное значение для таблицы заданий (сброс идентификаторов заданий)

Я думаю, также стоит упомянуть, что хорошей и разумной практикой является остановка вашего приложения и проверка того, что рабочие процессы на вашем сервере очищены, прежде чем запускать какие-либо сценарии

Комментарии:

1. Удаляет ли он все задания? В моем случае таблица Set не усекалась.

Ответ №3:

Вы можете очистить все задания hangfire, обрезав все таблицы hangfire и сбросив начальное значение для таблицы заданий. (Сброс идентификаторов заданий)

 TRUNCATE TABLE [HangFire].[AggregatedCounter]
TRUNCATE TABLE [HangFire].[Counter]
TRUNCATE TABLE [HangFire].[JobParameter]
TRUNCATE TABLE [HangFire].[JobQueue]
TRUNCATE TABLE [HangFire].[List]
TRUNCATE TABLE [HangFire].[State]
DELETE FROM [HangFire].[Job]
DBCC CHECKIDENT ('[HangFire].[Job]', reseed, 0)
UPDATE [HangFire].[Hash] SET Value = 1 WHERE Field = 'LastJobId'
  

Я нашел это решение при очистке базы данных Hangfire

Комментарии:

1. хорошо, сработало для меня, также пришлось выполнить УСЕЧЕНИЕ ТАБЛИЦЫ [HangFire]. [хэш] УСЕЧЕНИЕ ТАБЛИЦЫ [HangFire]. [установить]

2. Можно ли это сделать во время работы серверов приложений или их необходимо остановить?

3. Лучше остановить серверы приложений.

Ответ №4:

Для Hangfire Postgresql вы можете выполнить следующие команды. Для того, чтобы таблицы были перестроены, необходимо перезапустить приложение

 ALTER TABLE hangFire.state DROP CONSTRAINT state_jobid_fkey;

ALTER TABLE hangFire.jobParameter DROP CONSTRAINT jobparameter_jobid_fkey;

DROP TABLE hangFire.Schema;

DROP TABLE hangFire.Job;

DROP TABLE hangFire.State;

DROP TABLE hangFire.jobParameter;

DROP TABLE hangFire.jobQueue;

DROP TABLE hangFire.Server;

DROP TABLE hangFire.list;

DROP TABLE hangFire.set;
DROP TABLE hangFire.lock;

DROP TABLE hangFire.counter;

DROP TABLE hangFire.hash;

DROP SCHEMA hangFire Cascade;
  

Ответ №5:

Поместите это в свой класс Startup.cs перед настройкой Hangfire. Он автоматически очистит все таблицы перед запуском приложения.

             DatabaseEntities db = new DatabaseEntities();   //EntityFrameWork Class

            string sqlCommand = ""  
            "DELETE FROM[HangFire].[AggregatedCounter];"  
            "DELETE FROM[HangFire].[Counter];"  
            "DELETE FROM[HangFire].[JobParameter];"  
            "DELETE FROM[HangFire].[JobQueue];"  
            "DELETE FROM[HangFire].[List];"  
            "DELETE FROM[HangFire].[State];"  
            "DELETE FROM[HangFire].[Job];"  
            "DELETE FROM[HangFire].[Server];"  
            "DELETE FROM[HangFire].[Schema];"  
            "DELETE FROM[HangFire].[Set];"  
            "DELETE FROM[HangFire].[Hash];";

            var rowsDeleted = db.Database.ExecuteSqlCommand(sqlCommand);
  

Комментарии:

1. Черт, это работает на 100%? Таким образом, вы можете легко программно сбросить Hangfire?? Если вы работаете на N серверах приложений, должны ли все серверы приложений сначала быть остановлены?

Ответ №6:

Версия Oracle:

 TRUNCATE TABLE HANGFIRE.HF_AGGREGATED_COUNTER;
TRUNCATE TABLE HANGFIRE.HF_Counter;
TRUNCATE TABLE HANGFIRE.HF_Job_Parameter;
TRUNCATE TABLE HANGFIRE.HF_Job_Queue;
TRUNCATE TABLE HANGFIRE.HF_List;
TRUNCATE TABLE HANGFIRE.HF_JOB_State;
TRUNCATE TABLE HANGFIRE.HF_hash;
TRUNCATE TABLE HangFire.HF_set;
TRUNCATE TABLE HangFire.HF_server;
DELETE FROM HANGFIRE.HF_Job;