ืืืืจ ืื ืืื ืคืจืงืื ืืืื ืืืืงืืฉ ืืกืืคืืจ ืืขืฆืื ืฉืื
ืืชืืื ื ื Zero Touch PROD ืขืืืจ RDS (MS SQL), ืฉืืืืื ืื ืืืืื ืืื ืืืืืื, ืืื ืชื ืืฆืืช (POC - Proof Of Concept) ืฉื ืืืืืืฆืื: ืกื ืฉื ืกืงืจืืคืืื ืฉื Powershell. ืืืืจ ืืืฆืืช, ืืฉืืืืืืช ืืืคืืื ืืกืืขืจืืช ืืืืืืฉืืืช ืืขืื, ืืืคืื ืืืืืืืช ืืคืืื ืืืชื ืคืืกืงืืช, ืืืจื ืื - ืื ืื ืืื, ืืื ืจืง ืืกืืืืช ืืืืืืืืืืืืช, ืื ืขืืื ืื'ื ืงืื ืก ืฉืื ื ืขืืืืื ืขื ืืื ืืงืก!
ืืื ืื ืืคืฉืจื? ืืงืืช DBA ืื ืื ืื ืืื ืืจื ืืชืืช ื-Windows ืืืืืืืง ืืืชื ืืืื ืฉื Powershell ืชืืช ืืื ืืงืก? ืื ืื ืืืืจื?
ืืืืชื ืฆืจืื ืืฉืงืืข ืืฉืืืื ืืืืืจ ืืื ืฉื ืืื ืืืืืืืช. ืืืืื, ืื 30+ ืืกืงืจืืคืืื ืฉืื ืืคืกืืงื ืืขืืื. ืืืคืชืขืชื, ืืฆืืืชื ืืชืงื ืืื ืืืื ืขืืืื ืืื. ืื ื ืืืชื ืืืจืืฃ ืืืื. ืื ืืืืื ืืืืืืืช ืืชื ืืืื ืืืืชืงื ืืขืช ืืขืืจืช ืกืงืจืืคืืื ืฉื Powershell ื-Windows ืืืื ืืงืก?
sqlcmd ืืขืืืช Invoke-SqlCmd
ืืจืฉื ืื ืืืืืืจ ืืื ืืช ืืืืื ืืขืืงืจื ืืื ืืื. ืฉืืจืืช ืืฉื ืืืื sqlcmd ืื ืขืืื ืื ืชืืช ืืื ืืงืก, ืขื ืคืื ืงืฆืืื ืืืืช ืืืขื ืืื. ืื ื ืืขืืืจืื ืืช ืืฉืืืืชื ืืืืฆืืข -Q, ืงืืืฅ ืืงืื ื-i, ืืืคืื ื-o. ืืื ืฉืืืช ืืงืืฆืื, ืืืืื, ื ืขืฉืื ืชืืืื-ืจืืฉืืืช. ืื ืืชื ืืฉืชืืฉ ื-i, ืื ืืงืืืฅ ืืชืื ืืกืืฃ:
GO
EXIT
ืื ืืื EXIT ืืกืืฃ, ืื sqlcmd ืืืฉืื ืืืืชืื ืืงืื, ืืื ืืคื ื ืึฐืฆึดืืึธื ืื GO, ืื ืืคืงืืื ืืืืจืื ื ืื ืชืขืืื. ืงืืืฅ ืืคืื ืืืื ืืช ืื ืืคืื, ืืืืืจืืช, ืืืืืขืืช, ืืืืคืกื ืืื'.
Invoke-SqlCmd ืืืืฆืจ ืืช ืืชืืฆืื ื-DataSet, DataTables ืื DataRows. ืืื, ืื ืืชื ืืขืื ืืช ืืชืืฆืื ืฉื ืืืืจื ืคืฉืืื, ืืชื ืืืื ืืืฉืชืืฉ sqlcmd, ืืืืจ ืฉื ืืชื ืืช ืืคืื ืฉืื, ืื ืืืขื ืืืชื ืืคืฉืจื ืืืืืจ ืืฉืื ืืืจืื: ืืฉืืื ืื ืืฉ Invoke-SqlCmd. ืืื ืืฆืืืช ืืื ืืฉ ืื ืืืืืืช ืืฉืื:
- ืื ืชืขืืืจ ืื ืงืืืฅ ืืืืฆืขืืช -InputFile, ืื ืึฐืฆึดืืึธื ืืื ืฆืืจื, ืืชืจ ืขื ืื, ืืื ืืืืฆืจ ืฉืืืืช ืชืืืืจ
- -ืงืืืฅ ืคืื ืื, ืืคืงืืื ืืืืืจื ืื ืืช ืืชืืฆืื ืืืืืืืงื
- ืืฉื ื ืฉื ื ืชืืืืจืื ืืฆืืื ืฉืจืช: -ServerInstance - ืฉื ืืฉืชืืฉ - ืกืืกืื - ืืกื ื ืชืื ืื ืืืจื -ืืืจืืืช ืืืืืจ. ืืืืคื ืืืืจ, ืืืงืจื ืืจืืฉืื ืื ื ืืชื ืืฆืืื ืืฆืืื ืืืจืช ืืืฉืจ 1433.
- ืคืื ืืงืกื, ืืงืื PRINT, ืฉืคืฉืื "ื ืชืคืก" sqlcmdืขืืืจ Invoke-SqlCmd
ืืืืื ืืขืื - ืืืื ืืฉืื:
ืกืืืจ ืืื ืื ืฉืืื ืืืื ืืงืก ืฉืื ืืช ื-cmdlet ืืื!
ืืื ืืืขืื ืืขืืงืจืืช. ืจืง ืืืจืฅ ื-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 ืืชืขืืื. U 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"
ืื, ืืคื ืฉืืชื ืืืื, ืืืื ืืืจ ืืืจืกืช ืืื ืืงืก.
ืืขืื ืงืืฆืื
ืืืจืกืช 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 ืื ืขืืื ืืืื ืืจื 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()
}
ืืื ืืืืืจ ืชืืื, ืขืืื ืืืืืจ ืืคื ืืืื, ืืืืจื ืืกืืจ n (ืืืืช).
ืืืืืจ ืืื ืืคืจื ืืืชืจ ืขื ืืืืคื ืฉืื ืื ืื ืืชืงืฉืจ ืขื ื'ื ืงืื ืก.
ืืงืืจ: www.habr.com