እንደገና
በሚነበብ መልኩ
በጣም ቀላል በሆነው እንጀምር። የመጀመሪያው ዘዴ በጣም ቀላል ስለሆነ ምንም የሚናገረው ነገር የለም (ጸሐፊው ከዚህ በኋላ የFreeStyle ስራዎችን ይጠቀማል)
sqlcmd የሆነ ነገር ያደርጋል እና ለተጠቃሚው እናቀርባለን. ለምሳሌ ለመጠባበቂያ ስራዎች፡
በነገራችን ላይ፣ በ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
እዚህ ሁሉም ነገር በጣም ቀላል ነው-
ሆኖም ይህ ዘዴ የሚሰራው በ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 ጋር ላለው መስመር ትኩረት ይስጡ ፣ አስማታዊ ነው ፣ በፍርግርግ ውስጥ በትክክል አንድ መስመር ካለ ፣ ከዚያ አንዳንድ ችግሮች ተፈጠሩ። መፍትሄው ብዙ ግንዛቤ ሳይኖረው ከኢንተርኔት ተወስዷል። በውጤቱም ፣ የውጤት ቅርጸት እንደዚህ ያለ ነገር ያገኛሉ።
ግራፎችን መሳል
ማስጠንቀቂያ፡ የኪንኪ ኮድ ከታች!
ለመጨረሻዎቹ 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
}
የትኛው ይህን ይመስላል።
አዎ፣ 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>'
ለምን እንደዚህ አይነት ኮድ ጻፍኩ?
ግን የበለጠ ቆንጆ መፍትሄ አለ. ወደ ኤችቲኤምኤል ቀይር ሴሎችን ቀለም እንድንቀባ አይፈቅድልንም, ነገር ግን ከእውነታው በኋላ ማድረግ እንችላለን. ለምሳሌ፣ ከ 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">'
ውጤት:
የሚያምር አይደለምን? ምንም እንኳን አይሆንም, ይህ ቀለም አንድ ነገር ያስታውሰኛል
ምንጭ: hab.com