【问题标题】:How can I safely reset Hangfire to a clean state?如何安全地将 Hangfire 重置为干净状态?
【发布时间】:2016-10-11 08:41:07
【问题描述】:

我有一台安装了 Hangfire 的服务器。我有一段时间没有检查它了,似乎一个经常性的工作已经流氓了。它停止工作,然后重试累加,导致似乎完全锁定。

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

Hangfire.State 使用整个 Azure Basic 数据库 2GB 空间。

【问题讨论】:

    标签: c# sql-server hangfire


    【解决方案1】:

    我最终删除了表,起初查询根本不起作用,它一直在继续,什么也没发生。然后我使用了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
    

    【讨论】:

    • 但是不要忘记删除外键后再次添加它们。顺便说一句,最好更新到最新的1.6.5,因为你的 Hangfire.Core 和 Hangfire.SqlServer 版本已经修复了很多,以免遇到这样的问题。
    【解决方案2】:

    我看到了一个非常有趣的解决方案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)

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

    【讨论】:

    • 它会删除所有作业吗?在我的情况下,Set 表没有截断。
    【解决方案3】:

    您可以通过截断所有 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找到了这个解决方案

    【讨论】:

    • 很好,为我工作,还必须做 TRUNCATE TABLE [HangFire].[hash] TRUNCATE TABLE [HangFire].[set]
    【解决方案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】:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 2016-06-08
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多