Salta al contenuto

Come posso generare e acquisire eventi di errore nella mia istanza Amazon RDS per SQL Server?

5 minuti di lettura
0

Desidero generare e acquisire eventi di errore nella mia istanza database Amazon Relational Database Service (Amazon RDS) per SQL Server. Desidero inoltre ricevere una notifica quando si verifica un evento di errore.

Breve descrizione

SQL Server utilizza la gestione degli errori per risolvere gli errori di esistenza degli oggetti e gli errori di runtime in un codice T-SQL. Per risolvere errori come questi, utilizza il costrutto TRY...CATCH. Quindi utilizza il comando RAISERROR per generare errori personalizzati e generare eccezioni. Per monitorare i log degli errori di SQL Server e ricevere notifiche quando si verificano, utilizza Amazon CloudWatch Logs.

Risoluzione

Utilizza il costrutto TRY...CATCH e l'istruzione RAISERROR

Completa i seguenti passaggi:

  1. Utilizza SQL Server Management Studio (SSMS).

  2. Utilizza il seguente costrutto TRY...CATCH per definire un blocco di codice per il test degli errori:

    BEGIN TRY  
    
    --code to try  
    
    END TRY  
    
    BEGIN CATCH  
    
    --code to run if an error occurs  
    
    --is generated in try  
    
    END CATCH

    Nota: statement_block monitora il codice compreso tra BEGIN TRY e END TRY per individuare eventuali errori in fase di esecuzione. Quando si verifica un errore nel blocco, l'errore viene trasferito alla sessione CATCH. Quindi, a seconda del codice nel blocco CATCH, l'istruzione esegue l'azione. A seconda del problema, puoi correggere l'errore, segnalarlo o registrarlo nei log degli errori di SQL Server.

  3. Crea un messaggio personalizzato che generi un errore di SQL Server quando si verifica. Aggiungi la seguente istruzione RAISERROR alle procedure di archiviazione o a SQL Server in base a ciò che desideri monitorare:

    RAISERROR ( { msg_id | msg_str | @local_variable }  
    
    { , severity, state }  
    
    [ , argument [ , ...n ] ] )  
    
    [ WITH option [ , ...n ] ]

    Esempio di costrutto TRY e CATCH e comando RAISERROR:

    BEGIN TRY  
    
    SELECT 1/0  
    
    END TRY  
    
    BEGIN CATCH  
    
    DECLARE @Var VARCHAR(100)  
    
    SELECT ERROR_MESSAGE()  
    
    SELECT @Var = ERROR_MESSAGE()  
    
    RAISERROR(@Var, 16,1) WITH LOG  
    
    END CATCH

    Di conseguenza, genera il seguente messaggio di errore nei log di SQL Server:

    Error: 50000, Severity: 16, State: 1.  
    
    Divide by zero error encountered.

Monitora i log degli errori di SQL Server e invia notifiche

Aggiungi uno script alla fase del processo per monitorare il processo dell'agente SQL Server e generare l'errore nei log degli errori di SQL Server. Quindi puoi utilizzare i log degli errori per inviare notifiche.

Per modificare il processo dell'agente SQL Server, completa i seguenti passaggi:

  1. Accedi a SSMS.

  2. Come tipo scegli T-SQL.

  3. Inserisci un nome di database, quindi aggiungi il seguente T-SQL nella sezione command:

    DECLARE @name NVARCHAR(128)  
    
    select @name = name from msdb.dbo.sysjobs where job_id = $(ESCAPE_SQUOTE(JOBID));  
    
    -- Temporary table to store the data of the datafile with low free storage  
    
    DECLARE @jb TABLE ([step_id] int, [step_name] NVARCHAR(128), [message] NVARCHAR(4000), [run_status] int);  
    
    insert into @jb  
    
    select hist.step_id, hist.step_name, hist.message, hist.run_status  
    
    from msdb.dbo.sysjobhistory hist inner join  
    
    (select a.job_id  
    
    , convert(varchar(50),max(a.run_requested_date),112) as run_date  
    
    , replace(convert(varchar(50),max(a.run_requested_date),108), ':', '') as run_time  
    
    from msdb.dbo.sysjobs j inner join msdb.dbo.sysjobactivity a  
    
    on j.job_id = a.job_id  
    
    where j.name = @name  
    
    and a.run_requested_date is not null  
    
    group by a.job_id) ja  
    
    on hist.job_id = ja.job_id  
    
    and hist.run_date = ja.run_date  
    
    and hist.run_time >= ja.run_time  
    
    order by hist.step_id  
    
    declare @error int  
    
    declare @errormsg nvarchar(4000)  
    
    select @error = count(run_status) from @jb where run_status != 0  
    
    if @error > 0  
    
    begin  
    
    set @errormsg='Automatic message from RDS for SQL Server Agent - Job: "' + @name + '" succeed'  
    
    RAISERROR(@errormsg, -1,1) WITH LOG  
    
    end else  
    
    begin  
    
    set @errormsg='Automatic message from RDS for SQL Server Agent - Job: "' + @name + '" failed'  
    
    RAISERROR(@errormsg, 16,1) WITH LOG  
    
    end
  4. Configura la fase precedente del processo per passare alle fasi successive On success (In caso di esito positivo) e On failure (In caso di esito negativo). Per ulteriori informazioni, consulta Impostare il flusso basato sul successo o fallimento del lavoro sul sito web Microsoft. Le fasi del processo On success e On failure eseguono il codice precedente per verificare se l'esecuzione ha avuto esito positivo o negativo. Il processo dell'agente genera quindi il messaggio nel log degli errori di SQL Server che indica se il processo ha avuto esito positivo o negativo.

  5. Esegui questa procedura per verificare se il processo di SQL Server è stato eseguito correttamente e sono stati aggiornati i dettagli del processo non riuscito nei log degli errori di SQL Server:

    EXEC rdsadmin.dbo.rds_read_error_log @index = 0, @type = 1;

    Per ulteriori informazioni, consulta Visualizzazione dei log dell'agente e degli errori.
    Di seguito è riportato un esempio dei dettagli del processo aggiornati nei log degli errori:

    Automatic message from RDS for SQL Server Agent - Job: "jobtest-new" succeed    
    Error: 50000, Severity: 16, State: 1.  
    Automatic message from RDS for SQL Server Agent - Job: "jobtest-new" failed

Configura le notifiche in CloudWatch Logs

Per configurare le notifiche in CloudWatch, consulta Pubblicazione dei log di SQL Server su Amazon CloudWatch Logs.

Dopo aver pubblicato i log di SQL Server su CloudWatch Logs, puoi creare filtri metrici per semplificare la ricerca nei log. I filtri metrici trasformano i dati dei log in metriche di CloudWatch espresse in forma numerica per le quali puoi impostare allarmi. Per ulteriori informazioni, consulta Come posso ricevere notifiche SNS sugli eventi del log degli errori e dell'agente di Amazon RDS per SQL Server che corrispondono a uno schema di filtro di CloudWatch?