Mahi tahi me MS SQL mai i Powershell i runga i te Linux
He tino mahi tenei tuhinga, he mea whakatapua ki taku korero pouri
Te whakarite mo Kore Touch PROD mo te RDS (MS SQL), e haruru ana o matou taringa katoa, i hanga e au he whakaaturanga (POC - Tohu O te Ariā) o te aunoatanga: he huinga tuhinga hiko. I muri i te whakaaturanga, i te wa i mate ai te ngaru, te pakipaki roa, ka huri ki te pakipaki mau tonu, ka kii mai ratou ki ahau - he pai katoa, engari mo nga take whakaaro anake, kei te mahi a tatou pononga Jenkins katoa i runga i te Linux!
Ka taea tenei? Tangohia he DBA mahana, rama mai i raro i te Matapihi ka mau ki roto i te wera o te powershell i raro i te Linux? Ehara tenei i te nanakia?
Me ruku au ki tenei huinga hangarau rerekee. Ae ra, ka mutu aku tuhinga 30+ katoa i te mahi. Ki taku ohorere, i kaha ahau ki te whakatika i nga mea katoa i te ra mahi kotahi. Kei te tuhi ahau i roto i te whai wera. Na, he aha nga raru ka pa ki a koe i te wa e whakawhiti ana i nga tuhinga hiko mai i Windows ki Linux?
sqlcmd vs Invoke-SqlCmd
Kia whakamahara ahau ki a koe mo te rereketanga nui i waenga i a raatau. He pai nga taputapu tawhito sqlcmd Ka mahi ano i raro i te Linux, he rite tonu te mahi. Ka tukuna e matou te patai ki te mahi -Q, te konae whakauru hei -i, me te putanga hei -o. Engari ko nga ingoa o nga konae, ko te tikanga, he take-tairongo. Mena ka whakamahi koe -i, ka tuhia ki te konae i te mutunga:
GO
EXIT
Mena karekau he PUTA i te mutunga, ka haere tonu a sqlcmd ki te tatari mo te whakaurunga, a mena i mua Waiho kaore GO, ka kore te whakahau whakamutunga e mahi. Kei roto i te konae putanga nga putanga katoa, nga kowhiringa, nga karere, te ta, me era atu.
Invoke-SqlCmd ka whakaputa i te hua hei Raraunga Raraunga, Ripanga Raraunga, RaraungaRaraunga ranei. Na reira, ki te tukatuka koe i te hua o te kowhiringa ngawari, ka taea e koe te whakamahi sqlcmd, ka tohatohahia tana whakaputanga, kaore e taea te whakaputa i tetahi mea uaua: mo tenei kei reira Tonoa-SqlCmd. Engari he kata ano ta tenei kapa:
Mena ka whakawhiti koe i tetahi konae ki a ia ma te -Kōnae Whakauru, ka Waiho e kore e hiahiatia, i tua atu, ka puta he hapa wetereo
-Kōnae Huaputa kāo, ka whakahokia e te whakahau te hua hei ahanoa
E rua nga wetereo mo te tautuhi i te tūmau: -ServerInstance -Ingoa Kaiwhakamahi -Kupuhipa -Patengi Raraunga a puta noa -Kua Hononga. He mea whakamiharo, i te keehi tuatahi kaore e taea te tohu i tetahi tauranga i tua atu i te 1433.
putanga kuputuhi, momo TAIA, ka "hopu" noa sqlcmdmo Tonoa-SqlCmdhe raruraru
sqlcmd he whakakapinga rereke ma te whakamahi -v, hei tauira penei:
# $conn содержит начало команды sqlcmd
$cmd = $conn + " -i D:appsSlaveJobsKillSpid.sql -o killspid.res
-v spid =`"" + $spid + "`" -v age =`"" + $age + "`""
Invoke-Expression $cmd
I roto i te tuhinga SQL ka whakamahia e matou nga whakakapinga:
set @spid=$(spid)
set @age=$(age)
Na konei ko tenei. Kei *nix kare e mahi nga whakakapinga taurangi. Tawhā -v kare i arohia. U Tonoa-SqlCmd kare i arohia -Taupee. Ahakoa ka warewarehia te tawhā e tohu ana i nga taurangi ake, ka mahi tonu nga whakakapinga—ka taea e koe te whakamahi i nga taurangi mai i Shell. Heoi, i whakaparahako ahau ki nga taurangi me te whakatau kia kaua e ti'aturi ki runga i a raatau, me te mahi poauau me te ahua o mua, na te mea he poto nga tuhinga SQL:
Ko tenei, e mohio ana koe, he whakamatautau mai i te putanga Unix.
Tukuake kōnae
I roto i te putanga Windows, ko tetahi mahi i haere tahi me te arotake: i whakahaerehia e matou te sqlcmd, i whiwhi i etahi momo mahi kino i roto i te konae whakaputa, i piri tenei konae ki te pereti arotake. Waimarie, i mahi te tūmau SQL i runga i te tūmau rite ki a Jenkins, he penei te mahi:
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
No reira, ka horomia katoatia te konae BCP ka panaia ki te mara nvarchar(max) o te ripanga kaute. Ae ra, kua pakaru katoa tenei punaha, na te mea he tūmau SQL ka whiwhi ahau i te RDS, karekau te BULK INSERT e mahi ma te UNC na te ngana ki te tango raka motuhake i runga i tetahi konae, me te RDS ka mate tenei. te timatanga rawa. Na ka whakatau ahau ki te whakarereke i te hoahoa punaha, te penapena i te rarangi kaute ma te raina:
CREATE TABLE AuditOut (
ID int NULL,
TextLine nvarchar(max) NULL,
n int IDENTITY(1,1) PRIMARY KEY
)
A ka tuhi ki tenei ripanga penei:
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()
}
Hei kowhiri i nga ihirangi, me kowhiri e koe ma te ID, te whiriwhiri i te raupapa n (tuakiri).
I roto i te tuhinga e whai ake nei ka haere ahau ki nga korero mo te pehea o enei mea katoa ki a Jenkins.