بیا
ساده متن
راځئ چې د خورا کوچني سره پیل وکړو. لومړی میتود خورا ساده دی چې واقعیا د خبرو کولو لپاره هیڅ شی شتون نلري (لیکوال له دې وروسته د فری سټایل دندې کاروي):
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 CPU ژور پوښتنو لیست په دې طریقه، CSV به د دې حقیقت له امله "خراب" شي چې د پوښتنې متن کېدای شي هر ډول حروف ولري - کوما، نرخونه، او حتی د لیکې وقفې. له همدې امله، موږ یو څه ډیر پیچلي ته اړتیا لرو.
په HTML کې ښکلې نښې
زه به تاسو ته سمدلاسه د کوډ ټوټه درکړم
$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 دقیقو لپاره CPU ښکاره کوي - دا معلومه شوه چې ملګری میجر هرڅه په یاد لري! دا کوئز هڅه وکړئ:
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);
اوس، د دې فارمیټ په کارولو سره ($ ټوټه متغیر)
<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، Xquery، HTML. دا د افسوس خبره ده چې موږ نشو کولی جاوا سکرپٹ په HTML کې اضافه کړو (ځکه چې دا د لیکلو لپاره دی) ، مګر د پایتون کوډ پالش کول (کوم چې په SQL کې کارول کیدی شي) د هرچا دنده ده!
د SQL پروفایلر ټریس محصول
دا روښانه ده چې ټریس به د TextData ساحې له امله په CSV کې مناسب نه وي. مګر په لیک کې د ټریس گرډ ښودل هم عجیب دي - دواړه د اندازې له امله او ځکه چې دا معلومات ډیری وختونه د نورو تحلیلونو لپاره کارول کیږي. له همدې امله ، موږ لاندې کار کوو: موږ له لارې زنګ وهو invoke-SqlCmd یو ځانګړی سکریپټ، په ژورو کې چې دا ترسره کیږي
select
SPID,EventClass,TextData,
Duration,Reads,Writes,CPU,
StartTime,EndTime,DatabaseName,HostName,
ApplicationName,LoginName
from ::fn_trace_gettable ( @filename , default )
بل، پر ملګری د DBA لخوا د لاسرسي وړ سرور کې ، د خالي ټیمپلیټ سره د ټریس ډیټابیس شتون لري ، د ماډل پلیټ ، د ټولو ټاکل شوي کالمونو منلو ته چمتو دی. موږ دا ماډل نوي میز ته د ځانګړي نوم سره کاپي کوو:
$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
او اوس موږ کولی شو د دې په کارولو سره خپل ټریس ولیکو Data.SqlClient.SqlBulkCopy - ما مخکې د دې پورته مثال ورکړ. هو، دا به هم ښه وي چې په 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 څخه ډیر اوږده شمیرې په 0 سره بدلوو، او موږ د یو حرف څخه اوږد تارونه د "str" سره بدلوو. له 9 څخه تر XNUMX پورې شمیرې اکثرا د بیرغونو په توګه کارول کیږي، او موږ دوی ته لاس نه ورکوو، همدارنګه د خالي او واحد حروف تارونه - 'Y'، 'N'، او نور اکثرا د دوی په مینځ کې موندل کیږي.
راځئ چې زموږ په ژوند کې یو څه رنګ اضافه کړو (په کلکه 18+)
په جدولونو کې، تاسو ډیری وختونه غواړئ هغه حجرې روښانه کړئ چې پاملرنې ته اړتیا لري. د مثال په توګه، ناکامي، د ټوټې ټوټې کولو لوړه کچه، او داسې نور. البته، دا په خلاص SQL کې ترسره کیدی شي، د PRINT په کارولو سره HTML تولید کړئ، او په جینکنز کې HTML ته د فایل ډول ترتیب کړئ:
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>'
ما ولې داسې کوډ ولیکه؟
مګر یو ډیر ښکلی حل شتون لري. HTML ته بدل کړئ موږ ته اجازه نه راکوي چې حجرې رنګ کړو، مګر موږ کولی شو دا د واقعیت وروسته ترسره کړو. د مثال په توګه، موږ غواړو هغه حجرې وټاکو چې له 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,
اوس، د پاورشیل لخوا رامینځته شوي HTML ترلاسه کولو سره ، موږ به ډمي کالم له سرلیک څخه لرې کړو ، او د ډیټا په بدن کې به موږ ارزښت له کالم څخه سټایل ته انتقال کړو. دا یوازې د دوو بدیلونو سره ترسره کیږي:
$html = $html `
-replace "<th>SQLmarkup[^<]*</th>", "" `
-replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'
پایلې:
دا ښکلی نه دی؟ که څه هم نه، دا رنګ ماته د یو څه یادونه کوي
سرچینه: www.habr.com