#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;