Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

နောက်တဖန် စီစဉ်မှု၏ ဆောင်ပုဒ်ကို ဆက်လက်လုပ်ဆောင်သည်။ Zero Touch PROD RDS အောက်တွင်. အနာဂတ် DBA များသည် PROD ဆာဗာများသို့ တိုက်ရိုက် ချိတ်ဆက်နိုင်မည် မဟုတ်သော်လည်း အသုံးပြုနိုင်မည် ဖြစ်သည်။ Jenkins အကန့်အသတ်ရှိသော လုပ်ငန်းများအတွက် အလုပ်များ။ DBA သည် အလုပ်စတင်ပြီး အချိန်အတန်ကြာပြီးနောက် ဤလုပ်ငန်းဆောင်ရွက်မှု ပြီးဆုံးခြင်းဆိုင်ရာ အစီရင်ခံစာပါသော စာတစ်စောင်ကို လက်ခံရရှိခဲ့ပါသည်။ ဤရလဒ်များကို သုံးစွဲသူထံ တင်ပြရန် နည်းလမ်းများကို ကြည့်ကြပါစို့။

Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

ရိုးရိုးစာသား

အသေးအဖွဲဆုံးအရာဖြင့် စတင်ကြပါစို့။ ပထမနည်းလမ်းသည် အလွန်ရိုးရှင်းသောကြောင့် ပြောစရာအကြောင်းမရှိပါ (စာရေးဆရာသည် ယခုနောက်ပိုင်းတွင် FreeStyle အလုပ်များကို အသုံးပြုသည်)

Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

sqlcmd တစ်ခုခုလုပ်ပေးပြီး သုံးစွဲသူကို တင်ပြတယ်။ ဥပမာအားဖြင့်၊ အရန်အလုပ်များအတွက် စံပြဖြစ်သည်-

Jenkins ရှိ 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

ဤနေရာတွင် အရာအားလုံးသည် အလွန်ရိုးရှင်းပါသည်။

Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

သို့သော်၊ 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 နှင့် လိုင်းကို အာရုံစိုက်ပါ၊ ၎င်းသည် မှော်ဆန်သည်၊ ဇယားကွက်တွင် မျဉ်းတစ်ကြောင်း အတိအကျရှိပါက၊ ပြဿနာအချို့ ပေါ်လာပါသည်။ အဖြေကို နားမလည်ဘဲ အင်တာနက်ကနေ ယူခဲ့တာ။ ရလဒ်အနေဖြင့်၊ သင်သည် ဤကဲ့သို့သော အရာမျိုးဖြင့် output ကို ဖော်မတ်ရရှိလိမ့်မည်-

Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

ဂရပ်များရေးဆွဲခြင်း။

သတိပေးချက်- အောက်တွင်ဖော်ပြထားသော kinky ကုဒ်။
နောက်ဆုံး N မိနစ်များအတွက် CPU ကိုပြသသည့် SQL ဆာဗာတွင် ရယ်စရာကောင်းသောမေးခွန်းတစ်ခုရှိသည် - Comrade Major သည် အရာအားလုံးကိုမှတ်မိနေပါသည်။ ဤမေးခွန်းကို စမ်းကြည့်ပါ-

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 variable) ကို အသုံးပြု၍

<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
    }

အဘယ်အရာသည်ဤကဲ့သို့ဖြစ်လိမ့်မည်-

Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

ဟုတ်တယ်၊ Monsieur က ဖောက်ပြန်တာတွေအကြောင်း အများကြီးသိတယ်။ ဤကုဒ်တွင် Powershell (၎င်း၌ ရေးထားသည်)၊ SQL၊ Xquery၊ HTML ပါ၀င်သည်မှာ စိတ်ဝင်စားစရာကောင်းပါသည်။ HTML တွင် Javascript (စာရေးရန်ဖြစ်သောကြောင့်) မထည့်နိုင်ရခြင်းမှာ သနားစရာကောင်းသော်လည်း Python ကုဒ် (SQL တွင်သုံးနိုင်သည်) ကိုရှင်းလင်းခြင်းသည် လူတိုင်း၏တာဝန်ဖြစ်သည်။

SQL ပရိုဖိုင်းခြေရာကောက် ထုတ်ပေးသည်။

TextData အကွက်ကြောင့် သဲလွန်စသည် CSV တွင် အံဝင်မည်မဟုတ်ကြောင်း ရှင်းပါသည်။ သို့သော် စာလုံးတစ်လုံးတွင် ခြေရာကောက်ဇယားကွက်တစ်ခုပြသခြင်းသည်လည်း ထူးဆန်းသည် - အရွယ်အစားကြောင့်လည်းကောင်း ဤဒေတာကို ထပ်ဆင့်ခွဲခြမ်းစိတ်ဖြာရန် မကြာခဏအသုံးပြုသောကြောင့် ဖြစ်သည်။ ထို့ကြောင့်၊ ကျွန်ုပ်တို့သည် အောက်ပါအတိုင်းလုပ်ဆောင်သည်- ကျွန်ုပ်တို့မှတဆင့်ခေါ်ဆိုပါသည်။ -SqlCmd ကိုခေါ်ပါ။ အနက်ရှိုင်းသော ဇာတ်ညွှန်းတစ်ခု၊

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

ထို့နောက်တွင်၊ သူငယ်ချင်း DBA မှ ဝင်ရောက်အသုံးပြုနိုင်သော ဆာဗာတွင်၊ သတ်မှတ်ထားသော ကော်လံများအားလုံးကို လက်ခံရန် အဆင်သင့်ဖြစ်နေသော နမူနာပုံစံအကွက်တစ်ခုပါရှိသော 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 

ယခု ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏ ခြေရာကောက်ကို ၎င်းကို အသုံးပြု၍ ရေးနိုင်ပါပြီ။ 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 ဖြင့် အစားထိုးပြီး စာလုံးတစ်လုံးထက် ပိုရှည်သော စာကြောင်းများကို 'str' ဖြင့် အစားထိုးပါသည်။ 0 မှ 9 အထိ နံပါတ်များကို အလံများအဖြစ် မကြာခဏ အသုံးပြုကြပြီး ၎င်းတို့ကို ကျွန်ုပ်တို့ မထိသည့်အပြင် ဗလာနှင့် စာလုံးတစ်လုံးတည်းပါသော ကြိုးများ - 'Y'၊ 'N' စသည်တို့ကိုလည်း ၎င်းတို့တွင် တွေ့ရတတ်သည်။

ကျွန်ုပ်တို့၏ဘ၀တွင် အရောင်အချို့ထည့်ကြပါစို့ (တင်းကြပ်စွာ 18+)

ဇယားများတွင် အာရုံစူးစိုက်မှုလိုအပ်သော ဆဲလ်များကို မကြာခဏ မီးမောင်းထိုးပြလိုပါသည်။ ဥပမာအားဖြင့် FAILS၊ အကွဲကွဲအပြားပြား မြင့်မားသောအဆင့်၊ စသည်တို့။ ဟုတ်ပါတယ်၊ ဒါကို SQL သက်သက်နဲ့ PRINT သုံးပြီး HTML ထုတ်ပေးပြီး Jenkins မှာ ဖိုင်အမျိုးအစားကို 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>'

ဒီလိုကုဒ်ကို ဘာကြောင့်ရေးတာလဲ။

Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

ဒါပေမယ့် ပိုလှပတဲ့ ဖြေရှင်းချက်တစ်ခုရှိပါတယ်။ ConvertTo-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>

စုံစမ်းမှုတွင် ကျွန်ုပ်တို့သည် dummy ကော်လံတစ်ခုကို ထည့်ပါမည်။ ရှေ့မှာချက်ချင်း ကော်လံကို အရောင်တင်ချင်သည်။ ကော်လံဟု ခေါ်သင့်သည်။ 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 ကိုလက်ခံရရှိပြီးနောက်၊ ကျွန်ုပ်တို့သည် ခေါင်းစီးမှ dummy ကော်လံကို ဖယ်ရှားမည်ဖြစ်ပြီး ဒေတာ၏ကိုယ်ထည်တွင် ကော်လံမှတန်ဖိုးကို စတိုင်သို့ လွှဲပြောင်းပေးမည်ဖြစ်သည်။ ၎င်းကို အစားထိုး နှစ်မျိုးဖြင့် လုပ်ဆောင်သည်-

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

ရလဒ်:
Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

ပြေပြစ်တယ်မဟုတ်လား မရှိပေမယ့် ဒီအရောင်က တစ်ခုခုကို သတိရစေတယ်။
Jenkins ရှိ SQL ဆာဗာ၏ အလိုအလျောက်လုပ်ဆောင်ခြင်း- ရလဒ်ကို လှပစွာ ပြန်ပေးသည်။

source: www.habr.com

မှတ်ချက် Add