Fragensteller
SQL Server 2012 Verlaufsanzeige nicht mehr aktuell - keine Protokollierung mehr der Agent Jobs

Frage
-
Hallo,
seit dem 16.06.2018 steht nichts mehr in der Verlaufsanzeige. Das deckt sich auch mit den Einträgen in der Datei "sysjobhistory".
Ich habe nun einen neuen Agent Auftrag test angelegt und auch da wird nichts protokolliert, obwohl in der Fehlerprotokollanzeige steht "Der Auftragsabschluss für "test" wird in sysjobhistory protokolliert".
Die Größe des Verlaufsprotokolls habe ich entsprechend angepasst. Habe auch den Haken herausgenommen, auch ohne Erfolg.
Ist etwas am Server defekt?
Danke.
Gruß Klaus
Alle Antworten
-
Hallo Klaus,
ich habe mal aus diesem Thread (sql-server-2012-job-history-missing) ein Skript geklaut.
DECLARE @MasterPath nvarchar(512); DECLARE @LogPath nvarchar(512); DECLARE @ErrorLog nvarchar(512); DECLARE @ErrorLogPath nvarchar(512); SELECT @MasterPath=substring(physical_name, 1, len(physical_name) - charindex('\', reverse(physical_name))) FROM master.sys.database_files WHERE name=N'master'; SELECT @LogPath=substring(physical_name, 1, len(physical_name) - charindex('\', reverse(physical_name))) FROM master.sys.database_files WHERE name=N'mastlog'; SELECT @ErrorLog=cast(SERVERPROPERTY(N'errorlogfilename') as nvarchar(512)); SELECT @ErrorLogPath=substring(@ErrorLog, 1, len(@ErrorLog) - charindex('\', reverse(@ErrorLog))); DECLARE @SmoRoot nvarchar(512); EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' , N'SOFTWARE\Microsoft\MSSQLServer\Setup' , N'SQLPath' , @SmoRoot OUTPUT; IF OBJECT_ID('tempdb..#tmp_sp_get_sqlagent_properties') IS NOT NULL DROP TABLE #tmp_sp_get_sqlagent_properties; CREATE TABLE #tmp_sp_get_sqlagent_properties ( auto_start int null , msx_server_name sysname null , sqlagent_type int null , startup_account nvarchar(255) null , sqlserver_restart int null , jobhistory_max_rows int null , jobhistory_max_rows_per_job int null , errorlog_file nvarchar(255) null , errorlogging_level int null , error_recipient nvarchar(30) null , monitor_autostart int null , local_host_server sysname null , job_shutdown_timeout int null , cmdexec_account varbinary(64) null , regular_connections int null , host_login_name sysname null , host_login_password varbinary(512) null , login_timeout int null , idle_cpu_percent int null , idle_cpu_duration int null , oem_errorlog int null , sysadmin_only int null , email_profile nvarchar(64) null , email_save_in_sent_folder int null , cpu_poller_enabled int null , replace_alert_tokens_enabled int null ); INSERT INTO #tmp_sp_get_sqlagent_properties ( auto_start , msx_server_name , sqlagent_type , startup_account , sqlserver_restart , jobhistory_max_rows , jobhistory_max_rows_per_job , errorlog_file , errorlogging_level , error_recipient , monitor_autostart , local_host_server , job_shutdown_timeout , cmdexec_account , regular_connections , host_login_name , host_login_password , login_timeout , idle_cpu_percent , idle_cpu_duration , oem_errorlog , sysadmin_only , email_profile , email_save_in_sent_folder , cpu_poller_enabled , replace_alert_tokens_enabled ) EXEC msdb.dbo.sp_get_sqlagent_properties; DECLARE @DatabaseMailProfile nvarchar(255); DECLARE @AgentMailType int; DECLARE @ServiceStartMode int; DECLARE @ServiceAccount nvarchar(512); DECLARE @AgtGroup nvarchar(512); EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' , N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent' , N'DatabaseMailProfile' , @param = @DatabaseMailProfile OUT , @no_output = N'no_output'; EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' , N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent' , N'UseDatabaseMail' , @param = @AgentMailType OUT , @no_output = N'no_output'; EXEC master.sys.xp_instance_regread 'HKEY_LOCAL_MACHINE' , 'SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT' , N'Start' , @ServiceStartMode OUTPUT; EXEC master.sys.xp_instance_regread 'HKEY_LOCAL_MACHINE' , 'SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT' , N'ObjectName' , @ServiceAccount OUTPUT; EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' , N'SOFTWARE\Microsoft\MSSQLServer\Setup' , N'AGTGroup' , @AgtGroup OUTPUT; SELECT Items.* FROM #tmp_sp_get_sqlagent_properties AS tsgsp CROSS APPLY (VALUES ('Name', CAST(serverproperty(N'ServerName') AS sql_variant)) , ('MsxServerName', ISNULL(tsgsp.msx_server_name,N'')) , ('JobServerType', CONVERT(sql_variant, tsgsp.sqlagent_type)) , ('SqlServerRestart', CONVERT(sql_variant, tsgsp.sqlserver_restart)) , ('SqlAgentRestart', CONVERT(sql_variant, tsgsp.monitor_autostart)) , ('MaximumHistoryRows', CONVERT(sql_variant, tsgsp.jobhistory_max_rows)) , ('MaximumJobHistoryRows', CONVERT(sql_variant, tsgsp.jobhistory_max_rows_per_job)) , ('ErrorLogFile', CONVERT(sql_variant, tsgsp.errorlog_file)) , ('AgentLogLevel', CONVERT(sql_variant, tsgsp.errorlogging_level)) , ('NetSendRecipient', CONVERT(sql_variant, ISNULL(tsgsp.error_recipient,N''))) , ('AgentShutdownWaitTime', CONVERT(sql_variant, tsgsp.job_shutdown_timeout)) , ('SqlAgentMailProfile', CONVERT(sql_variant, ISNULL(tsgsp.email_profile,N''))) , ('SaveInSentFolder', CONVERT(sql_variant, CAST(tsgsp.email_save_in_sent_folder AS bit))) , ('WriteOemErrorLog', CONVERT(sql_variant, CAST(tsgsp.oem_errorlog AS bit))) , ('IsCpuPollingEnabled', CONVERT(sql_variant, CAST(tsgsp.cpu_poller_enabled AS bit))) , ('IdleCpuPercentage', CONVERT(sql_variant, tsgsp.idle_cpu_percent)) , ('IdleCpuDuration', CONVERT(sql_variant, tsgsp.idle_cpu_duration)) , ('LoginTimeout', CONVERT(sql_variant, tsgsp.login_timeout)) , ('HostLoginName', CONVERT(sql_variant, ISNULL(tsgsp.host_login_name,N''))) , ('LocalHostAlias', CONVERT(sql_variant, ISNULL(tsgsp.local_host_server,N''))) , ('SqlAgentAutoStart', CONVERT(sql_variant, tsgsp.auto_start)) , ('ReplaceAlertTokensEnabled', CONVERT(sql_variant, tsgsp.replace_alert_tokens_enabled)) , ('DatabaseMailProfile', CONVERT(sql_variant, ISNULL(@DatabaseMailProfile,N''))) , ('AgentMailType', CONVERT(sql_variant, ISNULL(@AgentMailType, 0))) , ('SysAdminOnly', CONVERT(sql_variant, 1)) , ('ServiceStartMode', CONVERT(sql_variant, @ServiceStartMode)) , ('ServiceAccount', CONVERT(sql_variant, ISNULL(@ServiceAccount,N''))) , ('AgentDomainGroup', CONVERT(sql_variant, ISNULL(suser_sname(sid_binary(ISNULL(@AgtGroup,N''))),N''))) )Items(ItemName, ItemValue) UNION ALL SELECT Items.* FROM (VALUES ('IsCaseSensitive', CAST(case when 'a' <> 'A' then 1 else 0 end AS bit)) , ('MaxPrecision', @@MAX_PRECISION) , ('ErrorLogPath', @ErrorLogPath) , ('RootDirectory', @SmoRoot) , ('IsFullTextInstalled', CAST(FULLTEXTSERVICEPROPERTY('IsFullTextInstalled') AS bit)) , ('MasterDBLogPath', @LogPath) , ('MasterDBPath', @MasterPath) , ('VersionString', SERVERPROPERTY(N'ProductVersion')) , ('Edition', CAST(SERVERPROPERTY(N'Edition') AS sysname)) , ('ProductLevel', CAST(SERVERPROPERTY(N'ProductLevel') AS sysname)) , ('IsSingleUser', CAST(SERVERPROPERTY('IsSingleUser') AS bit)) , ('EngineEdition', CAST(SERVERPROPERTY('EngineEdition') AS int)) , ('Collation', convert(sysname, serverproperty(N'collation'))) , ('NetName', CAST(SERVERPROPERTY(N'MachineName') AS sysname)) , ('IsClustered', CAST(SERVERPROPERTY('IsClustered') AS bit)) , ('ResourceVersionString', SERVERPROPERTY(N'ResourceVersion')) , ('ResourceLastUpdateDateTime', SERVERPROPERTY(N'ResourceLastUpdateDateTime')) , ('CollationID', SERVERPROPERTY(N'CollationID')) , ('ComparisonStyle', SERVERPROPERTY(N'ComparisonStyle')) , ('SqlCharSet', SERVERPROPERTY(N'SqlCharSet')) , ('SqlCharSetName', SERVERPROPERTY(N'SqlCharSetName')) , ('SqlSortOrder', SERVERPROPERTY(N'SqlSortOrder')) , ('SqlSortOrderName', SERVERPROPERTY(N'SqlSortOrderName')) , ('BuildClrVersionString', SERVERPROPERTY(N'BuildClrVersion')) , ('ComputerNamePhysicalNetBIOS', SERVERPROPERTY(N'ComputerNamePhysicalNetBIOS')) )Items(ItemName, ItemValue) ORDER BY Items.ItemName;
Hier interessiert vor allem die Einstellung für MaximumHistoryRows und MaximumJobHistoryRows.
Evtl. sind die ja sehr klein, oder es gibt evtl. auch einen Wartungsjob, der die Agent-History aufräumt?
Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu
-
Hallo Christoph,
danke, das Script kenne ich schon und habe es auch ausgeführt. Das ist die Zahl, die man beim SQL Agent einstellen kann. Das kann man auch komplett aushaken, so dass es endlos protokolliert. Das hat aber leider alles nichts gebracht. Wie schon oben geschrieben habe ich auch einen neuen Wartungsjob angelegt. Lt. der Meldung würde er in die Protokollierungs sysjobhistory Datei schreiben, macht er aber nicht. Ich sehe leider auch nirgends eine Fehlermeldung.
Das ist schon sehr suspekt. Eventuell ist wirklich etwas am SQL Server defekt. Nur wie kann ich das herausfinden?
Gruß Klaus
-
Klaus,
du könntest versuchen alle Fehlermeldungen auf dem Server zu tracen und dann mal nachschauen, ob er etwas gefunden hat nachdem ein Job gelaufen ist.
Hier musst Du noch den Pfad zu der Datei ändern:
CREATE EVENT SESSION [Error Reported Alle] ON SERVER
ADD EVENT sqlserver.error_reported(
ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [severity]>(10)))
ADD TARGET package0.event_file(SET filename=N'E:\Traces\Error_Reported_Alle.xel'),
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu
-
Hallo Klaus,
ich habe diesen Effekt bei einem Sicherungsjob, den ich über einen Wartungsplan im SQL Server erstellt habe (Ein identisch angelegter Job eines Wartungsplans auf einer zweiten Instanz desselben Servers zeigt das Phänomen allerdings nicht). Dort wird der Verlauf nur für den Wartungsplan aber nicht für den SQL Agent Job geschrieben.
Hast Du evtl. auch einen Wartungsplan erstellt?
Poste doch bitte auch mal das CREATE Statement für den kompletten Job (sensitive Daten natürlich mit *** ersetzen). Evtl. sieht man daran, wo das Problem liegt.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Hallo Stefan,
ja es gibt einen Wartungsplan, der immer Sonntags läuft und da wird auch der Verlauf gelöscht.
Hier mal die Sachen, die gemacht werden:
(1) Datenbankintegrität überpüfen
USE [SIE_DB1]
GO
DBCC CHECKDB(N'SIE_DB1') WITH NO_INFOMSGS(2) Datenbank verkleinern
USE [SIE_DB1]
GO
DBCC SHRINKDATABASE(N'SIE_DB1', 10, TRUNCATEONLY)(3) Index neu erstellen
T-SQL ist zu groß, aber beinhaltet nur lokale Indizes aus der Anwendung
(4) Statistiken aktualisieren
T-SQL ist zu groß, aber beinhaltet nur lokale DB aus der Anwendung
(5) Verkaufscleanup
declare @dt datetime select @dt = cast(N'2018-06-19T11:31:05' as datetime) exec msdb.dbo.sp_delete_backuphistory @dt
GO
EXEC msdb.dbo.sp_purge_jobhistory @oldest_date='2018-06-19T11:31:05'
GO
EXECUTE msdb..sp_maintplan_delete_log null,null,'2018-06-19T11:31:05'(6) Wartungscleanup
Hier werden nur die Sicherungsdateien gelöscht, die älter als 4 Wochen sind.
Der Wartungsplan läuft aber schon sehr viel länger, daher denke ich nicht, dass es etwas damit zu tun hat, aber man weiß ja nie.
Mir ist nun aufgefallen, dass wenn ich auf den Verlauf der Wartungspläne schaue, dann gibt es hier eine Historie und ab dem 1.7. mit Fehlern. Der Fehler verweist auf den Step Verlaufscleanup.
Fehlermeldung: Fehler beim Ausführen der Abfrage 'EXEC msdb.dbo.sp_purge_jobhistory @oldest_date='2...': 'Interner Fehler des Abfrageprozessors: Unerwarteter Fehler beim Ausführen des Abfrageprozessors (HRESULT = 0x80040e19).'. Mögliche Ursachen sind folgende: Probleme bei der Abfrage, nicht richtig festgelegte ResultSet-Eigenschaft, nicht richtig festgelegte Parameter oder nicht richtig hergestellte Verbindung.
Danke Dir schon mal.
Gruß Klaus
- Bearbeitet kv_66 Dienstag, 17. Juli 2018 09:39
-
Hallo Klaus,
poste bitte das CREATE Statement für den Job, der kein Verlaufsprotokoll schreibt.
SQL Agent Job
-> rechte Maustaste
-> Skript für Auftrag als ...
-> CREATE in
-> neues Fenster
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Bearbeitet Stefan FalzModerator Dienstag, 17. Juli 2018 09:47
-
Hallo Stefan,
wir haben mehrere Aufträge und alle protokollieren nichts mehr.
Hier ein Beispiel:
USE [msdb]
GO
/****** Object: Job [Set_Subscribers_Date] Script Date: 17.07.2018 11:57:28 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 17.07.2018 11:57:28 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Set_Subscribers_Date',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'Es ist keine Beschreibung verfügbar.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'xx\Admin', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Set Subscribers Dates] Script Date: 17.07.2018 11:57:28 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Set Subscribers Dates',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'SSIS',
@command=N'/SQL "\"\SIE\SIE_SSISRep\"" /SERVER "\"xx\REPLIVE\"" /CHECKPOINTING OFF /SET "\"\Package.Variables[SQLServerName].Value\"";"\"xx\REPLIVE\"" /SET "\"\Package.Variables[SubscribersDB].Value\"";ReportSubscribers /SET "\"\Package.Variables[SubscribersTab].Value\"";Subscribers /SET "\"\Package.Variables[UserDB].Value\"";"\"SIE_DB1\"" /SET "\"\Package.Variables[DistMstTab].Value\"";"\"dbo.DistMst\"" /REPORTING E',
@database_name=N'master',
@flags=32
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'täglich 11 Uhr',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20170210,
@active_end_date=99991231,
@active_start_time=110000,
@active_end_time=235959,
@schedule_uid=N'c4c16296-14a3-4c05-8447-6c7f6d37d8fb'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GODanke.
Gruß Klaus