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

Ogg*_*las 8 c# sql-server hangfire

我有一台安装了Hangfire的服务器.我有一段时间没有检查它,似乎一个重复的工作已经流氓.它停止工作,然后它重叠了重试,导致看起来完全锁定.

我想清理我的数据库并重新开始.我可以删除所有表中的数据,还是应该删除表,让Hangfire为我重新创建它们?这样做会冒任何风险吗?

Hangfire.State使用整个Azure Basic数据库2GB的空间. 在此输入图像描述

Ogg*_*las 24

我最后放弃了表格,起初查询根本没有用,它只是继续进行而没有发生任何事情.然后我使用了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
Run Code Online (Sandbox Code Playgroud)

  • 但是不要忘记在删除外键后再次添加外键.顺便说一句,最好更新到最新的[1.6.5](https://www.nuget.org/packages/Hangfire/),自从你的版本同时出现了很多修复版本的Hangfire.Core和Hangfire. SqlServer要不要面对这样的问题. (3认同)

小智 16

我在这里看到了一个非常有趣的解决方案

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'
Run Code Online (Sandbox Code Playgroud)

这基本上会截断所有表并重置 Job 表的种子(重置作业 ID)

我认为还值得一提的是,在运行任何脚本之前停止您的应用程序并确保服务器上的工作进程已清除是一种很好且明智的做法

  • 它会删除所有作业吗?就我而言,设置表没有截断。 (2认同)

小智 9

您可以通过截断所有hangfire 表来清除所有hangfire 作业并重置作业表的种子设定。(重置作业 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'
Run Code Online (Sandbox Code Playgroud)

我在Hangfire Database Cleanup上找到了这个解决方案