如何安全地将 Hangfire 重置为干净状态?

How can I safely reset Hangfire to a clean state?

我有一台安装了 Hangfire 的服务器。我已经有一段时间没有检查过了,似乎有一项经常性的工作出了问题。它停止工作,然后重试堆积起来,导致看起来完全锁定。

我想清除我的数据库并重新开始。我可以只删除所有表中的数据,还是应该删除表并让 Hangfire 为我重新创建它们?我这样做有什么风险吗?

Hangfire.State 使用 space 的整个 Azure Basic 数据库 2GB。

我最终删除了表,起初查询根本不起作用,它一直在继续,什么也没发生。然后我使用 TRUNCATE TABLE [HangFire].[State] 之后一切都像魅力一样。这是我用于 Hangfire 1.5.6UseSqlServerStorage:

的脚本
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

我看到了一个非常有趣的解决方案here

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'

这基本上会截断所有 table 并重置作业的播种 table(重置作业 ID)

我认为还值得一提的是,在 运行 任何脚本

之前停止您的应用程序并确保工作进程已在您的服务器上清理是一种明智的做法

对于 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;

您可以通过截断所有 hangfire table 来清除所有 hangfire 作业并重置作业的种子设定 table。 (重置作业 ID)

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 Database Cleanup

上找到了这个解决方案

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;