á¤ááąáŹááşá¸ááŤá¸áááş áááşáá˝áąáˇááťááŻáśááťážááŹááźá áşááźáŽá¸ ááťá˝ááşáŻááşááááşá¸áááşá¸áá˝ááşááŹááşáááşá¸áĄáá˝ááş áááşáá˝ááşááŤáááşá
áĄáá˝ááş ááźááşáááşááąááŤáááşá Zero Touch PROD RDS (MS SQL) áĄáá˝ááş ááťá˝ááşáŻááşáááŻáˇáááŹá¸ááťáŹá¸ ááŻááşáážáŻááşáá˝áŹá¸áááˇáşáĄááźáąáŹááşá¸á ááťá˝ááşáŻááşáááş áĄáááŻáĄááťáąáŹááşá áá áşá áááşááąááźááťááş (POC - Proof Of Concept) - powershell scripts áĄá áŻáśááᯠááźáŻááŻááşáá˛áˇáááşá áááşáááşáážáŻáĄááźáŽá¸áá˝ááşá ááŻááşáááŻááşá¸áááşááźáŽá¸ ááźáŹáážááşááąáŹáááşááŻááşááśááťáŹá¸ ááŻáśá¸ááŤá¸áá˝áŹá¸áᏠáĄáááşáááźááşáááşááŻááşááśááťáŹá¸áĄááźá áşáááŻáˇ ááźáąáŹááşá¸áá˛áá˝áŹá¸ááąáŹáĄááŤá áááşá¸áááŻáˇá ááťá˝ááşáŻááşáĄáŹá¸ ááźáąáŹáá˛áˇáááş - á¤áĄááŹáĄáŹá¸ááŻáśá¸áááş ááąáŹááşá¸áá˝ááşááąáŹáşáááşá¸ áĄáá˝áąá¸áĄááąáŤáşáááŻááşá¸áááŻááşáᏠáĄááźáąáŹááşá¸ááźááťááşááťáŹá¸ááźáąáŹááˇáşááŹá ááťá˝ááşáŻááşáááŻáˇá Jenkins ááťá˝ááşááťáŹá¸áĄáŹá¸ááŻáśá¸ Linux áá˝ááş áĄááŻááşááŻááşááŤáááşá
ááŤá ááźá áşáááŻááşááŹá¸á Windows áĄáąáŹááşááž áá˝áąá¸áá˝áąá¸ááąáŹ DBA ááŽá¸áá˝ááşááᯠáá°á Linux áĄáąáŹááşáá˝ááş powershell á áĄáá°áážáááşáá˝ááş áááşááŹá¸ááŤáááŹá¸á á፠áááşá ááşááŹáááŻááşáá°á¸ááŹá¸á

ááŽááᯠáá°á¸áááşá¸áá˛áˇ áááşá¸áááŹáá˝áą ááąáŤááşá¸á
ááşáážáŻáážáŹ áááŻááˇáşáááŻááşááᯠáážá
áşááźážáŻááşáá˛áˇááááşá ááŻááşááŤáááşá ááťá˝ááşáŻááşá 30+ script ááťáŹá¸áĄáŹá¸ááŻáśá¸ áĄááŻááşáááŻááşááąáŹáˇááŤá áĄáśáˇááźáááŻáˇááąáŹááşá¸ááŹá áĄááŻááşáá
áşáááşáááşá¸áážáŹ áĄááŹáĄáŹá¸ááŻáśá¸ááᯠááźááşáááşáááŻááşáá˛áˇáááşá ááťá˝ááşááąáŹáş ááąáŹááşááť ááąá¸ááąááŤáááşá áááŻáˇááźáąáŹááˇáşá Windows ááž Linux áááŻáˇ powershell script ááťáŹá¸áááŻáá˝ážá˛ááźáąáŹááşá¸ááąáŹáĄááŤáá˝ááşáááşááźáŻáśáá˝áąáˇáááąáŹáĄáááşáĄáá˛ááťáŹá¸á
sqlcmd vs Invoke-SqlCmd
áá°áááŻáˇááźáŹá¸á áĄááá ááźáŹá¸ááŹá¸ááťááşááᯠáááááąá¸ááŤáá áąá ááąáŹááşá¸áá˝ááşá¸ áĄááŻáśá¸áááşáážáŻ sqlcmd áááşá¸áááş Linux áĄáąáŹááşáá˝ááşáááşá¸ áĄááŹá¸áá° ááŻááşááąáŹááşáááŻááşá á˝ááşá¸ááźááˇáş ááŻááşááąáŹááşáááşá -Qá input file ááᯠ-i áĄááźá áş áážááˇáş -o áĄááźá áş execute ááŻááşáááş query ááᯠááťá˝ááşáŻááşáááŻáˇ ááźááşáááşá¸ááŤáááşá áááŻáˇááąáŹáş áááŻááşáĄáááşááťáŹá¸ááᯠáĄááąá¸á áááşááźááˇáş ááźáŻááŻááşááŹá¸áááşá -i áááŻááŻáśá¸áááş áááŻááşáá˛áˇáĄááŻáśá¸áážáŹ ááąá¸ááŤá
GO
EXITáĄááŻáśá¸áá˝ááş EXIT ááážáááŤáá sqlcmd áááş input ááᯠá áąáŹááˇáşáááŻááşá¸áááş áááşáááşááŻááşááąáŹááşáááşááźá áşááźáŽá¸á áážááˇáş ááááŻááşáᎠááźá áşááŤáá áá˝ááşááąáŤááş á GOááŤáááŻáááş ááąáŹááşááŻáśá¸ command á áĄááŻááşáááŻááşááŤáá°á¸á áĄáá˝ááşáááŻááşáá˝ááş áĄáá˝ááşá áá˝áąá¸ááťááşáážáŻááťáŹá¸á áááşááąáˇááťáşááťáŹá¸á ááááˇáşááŻááşááźááşá¸ áĄá áážááááşáááŻáˇ ááŤáááşáááşá
Invoke-SqlCmd áááş DataSetá DataTables áááŻáˇáááŻááş DataRows áĄááźá áş ááááşááᯠááŻááşááŻááşáááşá áááŻáˇááźáąáŹááˇáşá áááşáááş áááŻá¸áážááşá¸ááąáŹáá˝áąá¸ááťááşáážáŻááááşááᯠááŻááşááąáŹááşáááşáááŻááŤáá áááşáááş áĄááŻáśá¸ááźáŻáááŻááşáááşá sqlcmdáááşá¸á output áááŻáá˝á˛ááźááşá¸á áááşááźáŹááźáŽá¸á áážáŻááşáá˝áąá¸ááąáŹáĄááŹáá áşááŻááŻáááŻááážááááşáááźá áşáááŻááşááąá Invoke-SqlCmd. ááŤááąáááˇáş ááŽáĄáá˝á˛áˇáážáŹáááşá¸ áá°áˇááŹááá˝áąáážááááşá
- áááŻááşáá áşáááŻááşááᯠáá°áááśáá˝ážá˛ááąá¸ááťážááş -InputFileáááŻáĄá፠áá˝ááşááąáŤááş ááááŻáĄááşáá˛á áááŻáˇáĄááźááşá áááşá¸áááş syntax error áááŻááźá áşááąáŤáşá áąáááşá
- -OutputFile áááŻááşáá°á¸á áĄááááˇáşá áááˇáşááááşááᯠáĄááŹááášááŻáá áşááŻáĄááąáá˛áˇ ááźááşááąá¸áááşá
- ááŹááŹáá áşááŻáááşáážááşááźááşá¸áĄáá˝ááş syntax áážá áşááŻáážááááşá -ServerInstance -Username -Password -Database áážááááˇáş -ConnectionString. áá°á¸áááşá¸áááşáážáŹ áááááá ášá áá˝ááş 1433 áážáá˝á˛á áĄááźáŹá¸ port áá áşááŻááᯠáááşáážááşáááş áááźá áşáááŻááşááŤá
- á áŹááŹá¸áĄáá˝ááşáĄáŹá¸á áááŻá¸áážááşá¸á á˝áŹ âáááşá¸â áááˇáş 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 $cmdSQL script áá˝ááş ááťá˝ááşáŻááşáááŻáˇáááş áĄá áŹá¸áááŻá¸áážáŻááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻáááş-
set @spid=$(spid)
set @age=$(age)ááŽááąáŹáˇ ááŽáážáŹá *nix áá˝ááş ááźáąáŹááşá¸áá˛áááŻááşááąáŹ áĄá áŹá¸áááŻá¸áážáŻááťáŹá¸ áĄááŻááşáááŻááşááŤá. áááˇáşáááşááťááş -v ááťá áşááťá°áážáŻááŹá¸áááşá U Invoke-SqlCmd ááťá áşááťá°áážáŻááŹá¸áááşá -ááááşá¸áážááşááťáŹá¸. ááááşá¸áážááşááťáŹá¸áááŻááşáááŻááşáááşáážááşááąá¸áááˇáş áááˇáşáááşááąáŹááşááᯠááťá áşááťá°áážáŻááŹá¸ááąáŹáşáááşá¸ áĄá áŹá¸áááŻá¸áážáŻááťáŹá¸áááş áááşá¸áááŻáˇáááŻááşáááŻááşáĄááŻááşááŻááşáááşâáááş Shell ááž áááşáááˇáş variable ááťáŹá¸áááŻáááᯠáĄááŻáśá¸ááźáŻáááŻááşáááşá áááŻáˇááąáŹáşáááşá¸á ááťá˝ááşáŻááşáááş ááááşá¸áážááşááťáŹá¸ááźáąáŹááˇáş á áááşáĄáážáąáŹááˇáşáĄáážááşááźá áşáá˛áˇááźáŽá¸ áááşá¸áááŻáˇáĄááąáŤáş ááŻáśá¸ááážáŽáááŻáááąáááş ááŻáśá¸ááźááşáá˛áˇááźáŽá¸ SQL script ááťáŹá¸áááş áááŻááąáŹááşá¸ááąáŹááźáąáŹááˇáşá ááźááşá¸áááşá¸á á˝áŹáážááˇáş áážáąá¸áŚá¸á á˝áŹ ááźáŻáá°áá˛áˇáááş-
# 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 ááᯠrun ááźáŽá¸ output file áá˝ááş áĄáá˝á˛ááŻáśá¸á áŹá¸áážáŻáĄááťááŻáˇááᯠáááşááśááážáááźáŽá¸ á¤áááŻááşááᯠá áŹáááşá¸á á áşáááşá¸áááşáá˝ááş áá˝á˛ááŹá¸áááşá ááśááąáŹááşá¸ááąáŹááşáá á˝áŹá SQL ááŹááŹáááş Jenkins áá˛áˇáááŻáˇáá°ááŽááąáŹááŹááŹáá˝ááşáĄááŻááşááŻááşáááşá áááşá¸áááşá¤áá˛áˇáááŻáˇááąáŹááŻááşááąáŹááşáá˛áˇáááş-
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 server áĄá áŹá¸ RDS áááŻááá˛áˇááźáŽá¸ BULK INSERT áᏠáááŻááşáá áşááŻááąáŤáşáážáŹ ááŽá¸áááˇáşááąáŹáˇáááşáááŻáˇááźááŻá¸á áŹá¸áážáŻááźáąáŹááˇáş UNC ááá áşáááˇáş ááŻáśá¸ááĄááŻááşáááŻááşááŹááźáąáŹááˇáşá 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 (identity) ááᯠáá˝áąá¸ááťááşáááş áááŻáĄááşáááşá
ááąáŹááşááąáŹááşá¸ááŤá¸áá˝ááşá á¤áĄááŹáĄáŹá¸ááŻáśá¸áááş Jenkins áážááˇáş áááşáááŻáˇáááşááŻáśááŻáśáˇááźááşááŻáśáĄááźáąáŹááşá¸ áĄááąá¸á
áááşááᯠááťá˝ááşáŻááşááźáąáŹááŤáááşá
source: www.habr.com
