【发布时间】:2016-10-11 08:41:07
【问题描述】:
我有一台安装了 Hangfire 的服务器。我有一段时间没有检查它了,似乎一个经常性的工作已经流氓了。它停止工作,然后重试累加,导致似乎完全锁定。
我想清除我的数据库并重新开始。我可以从所有表中删除数据还是应该删除表并让 Hangfire 为我重新创建它们?我这样做有什么风险吗?
【问题讨论】:
标签: c# sql-server hangfire
我有一台安装了 Hangfire 的服务器。我有一段时间没有检查它了,似乎一个经常性的工作已经流氓了。它停止工作,然后重试累加,导致似乎完全锁定。
我想清除我的数据库并重新开始。我可以从所有表中删除数据还是应该删除表并让 Hangfire 为我重新创建它们?我这样做有什么风险吗?
【问题讨论】:
标签: c# sql-server hangfire
我最终删除了表,起初查询根本不起作用,它一直在继续,什么也没发生。然后我使用了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
【讨论】:
我看到了一个非常有趣的解决方案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'
这基本上会截断所有表并重置作业表的播种(重置作业 ID)
我认为还值得一提的是,在运行任何脚本之前停止您的应用程序并确保工作进程已在您的服务器上清理干净是一种很好且明智的做法
【讨论】:
您可以通过截断所有 hangfire 表清除所有 hangfire 作业并重置 Job 表的播种。 (重置作业 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找到了这个解决方案
【讨论】:
对于 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;
【讨论】:
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;
【讨论】: