127 lines
6.7 KiB
PowerShell
127 lines
6.7 KiB
PowerShell
$ErrorActionPreference = 'Continue'
|
|
$ProgressPreference = 'SilentlyContinue'
|
|
|
|
function Section($name) { "`n===== $name =====" }
|
|
|
|
Section 'STEP 1: Restart task log'
|
|
if (Test-Path 'C:\Windows\Temp\aimsql-restart.log') {
|
|
Get-Content 'C:\Windows\Temp\aimsql-restart.log' -ErrorAction SilentlyContinue
|
|
} else {
|
|
"MISSING: C:\Windows\Temp\aimsql-restart.log not found"
|
|
}
|
|
|
|
Section 'STEP 1b: Scheduled task info'
|
|
$task = Get-ScheduledTask -TaskName 'AIMSQL_Restart_20260506_0230' -ErrorAction SilentlyContinue
|
|
if ($task) {
|
|
$task | Get-ScheduledTaskInfo | Format-List LastRunTime, LastTaskResult, NextRunTime, NumberOfMissedRuns, TaskName
|
|
} else {
|
|
"MISSING: scheduled task AIMSQL_Restart_20260506_0230 not found"
|
|
}
|
|
|
|
Section 'STEP 2: SQL service state + process start times'
|
|
foreach ($svc in 'MSSQL$AIMSQL','MSSQL$SQLEXPRESS','MSSQL$MICROSOFT##WID') {
|
|
$w = Get-CimInstance Win32_Service -Filter "Name='$svc'" -ErrorAction SilentlyContinue
|
|
if ($null -eq $w) { "$svc : NOT FOUND"; continue }
|
|
$proc = $null
|
|
if ($w.ProcessId -gt 0) { $proc = Get-Process -Id $w.ProcessId -ErrorAction SilentlyContinue }
|
|
[PSCustomObject]@{
|
|
Name = $w.Name
|
|
State = $w.State
|
|
StartMode = $w.StartMode
|
|
PID = $w.ProcessId
|
|
StartTime = if ($proc) { $proc.StartTime } else { 'n/a' }
|
|
WorkingMB = if ($proc) { [math]::Round($proc.WorkingSet64/1MB,1) } else { 'n/a' }
|
|
} | Format-List
|
|
}
|
|
|
|
Section 'STEP 3: MSSQL Application events since 02:00 today'
|
|
try {
|
|
$events = Get-WinEvent -FilterHashtable @{
|
|
LogName='Application'
|
|
StartTime=(Get-Date '2026-05-06 02:00:00')
|
|
ProviderName='MSSQL$AIMSQL','MSSQL$SQLEXPRESS','MSSQL$MICROSOFT##WID'
|
|
} -ErrorAction Stop | Sort-Object TimeCreated
|
|
"Total events: $($events.Count)"
|
|
"17890 count: $(($events | Where-Object Id -eq 17890).Count)"
|
|
$events | Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, @{n='Msg';e={ ($_.Message -split "`n")[0].Substring(0,[Math]::Min(220,($_.Message -split "`n")[0].Length)) }} | Format-Table -AutoSize -Wrap
|
|
} catch {
|
|
"No MSSQL Application events since 02:00 today (or query failed: $_)"
|
|
}
|
|
|
|
Section 'STEP 4: System log 10:00-12:50 today (incident window)'
|
|
try {
|
|
$sys = Get-WinEvent -FilterHashtable @{
|
|
LogName='System'
|
|
StartTime=(Get-Date '2026-05-06 10:00:00')
|
|
EndTime=(Get-Date '2026-05-06 12:50:00')
|
|
} -ErrorAction Stop | Where-Object {
|
|
$_.ProviderName -in @('Service Control Manager','Microsoft-Windows-Resource-Exhaustion-Detector','Microsoft-Windows-Resource-Exhaustion-Resolver','Microsoft-Windows-WER-SystemErrorReporting','Application Popup','Microsoft-Windows-Kernel-General','Microsoft-Windows-Kernel-Power','Microsoft-Windows-WER-Diag') -or $_.LevelDisplayName -in @('Error','Warning','Critical')
|
|
} | Sort-Object TimeCreated
|
|
"System events in window: $($sys.Count)"
|
|
$sys | Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, @{n='Msg';e={ ($_.Message -split "`n")[0].Substring(0,[Math]::Min(200,($_.Message -split "`n")[0].Length)) }} | Format-Table -AutoSize -Wrap
|
|
} catch {
|
|
"System log query failed: $_"
|
|
}
|
|
|
|
Section 'STEP 4b: SvcRestartTask runs today'
|
|
Get-ScheduledTask -TaskName 'SvcRestartTask' -ErrorAction SilentlyContinue | Get-ScheduledTaskInfo | Format-List TaskName, LastRunTime, LastTaskResult, NextRunTime
|
|
|
|
Section 'STEP 5: ERRORLOG location + tail'
|
|
$el = Get-ChildItem -Path 'C:\Program Files\Microsoft SQL Server\','S:\SQL\' -Recurse -Filter ERRORLOG -ErrorAction SilentlyContinue | Where-Object { $_.FullName -match 'AIMSQL' -or $_.Directory.Parent.Name -match 'AIMSQL' } | Select-Object FullName, LastWriteTime, Length
|
|
if (-not $el) {
|
|
$el = Get-ChildItem -Path 'C:\Program Files\Microsoft SQL Server\','S:\SQL\' -Recurse -Filter ERRORLOG -ErrorAction SilentlyContinue | Select-Object FullName, LastWriteTime, Length
|
|
}
|
|
$el | Format-Table -AutoSize
|
|
$aimErrLog = ($el | Where-Object FullName -match 'AIMSQL' | Select-Object -First 1).FullName
|
|
if (-not $aimErrLog) { $aimErrLog = ($el | Sort-Object LastWriteTime -Descending | Select-Object -First 1).FullName }
|
|
if ($aimErrLog -and (Test-Path $aimErrLog)) {
|
|
"--- Tail ($aimErrLog) ---"
|
|
Get-Content $aimErrLog -Tail 200 -ErrorAction SilentlyContinue
|
|
} else {
|
|
"No ERRORLOG identified for AIMSQL"
|
|
}
|
|
|
|
Section 'STEP 6: AIMSQL memory snapshot via sqlcmd'
|
|
$sqlcmd = (Get-Command sqlcmd -ErrorAction SilentlyContinue).Source
|
|
if (-not $sqlcmd) {
|
|
foreach ($p in 'C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe','C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\sqlcmd.exe','C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe') {
|
|
if (Test-Path $p) { $sqlcmd = $p; break }
|
|
}
|
|
}
|
|
"sqlcmd: $sqlcmd"
|
|
if ($sqlcmd) {
|
|
"--- memory counters ---"
|
|
& $sqlcmd -S '.\AIMSQL' -E -d master -h -1 -W -Q "SET NOCOUNT ON; SELECT counter_name + '|' + CAST(cntr_value AS varchar(20)) FROM sys.dm_os_performance_counters WHERE (object_name LIKE '%:Memory Manager%' AND counter_name IN ('Total Server Memory (KB)','Target Server Memory (KB)')) OR (object_name LIKE '%:Buffer Manager%' AND counter_name='Page life expectancy');"
|
|
"--- process memory ---"
|
|
& $sqlcmd -S '.\AIMSQL' -E -d master -h -1 -W -Q "SET NOCOUNT ON; SELECT 'page_fault_count|' + CAST(page_fault_count AS varchar(20)) + '|memory_util_pct|' + CAST(memory_utilization_percentage AS varchar(20)) + '|low_mem|' + CAST(process_physical_memory_low AS varchar(20)) FROM sys.dm_os_process_memory;"
|
|
"--- connection counts ---"
|
|
& $sqlcmd -S '.\AIMSQL' -E -d master -h -1 -W -Q "SET NOCOUNT ON; SELECT 'active_connections|' + CAST(COUNT(*) AS varchar(20)) FROM sys.dm_exec_connections;"
|
|
"--- sessions by login ---"
|
|
& $sqlcmd -S '.\AIMSQL' -E -d master -h -1 -W -Q "SET NOCOUNT ON; SELECT login_name + '|' + CAST(COUNT(*) AS varchar(10)) FROM sys.dm_exec_sessions WHERE is_user_process=1 GROUP BY login_name;"
|
|
} else {
|
|
"sqlcmd not located"
|
|
}
|
|
|
|
Section 'STEP 6b: Active RDP sessions (quser)'
|
|
& quser.exe 2>&1
|
|
|
|
Section 'STEP 7: Windows uptime'
|
|
$os = Get-CimInstance Win32_OperatingSystem
|
|
$boot = $os.LastBootUpTime
|
|
$uptime = (Get-Date) - $boot
|
|
"LastBootUpTime: $boot"
|
|
"UptimeHours: $([math]::Round($uptime.TotalHours,1))"
|
|
"Now: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss zzz')"
|
|
|
|
Section 'STEP 8: System memory pressure snapshot (now)'
|
|
$os = Get-CimInstance Win32_OperatingSystem
|
|
[PSCustomObject]@{
|
|
TotalMB = [math]::Round($os.TotalVisibleMemorySize/1024,0)
|
|
FreeMB = [math]::Round($os.FreePhysicalMemory/1024,0)
|
|
PctFree = [math]::Round(100*$os.FreePhysicalMemory/$os.TotalVisibleMemorySize,1)
|
|
CommitTotalMB = [math]::Round(($os.TotalVirtualMemorySize)/1024,0)
|
|
CommitFreeMB = [math]::Round(($os.FreeVirtualMemory)/1024,0)
|
|
} | Format-List
|
|
|
|
Section 'DONE'
|