Ин мақола комилан амалӣ аст ва ба ҳикояи ғамангези ман бахшида шудааст
Омодагӣ ба Zero Touch PROD барои RDS (MS SQL), ки ҳама гӯшҳои мо дар бораи он садо медоданд, ман як презентатсия (POC - Исботи Консепсия) -и автоматизатсия кардам: маҷмӯи скриптҳои Powershell. Пас аз муаррифӣ, вақте ки чапакзании тӯфони тӯлонӣ хомӯш шуда, ба кафкӯбиҳои беист табдил ёфт, онҳо ба ман гуфтанд - ҳамаи ин хуб аст, аммо танҳо бо сабабҳои идеологӣ, ҳама ғуломони Ҷенкинс дар Linux кор мекунанд!
Оё ин имконпазир аст? Чунин лампаи гарми DBA-ро аз зери Windows гиред ва онро дар гармии Powershell зери Linux часпонед? Оё ин бераҳм нест?

Ман бояд худро дар ин комбинатсияи аҷиби технологияҳо ғарқ мекардам. Албатта, ҳама 30+ скриптҳои ман аз кор монданд. Ба тааччуб омадам, ки дар як рузи корй дама чизро дуруст кардам. Ман дар ҷустуҷӯи гарм менависам. Пас, ҳангоми интиқоли скриптҳои Powershell аз Windows ба Linux шумо ба кадом домҳо дучор шуда метавонед?
sqlcmd против Invoke-SqlCmd
Биёед ба шумо фарқияти асосии байни онҳоро хотиррасон кунам. Хизматрасонии хуби кӯҳна sqlcmd Он инчунин дар зери Linux кор мекунад, бо функсияҳои қариб якхела. Мо дархостро барои иҷрои -Q, файли вурудро ҳамчун -i ва баромадро ҳамчун -o мегузорем. Аммо номҳои файлҳо, албатта, ҳассос мебошанд. Агар шумо -i -ро истифода баред, пас дар файл дар охири он нависед:
GO
EXITАгар дар охири EXIT мавҷуд набошад, sqlcmd интизори вурудро идома медиҳад ва агар қаблан БАРОМАДГОҲ нахоҳад кард GO, пас фармони охирин кор намекунад. Файли баромад тамоми баромадҳо, интихобҳо, паёмҳо, чоп ва ғайраҳоро дар бар мегирад.
Invoke-SqlCmd натиҷаро ҳамчун маҷмӯаи DataSet, DataTables ё DataRows истеҳсол мекунад. Аз ин рӯ, агар шумо натиҷаи интихоби оддиро коркард кунед, шумо метавонед истифода баред sqlcmd, ки баромади онро таҳлил карда, ба даст овардани чизи мураккаб қариб ғайриимкон аст: барои ин вуҷуд дорад Invoke-SqlCmd. Аммо ин даста шӯхиҳои худро низ дорад:
- Агар шумо файлро ба вай тавассути - InputFile, он гоҳ БАРОМАДГОҲ лозим нест, илова бар ин, он хатои синтаксисиро ба вуҷуд меорад
- -Файли баромад не, фармон ба шумо натиҷаро ҳамчун объект бармегардонад
- Барои муайян кардани сервер ду синтаксис вуҷуд дорад: -ServerInstance -Номи корбар -Парол -Махзани маълумот ва ба воситаи -ConnectionString. Тааҷҷубовар аст, ки дар ҳолати аввал ба ғайр аз 1433 портеро муайян кардан ғайриимкон аст.
- баромади матн, навъи PRINT, ки танҳо "сайд" шудааст sqlcmdбарои Invoke-SqlCmd
- Ва муҳимтар аз ҳама:
Ва ин мушкили асосӣ аст. Танҳо дар моҳи март ин cmdlet , ва дар охир мо метавонем пеш равем!
Ивазкунии тағирёбанда
sqlcmd бо истифода аз -v ивазкунандаи тағирёбанда дорад, масалан:
# $conn содержит начало команды sqlcmd
$cmd = $conn + " -i D:appsSlaveJobsKillSpid.sql -o killspid.res
-v spid =`"" + $spid + "`" -v age =`"" + $age + "`""
Invoke-Expression $cmdДар скрипти SQL мо ивазкуниро истифода мебарем:
set @spid=$(spid)
set @age=$(age)Пас, ин ҷост. Дар *nix ивазкунии тағирёбанда кор намекунад. Параметр -v сарфи назар кард. У Invoke-SqlCmd сарфи назар кард -Тағйирёбандаҳо. Гарчанде ки параметре, ки худи тағирёбандаҳоро муайян мекунад, сарфи назар карда мешавад, худи ивазкуниҳо кор мекунанд - шумо метавонед ҳама гуна тағирёбандаҳоро аз Shell истифода баред. Бо вуҷуди ин, ман аз тағирёбандаҳо хафа шудам ва тасмим гирифтам, ки умуман аз онҳо вобаста набошам ва дағалона ва ибтидоӣ рафтор кардам, зеро скриптҳои SQL кӯтоҳанд:
# prepend the parameters
"declare @age int, @spid int" | Add-Content "q.sql"
"set @spid=" + $spid | Add-Content "q.sql"
"set @age=" + $age | Add-Content "q.sql"
foreach ($line in Get-Content "Sqlserver/Automation/KillSpid.sql") {
$line | Add-Content "q.sql"
}
$cmd = "/opt/mssql-tools/bin/" + $conn + " -i q.sql -o res.log"Тавре ки шумо фаҳмед, ин санҷиш аллакай аз версияи Unix аст.
Боркунии файлҳо
Дар версияи Windows, ҳама гуна амалиёт бо аудит ҳамроҳӣ мекард: мо sqlcmd-ро иҷро кардем, дар файли баромад ягон намуди сӯиистифода гирифтем, ин файлро ба лавҳаи аудит замима кардем. Хушбахтона, сервери SQL дар ҳамон сервере бо Ҷенкинс кор мекард, он чунин кор карда шуд:
CREATE procedure AuditUpload
@id int, @filename varchar(256)
as
set nocount on
declare @sql varchar(max)
CREATE TABLE #multi (filer NVARCHAR(MAX))
set @sql='BULK INSERT #multi FROM '''+@filename
+''' WITH (ROWTERMINATOR = '' '',CODEPAGE = ''ACP'')'
exec (@sql)
select @sql=filer from #multi
update JenkinsAudit set multiliner=@sql where ID=@id
returnҲамин тариқ, мо файли BCP-ро пурра фурӯ бурда, онро ба майдони nvarchar(max)-и ҷадвали аудит меандозем. Албатта, ин тамоми система пош хӯрд, зеро ба ҷои сервери SQL ман RDS гирифтам ва BULK INSERT аз сабаби кӯшиши гирифтани қулфи истисноӣ дар файл тамоман кор намекунад ва бо RDS ин умуман аз он маҳрум аст. худи ибтидо. Аз ин рӯ, ман қарор додам, ки тарҳи системаро тағир диҳам ва аудитро сатр ба сатр нигоҳ дорам:
CREATE TABLE AuditOut (
ID int NULL,
TextLine nvarchar(max) NULL,
n int IDENTITY(1,1) PRIMARY KEY
)Ва дар ин ҷадвал чунин нависед:
function WriteAudit([string]$Filename, [string]$ConnStr,
[string]$Tabname, [string]$Jobname)
{
# get $lastid of the last execution -- проскипано для статьи
#create grid and populate it with data from file
$audit = Get-Content $Filename
$DT = new-object Data.DataTable
$COL1 = new-object Data.DataColumn;
$COL1.ColumnName = "ID";
$COL1.DataType = [System.Type]::GetType("System.Int32")
$COL2 = new-object Data.DataColumn;
$COL2.ColumnName = "TextLine";
$COL2.DataType = [System.Type]::GetType("System.String")
$DT.Columns.Add($COL1)
$DT.Columns.Add($COL2)
foreach ($line in $audit)
{
$DR = $dt.NewRow()
$DR.Item("ID") = $lastid
$DR.Item("TextLine") = $line
$DT.Rows.Add($DR)
}
# write it to table
$conn=new-object System.Data.SqlClient.SQLConnection
$conn.ConnectionString = $ConnStr
$conn.Open()
$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $ConnStr
$bulkCopy.DestinationTableName = $Tabname
$bulkCopy.BatchSize = 50000
$bulkCopy.BulkCopyTimeout = 0
$bulkCopy.WriteToServer($DT)
$conn.Close()
}
Барои интихоби мундариҷа, шумо бояд аз рӯи ID интихоб кунед, бо тартиби n (шахсӣ).
Дар мақолаи навбатӣ ман дар бораи он, ки ин ҳама бо Ҷенкинс чӣ гуна муносибат мекунад, муфассалтар маълумот медиҳам.
Манбаъ: will.com
