I have a server with Hangfire installed. I haven\'t checked it for a while and it seems one recurring job has gone rogue. It stopped working and then it has stacked up with
For Hangfire Postgresql you can run the following commands. In order for the tables to be rebuilt, you must restart the application
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;
I ended up dropping the tables, at first the query did not work at all, it just kept going and nothing happened. I then used TRUNCATE TABLE [HangFire].[State]
and it all worked like a charm after. Here is the script I used for Hangfire 1.5.6
with 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
I've seen a pretty interesting solution 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'
This basically truncates all the tables and resets the seeding for the Job table (reseting job id's)
I think it's also worth mentioning that it is good and sensible practice to stop your application and make sure the worker processes have cleared up on your server before running any scripts