በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

እንደገና የዝግጅቱን ጭብጥ በመቀጠል ዜሮ ንክኪ PROD በ RDS ስር. የወደፊት ዲቢኤዎች ከPROD አገልጋዮች ጋር በቀጥታ መገናኘት አይችሉም፣ ግን መጠቀም ይችላሉ። ጄንከንዝ ለተወሰኑ የክዋኔዎች ስብስብ ስራዎች. ዲቢኤ ሥራ ይጀምራል እና ከተወሰነ ጊዜ በኋላ የዚህ ቀዶ ጥገና ማጠናቀቂያ ሪፖርት ያለበት ደብዳቤ ይቀበላል። እነዚህን ውጤቶች ለተጠቃሚው የምናቀርብባቸውን መንገዶች እንመልከት።

በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

በሚነበብ መልኩ

በጣም ቀላል በሆነው እንጀምር። የመጀመሪያው ዘዴ በጣም ቀላል ስለሆነ ምንም የሚናገረው ነገር የለም (ጸሐፊው ከዚህ በኋላ የFreeStyle ስራዎችን ይጠቀማል)

በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

sqlcmd የሆነ ነገር ያደርጋል እና ለተጠቃሚው እናቀርባለን. ለምሳሌ ለመጠባበቂያ ስራዎች፡

በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

በነገራችን ላይ፣ በRDS ምትኬ/እነበረበት መልስ የማይመሳሰል መሆኑን አትርሳ፣ ስለዚህ እሱን መጠበቅ አለብህ፡-

declare @rds table
  (id int, task_type varchar(128), database_name sysname, pct int, duration int, 
   lifecycle varchar(128), taskinfo varchar(max) null, 
   upd datetime, cre datetime,
   s3 varchar(256), ovr int, KMS varchar(256) null)
waitfor delay '00:00:20' 
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
select @xid=max(id) from @rds

again:
waitfor delay '00:00:02'
delete from @rds
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}' 
# {db} substituted with db name by powershell
select @stat=lifecycle,@info=taskinfo from @rds where id=@xid
if @stat not in ('ERROR','SUCCESS','CANCELLED') goto again

ሁለተኛው ዘዴ, CSV

እዚህ ሁሉም ነገር በጣም ቀላል ነው-

በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

ሆኖም ይህ ዘዴ የሚሰራው በCSV ውስጥ የተመለሰው መረጃ "ቀላል" ከሆነ ብቻ ነው። ለመመለስ ከሞከሩ፣ ለምሳሌ የ TOP N ሲፒዩ የተጠናከረ መጠይቆችን ዝርዝር በዚህ መንገድ፣ የጥያቄው ጽሁፍ ማንኛውንም ቁምፊዎችን ሊይዝ ስለሚችል CSV “ይበላሻል” - ኮማዎች፣ ጥቅሶች እና የመስመር መግቻዎች። ስለዚህ, የበለጠ የተወሳሰበ ነገር ያስፈልገናል.

በኤችቲኤምኤል ውስጥ የሚያምሩ ምልክቶች

ወዲያውኑ የኮድ ቅንጣቢ እሰጥሃለሁ

$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
  
$Result = invoke-Sqlcmd -ConnectionString $jstr -Query "select * from DbInv" `
  | Select-Object -Property * -ExcludeProperty "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result -eq $null) { $cnt = 0; }
elseif ($Result.getType().FullName -eq "System.Management.Automation.PSCustomObject") { $cnt = 1; }
else { $cnt = $Result.Rows.Count; } 
if ($cnt -gt 0) {
  $body = "<h2>My table</h2>"
  $Result | ConvertTo-HTML -Title "Rows" -Head $header -body $body `
    | Out-File "res.log" -Append -Encoding UTF8
  } else {
    "<h3>No data</h3>" | Out-File "res.log" -Append -Encoding UTF8
  }

በነገራችን ላይ ከSystem.Management.Automation.PSCustomObject ጋር ላለው መስመር ትኩረት ይስጡ ፣ አስማታዊ ነው ፣ በፍርግርግ ውስጥ በትክክል አንድ መስመር ካለ ፣ ከዚያ አንዳንድ ችግሮች ተፈጠሩ። መፍትሄው ብዙ ግንዛቤ ሳይኖረው ከኢንተርኔት ተወስዷል። በውጤቱም ፣ የውጤት ቅርጸት እንደዚህ ያለ ነገር ያገኛሉ።

በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

ግራፎችን መሳል

ማስጠንቀቂያ፡ የኪንኪ ኮድ ከታች!
ለመጨረሻዎቹ N ደቂቃዎች ሲፒዩውን የሚያሳየው በ SQL አገልጋይ ላይ አስቂኝ ጥያቄ አለ - ኮምሬድ ሜጀር ሁሉንም ነገር ያስታውሳል! ይህን ጥያቄ ይሞክሩ፡

DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) 
  FROM sys.dm_os_sys_info WITH (NOLOCK)); 
SELECT TOP(256) 
  DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime],
  SQLProcessUtilization AS [SQLCPU], 
  100 - SystemIdle - SQLProcessUtilization AS [OtherCPU]
FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') 
    AS [SystemIdle], 
  record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') 
    AS [SQLProcessUtilization], [timestamp] 
  FROM (SELECT [timestamp], CONVERT(xml, record) AS [record] 
  FROM sys.dm_os_ring_buffers WITH (NOLOCK)
  WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
    AND record LIKE N'%<SystemHealth>%') AS x) AS y 
ORDER BY 1 DESC OPTION (RECOMPILE);

አሁን፣ ይህን ቅርጸት በመጠቀም ($Fragment ተለዋዋጭ)

<table style="width: 100%"><tbody><tr style="background-color: white; height: 2pt;">
  <td style="width: SQLCPU%; background-color: green;"></td>
  <td style="width: OtherCPU%; background-color: blue;"></td>
  <td style="width: REST%; background-color: #C0C0C0;"></td></tr></tbody>
</table>

የደብዳቤውን አካል መመስረት እንችላለን-

$Result = invoke-Sqlcmd -ConnectionString $connstr -Query $Query `
  | Select-Object -Property * -ExcludeProperty `
  "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result.HasRows) {
  foreach($item in $Result) 
    { 
    $time = $itemEventTime 
    $sqlcpu = $item.SQLCPU
    $other = $itemOtherCPU
    $rest = 100 - $sqlcpu - $other
    $f = $fragment -replace "SQLCPU", $sqlcpu
    $f = $f -replace "OtherCPU", $other
    $f = $f -replace "REST", $rest
    $f | Out-File "res.log" -Append -Encoding UTF8
    }

የትኛው ይህን ይመስላል።

በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

አዎ፣ Monsieur ስለ ጠማማነት ብዙ ያውቃል! ይህ ኮድ የሚከተሉትን መያዙ ትኩረት የሚስብ ነው Powershell (በውስጡ የተጻፈ)፣ SQL፣ Xquery፣ HTML። ጃቫ ስክሪፕትን ወደ ኤችቲኤምኤል ማከል አለመቻላችን ያሳዝናል (ለመፃፍ ስለሆነ) ነገር ግን የ Python ኮድን (በSQL ውስጥ ጥቅም ላይ ሊውል የሚችል) ማጥራት የሁሉም ሰው ግዴታ ነው!

SQL profiler መከታተያ ውፅዓት

በTextData መስክ ምክንያት ዱካው ወደ CSV እንደማይገባ ግልጽ ነው። ነገር ግን በደብዳቤ ውስጥ የመከታተያ ፍርግርግ ማሳየትም እንግዳ ነገር ነው - በመጠን እና ይህ መረጃ ብዙ ጊዜ ለተጨማሪ ትንተና ስለሚውል። ስለዚህ, እኛ የሚከተለውን እናደርጋለን: እኛ በኩል ይደውሉ መጥራት-SqlCmd የተወሰነ ስክሪፕት, በተሰራበት ጥልቀት

select 
  SPID,EventClass,TextData,
  Duration,Reads,Writes,CPU,
  StartTime,EndTime,DatabaseName,HostName,
  ApplicationName,LoginName
   from ::fn_trace_gettable ( @filename , default )  

በመቀጠል፣ በ ጓደኛ በዲቢኤ ተደራሽ በሆነው አገልጋይ ላይ ባዶ አብነት ያለው የሞዴል ሳህን ሁሉንም የተገለጹ አምዶች ለመቀበል ዝግጁ የሆነ የ Traces ዳታቤዝ አለ። ይህን ሞዴል ልዩ ስም ወዳለው አዲስ ሠንጠረዥ እንቀዳለን፡-

$dt = Get-Date -format "yyyyMMdd"
$tm = Get-Date -format "hhmmss"
$tableName = $srv + "_" + $dt + "_" + $tm
$copytab = "select * into " + $tableName + " from Model"
invoke-SqlCmd -ConnectionString $tstr -Query $copytab 

እና አሁን ተጠቅመን ዱካችንን ወደ እሱ እንጽፋለን። ውሂብ.SqlClient.SqlBulk ቅጂ - ከዚህ በላይ ለዚህ ምሳሌ አስቀድሜ ሰጥቻለሁ. አዎ፣ በ TextData ውስጥ ቋሚዎችን መደበቅ ጥሩ ይሆናል፡-

# mask data
foreach ($Row in $Result)
{ 
  $v = $Row["TextData"]
  $v = $v -replace "'([^']{2,})'", "'str'" -replace "[0-9][0-9]+", '999'
  $Row["TextData"] = $v
}

ከአንድ ፊደል በላይ የሚረዝሙ ቁጥሮችን በ999 እንተካቸዋለን፣ እና ከአንድ ቁምፊ በላይ የሚረዝሙ ሕብረቁምፊዎችን በ'str' እንተካለን። ከ 0 እስከ 9 ያሉት ቁጥሮች ብዙውን ጊዜ እንደ ባንዲራ ይጠቀማሉ, እና እኛ አንነካቸውም, እንዲሁም ባዶ እና ነጠላ-ቁምፊ ገመዶች - 'Y', 'N', ወዘተ ብዙውን ጊዜ በመካከላቸው ይገኛሉ.

በህይወታችን ላይ የተወሰነ ቀለም እንጨምር (በጥብቅ 18+)

በጠረጴዛዎች ውስጥ ብዙውን ጊዜ ትኩረት የሚሹ ሴሎችን ማጉላት ይፈልጋሉ. ለምሳሌ፣ FAILS፣ ከፍተኛ የመከፋፈል ደረጃ፣ ወዘተ. በእርግጥ ይሄ በባዶ SQL፣ PRINTን በመጠቀም ኤችቲኤምኤልን በማመንጨት እና የፋይሉን አይነት በጄንኪንስ ወደ ኤችቲኤምኤል በማዘጋጀት ሊከናወን ይችላል።

declare @body varchar(max), @chunk varchar(max)
set @body='<font face="Lucida Console" size="3">'
set @body=@body+'<b>Server name: '+@@servername+'</b><br>'
set @body=@body+'<br><br>'
set @body=@body+'<table><tr><th>Job</th><th>Last Run</th><th>Avg Duration, sec</th><th>Last Run, Sec</th><th>Last Status</th></tr>'
print @body

DECLARE tab CURSOR FOR SELECT '<tr><td>'+name+'</td><td>'+
  LastRun+'</td><td>'+
  convert(varchar,AvgDuration)+'</td><td>'+
  convert(varchar,LastDuration)+'</td><td>'+
    case when LastStatus<>'Succeeded' then '<font color="red">' else '' end+
      LastStatus+
      case when LastStatus<>'Succeeded' then '</font>' else '' end+
     +'</td><td>'
  from #j2
OPEN tab;  
FETCH NEXT FROM tab into @chunk
WHILE @@FETCH_STATUS = 0  
BEGIN
  print @chunk
  FETCH NEXT FROM tab into @chunk;  
END  
CLOSE tab;  
DEALLOCATE tab;
print '</table>'

ለምን እንደዚህ አይነት ኮድ ጻፍኩ?

በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

ግን የበለጠ ቆንጆ መፍትሄ አለ. ወደ ኤችቲኤምኤል ቀይር ሴሎችን ቀለም እንድንቀባ አይፈቅድልንም, ነገር ግን ከእውነታው በኋላ ማድረግ እንችላለን. ለምሳሌ፣ ከ 80 በላይ እና ከ 90 በላይ የሆኑ የመበታተን ደረጃ ያላቸውን ሴሎች መምረጥ እንፈልጋለን። ቅጦች እንጨምር፡-

<style>
.SQLmarkup-red { color: red; background-color: yellow; }
.SQLmarkup-yellow { color: black; background-color: #FFFFE0; }
.SQLmarkup-default { color: black; background-color: white; }
</style>

በጥያቄው ውስጥ ራሱ ዱሚ አምድ እንጨምራለን ወዲያውኑ በፊት አምድ ቀለም መቀባት እንፈልጋለን. ዓምዱ መጠራት አለበት SQLmarkup-የሆነ ነገር፡-

case  
  when ps.avg_fragmentation_in_percent>=90.0 then 'SQLmarkup-red'
  when ps.avg_fragmentation_in_percent>=80.0 then 'SQLmarkup-yellow'
  else 'SQLmarkup-default' 
  end as [SQLmarkup-1], 
ps.avg_fragmentation_in_percent, 

አሁን፣ በPowershell የተፈጠረውን ኤችቲኤምኤል ከተቀበልን፣ የዱሚውን አምድ ከራስጌው ላይ እናስወግደዋለን፣ እና በመረጃው አካል ውስጥ እሴቱን ከአምዱ ወደ ስታይል እናስተላልፋለን። ይህ የሚከናወነው በሁለት ምትክ ብቻ ነው-

$html = $html `
  -replace "<th>SQLmarkup[^<]*</th>", "" `
  -replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'

ውጤት:
በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

የሚያምር አይደለምን? ምንም እንኳን አይሆንም, ይህ ቀለም አንድ ነገር ያስታውሰኛል
በጄንኪንስ የ SQL አገልጋይ አውቶማቲክ፡ ውጤቱን በሚያምር ሁኔታ መመለስ

ምንጭ: hab.com

አስተያየት ያክሉ