AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 217009
Accepted
James Jenkins
James Jenkins
Asked: 2018-09-08 04:50:03 +0800 CST2018-09-08 04:50:03 +0800 CST 2018-09-08 04:50:03 +0800 CST

Como parar o Agendador de Trabalho do SQL Server Agent com T-SQL?

  • 772

Eu tenho um trabalho que inicio manualmente em períodos de tempo coordenados que faz um monte de trabalho pesado ( principalmente restaurando backups e configurando para um servidor diferente )

Há vários trabalhos programados para serem executados com incrementos de minutos a dias. Eu quero "desligar" o agendador para que nada seja executado dentro do cronograma até que meu trabalho manual seja concluído. Percebo que os trabalhos perdidos não serão executados novamente até o próximo horário agendado, depois que o agendador for reiniciado.

  • Primeiro passo: parar o agendador
  • Várias etapas de levantamento pesado: faça o trabalho duro
  • Último passo: iniciar agendador

Encontrei um comando Oracle , mas sou 100% Microsoft SQL Server

Eu sei que se eu desligar o agente SQL, os trabalhos não serão executados, mas não é isso que estou procurando.

Os empregos que existem hoje, não devem ser os mesmos empregos da próxima vez. Desabilitar trabalhos com EXEC dbo.sp_update_job não é uma solução viável.

Informações adicionais: Também pode haver trabalhos em vigor que foram desativados intencionalmente por algum motivo e que desejam ser reativados. Parar o agendador parece ser a melhor escolha.

sql-server sql-server-2014
  • 2 2 respostas
  • 6030 Views

2 respostas

  • Voted
  1. Best Answer
    Shaulinator
    2018-09-08T05:35:10+08:002018-09-08T05:35:10+08:00

    Eu recomendaria começar criando uma tabela de teste que conterá algumas informações para você. A tabela deve ser construída para conter os dados das saídas de código abaixo. Eu recomendo armazenar o Schedule_ID, name, e job_idno mínimo. (Se você quiser trapacear, você pode expandir os asteriscos e selecionar as colunas desejadas, e então adicionar a palavra INTOjunto com o database.schema.table_name_you_want_to_create e ele criará a tabela pela primeira vez para você. Depois disso você pode alterar em uma inserção.)

    SELECT * FROM 
    MSDB.dbo.sysschedules ss
    INNER JOIN msdb.dbo.sysjobschedules jss
       ON jss.schedule_id = ss.schedule_id
    WHERE ss.enabled = 1
    

    Esse código retorna os agendamentos para todos os agendamentos e também executa uma junção interna para limitar os dados retornados apenas aos agendamentos emparelhados com os trabalhos atualmente habilitados.

    Você pode então criar um loop ou cursor ou algo semelhante para percorrer a tabela de preparo e executar o procedimento sp_update_schedule . Isso desabilitará todos os agendamentos habilitados e emparelhados com um trabalho. Quando a manutenção estiver concluída, você poderá executar o loop mais uma vez, mas desta vez habilitando os agendamentos que você desativou anteriormente.

    Se você quiser um exemplo de loop, pode ver um exemplo que criei no passado sobre o estouro de pilha .

    Voltei e usei as sugestões para criar uma solução de código completa. Por favor, veja abaixo, existem dois scripts no total. O primeiro desabilitará seus trabalhos e o segundo os reabilitará. TESTE EM UM AMBIENTE DE TESTE ANTES DE COLOCAR EM PRODUÇÃO. Fonte para completude .

    Roteiro um:

    USE MSDB;
    
    /*************************************************************
     Checking for history table. Creating it if it doesn't exist. 
    *************************************************************/
    
    IF OBJECT_ID('dbo.JobsEnabledTracker', 'U') IS NULL
    BEGIN
    CREATE TABLE [dbo].[JobsEnabledTracker](
    [Id] [INT] IDENTITY(1, 1) NOT NULL, 
    [job_id]      [UNIQUEIDENTIFIER] NULL, 
    [schedule_id] [BIGINT] NULL, 
    [enabled]     [BIT] NULL);
    END;
    IF EXISTS
    (
        SELECT 
               1
        FROM [dbo].[JobsEnabledTracker]
        WHERE [enabled] = 1
    )
       OR
    (
        SELECT 
               COUNT(*)
        FROM [dbo].[JobsEnabledTracker]
    ) = 0
        BEGIN
            PRINT 'There are jobs enabled or there are no jobs yet populated in the history table.';
    
    /***********************
     Clear out history table
    ***********************/
    
            PRINT 'Truncating history table: dbo.JobsEnabledTracker';
            TRUNCATE TABLE [dbo].[JobsEnabledTracker];
    
            PRINT 'Inserting records into history table: dbo.JobsEnabledTracker';
    
    /******************************
     Add in values to history table
    ******************************/
    
            INSERT INTO [dbo].[JobsEnabledTracker]
            (
                   [job_id], 
                   [schedule_id], 
                   [enabled]
            )
            SELECT 
                   [jss].[job_id], 
                   [jss].[schedule_id], 
                   1 AS 'enabled'
            FROM [msdb].[dbo].[sysschedules] AS [ss]
                 INNER JOIN [msdb].[dbo].[sysjobschedules] AS [jss] ON [jss].[schedule_id] = [ss].[schedule_id]
            WHERE [ss].[enabled] = 1;
    
    /**********************************************************************************
     Table variable to hold schedules and jobs enabled. This is important for the loop.
    **********************************************************************************/
    
            DECLARE @JobsEnabled TABLE
            ([Id]          INT
             PRIMARY KEY IDENTITY(1, 1), 
             [job_id]      UNIQUEIDENTIFIER, 
             [schedule_id] BIGINT, 
             [enabled]     BIT
            );
    
    /*****************************************
     Insert schedules that we need to disable.
    *****************************************/
    
            INSERT INTO @JobsEnabled
            (
                   [job_id], 
                   [schedule_id], 
                   [enabled]
            )
            SELECT 
                   [job_id], 
                   [schedule_id], 
                   [enabled]
            FROM [dbo].[JobsEnabledTracker];
    
    /********************************
     Holds the job id and schedule id
    ********************************/
    
            DECLARE @jobid UNIQUEIDENTIFIER;
            DECLARE @scheduleid BIGINT;
    
    /***********************************
     Holds the ID of the row in the loop
    ***********************************/
    
            DECLARE @ID INT= 0;
    
    /**********************
     Check if records exist
    **********************/
    
            IF EXISTS
            (
                SELECT 
                       [Id]
                FROM @JobsEnabled
            )
                BEGIN
                    PRINT 'Loop mode, jobs found enabled.';
    
    /**********
     Begin loop
    **********/
    
                    WHILE(1 = 1)
                        BEGIN
    
    /***************************************
     Grab jobid, scheduleid, and id of rows.
    ***************************************/
    
                            SELECT 
                                   @jobid =
                            (
                                SELECT TOP 1 
                                       [job_id]
                                FROM @JobsEnabled
                                ORDER BY 
                                         [job_id]
                            );
                            SELECT 
                                   @scheduleid =
                            (
                                SELECT TOP 1 
                                       [schedule_id]
                                FROM @JobsEnabled
                                ORDER BY 
                                         [job_id]
                            );
                            SELECT 
                                   @ID =
                            (
                                SELECT TOP 1 
                                       [Id]
                                FROM @JobsEnabled
                                ORDER BY 
                                         [job_id]
                            );
    
    /************************************
     Re-enable schedule associated to job
    ************************************/
    
                            PRINT 'Disabling schedule_id: '+CAST(@scheduleid AS VARCHAR(255))+' paired to job_id: '+CAST(@jobid AS VARCHAR(255));
                            EXEC [sp_update_schedule] 
                                 @schedule_id = @scheduleid, 
                                 @enabled = 0;
    
    /*********************
     Removes row from loop
    *********************/
    
                            DELETE FROM @JobsEnabled
                            WHERE 
                                  [Id] = @ID;
    
                            UPDATE [dbo].[JobsEnabledTracker]
                              SET 
                                  [enabled] = 0
                            WHERE 
                                  [job_id] = @jobid
                                  AND [schedule_id] = @scheduleid;
    
    /****************************
     No more rows, stops deleting
    ****************************/
    
                            IF
                            (
                                SELECT 
                                       COUNT(*)
                                FROM @JobsEnabled
                            ) <= 0
                                BEGIN
                                    BREAK
                                END;
    
    /********
     End Loop
    ********/
                        END;
                    PRINT 'Exiting loop, disabling schedules paired to jobs complete.';
    
    /**********
     End elseif
    **********/
                END;
                ELSE
                BEGIN
                    PRINT 'All done';
                END;
        END;
        ELSE
        BEGIN
            PRINT 'YOU HAVE JOBS STILL DISABLED, EXITING SCRIPT. PLEASE RUN SCRIPT TWO FIRST.';
        END;
    

    Roteiro dois

    USE MSDB;
    
    /*******************************************************************************
     Check for history table. This physical table tells us what jobs we are going to
     enable the scheduler for.
    *******************************************************************************/
    
    IF OBJECT_ID('dbo.JobsEnabledTracker', 'U') IS NOT NULL
    BEGIN
        IF EXISTS
        (
            SELECT 1
            FROM [dbo].[JobsEnabledTracker]
            WHERE [enabled] = 0
        )
        BEGIN
            PRINT 'Jobs disabled in history table: dbo.JobsEnabledTracker found.';
    
    /**********************************************************************************
     Table variable to hold schedules and jobs enabled. This is important for the loop.
    **********************************************************************************/
    
            DECLARE @JobsEnabled TABLE
            ( 
            [Id] int PRIMARY KEY IDENTITY(1, 1)
            , [job_id] uniqueidentifier
            , [schedule_id] bigint
            , [enabled] bit
            );
    
    /*******************************************************************************
     Insert schedules that we had disabled that we need to go back in and re-enable.
    *******************************************************************************/
    
            INSERT INTO @JobsEnabled( [job_id], [schedule_id], [enabled] )
                   SELECT [job_id], [schedule_id], [enabled]
                   FROM [dbo].[JobsEnabledTracker];
    
    /********************************
     Holds the job id and schedule id
    ********************************/
    
            DECLARE @jobid uniqueidentifier;
            DECLARE @scheduleid bigint;
    
    /***********************************
     Holds the ID of the row in the loop
    ***********************************/
    
            DECLARE @ID int= 0;
    
    /**********************
     Check if records exist
    **********************/
    
            IF EXISTS
            (
                SELECT [Id]
                FROM @JobsEnabled
            )
            BEGIN
                PRINT 'Loop mode, jobs found disabled.';
    
    /**********
     Begin loop
    **********/
    
                WHILE 1 = 1
                BEGIN
    
    /***************************************
     Grab jobid, scheduleid, and id of rows.
    ***************************************/
    
                    SELECT @jobid =
                    (
                        SELECT TOP 1 [job_id]
                        FROM @JobsEnabled
                        ORDER BY [job_id]
                    );
                    SELECT @scheduleid =
                    (
                        SELECT TOP 1 [schedule_id]
                        FROM @JobsEnabled
                        ORDER BY [job_id]
                    );
                    SELECT @ID =
                    (
                        SELECT TOP 1 [Id]
                        FROM @JobsEnabled
                        ORDER BY [job_id]
                    );
    
    /***************************************
     Re-enable schedule associated to job           
    ***************************************/
    
                    PRINT 'Enabling schedule_id: '+CAST(@scheduleid AS varchar(255))+' paired to job_id: '+CAST(@jobid AS varchar(255));
                    EXEC [sp_update_schedule] @schedule_id = @scheduleid, @enabled = 1;
    
    /*********************
     Removes row from loop
    *********************/
    
                    DELETE FROM @JobsEnabled
                    WHERE [Id] = @ID;
    
    /***********************
     Set job back to enabled
    ***********************/
    
                    UPDATE [dbo].[JobsEnabledTracker]
                      SET [enabled] = 1
                    WHERE [job_id] = @jobid AND 
                          [schedule_id] = @scheduleid;
    
    /****************************
     No more rows, stops deleting
    ****************************/
    
                    IF
                    (
                        SELECT COUNT(*)
                        FROM @JobsEnabled
                    ) <= 0
                    BEGIN
                        BREAK;
                    END;
    
    /********
     End Loop
    ********/
                END;
                PRINT 'Exiting loop, enabling schedules paired to jobs complete.';
    
    /**********
     End elseif
    **********/
            END;
            ELSE
            BEGIN
                PRINT 'All done';
            END;
        END;
        ELSE
        BEGIN
            PRINT 'dbo.JobsEnabledTracker has no disabled jobs currently.';
        END;
    END;
    ELSE
    BEGIN
        PRINT 'dbo.JobsEnabledTracker is NULL, you may need to run the first script to create and populate this table.';
    END;
    
    • 4
  2. starko
    2018-09-08T05:22:27+08:002018-09-08T05:22:27+08:00

    sp_stop_job?

    Link para a documentação: https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-stop-job-transact-sql?view=sql-server-2017

    • -2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve