рд╡рд┐рдХрд╛рд╕ / рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП DB рдХреНрд▓реЛрдирд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк

рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреИрд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдПрдХ рдмреИрдХрдЕрдк рд╕реЗ рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг)ред рд╡рд┐рдзрд┐ рд╕рдордп рдФрд░ рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рд╕реНрдерд┐рддрд┐: рдПрдХ рдореЛрдЯреА рдбреЗрдЯрд╛рдмреЗрд╕ (рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рд╕реМ рдЬреАрдмреА) рд╣реИред рдореИрдВ рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдФрд░ рдЙрд╕ рдкрд░ рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдбрд┐рд╕реНрдХ рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП MSSQL рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдореИрдВ рдПрдХ Redgate SQL рдХреНрд▓реЛрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднрд░ рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рд╕рд╛рдЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ: рд╡рд░реНрдЪреБрдЕрд▓ рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ред рдпрд╣ рд░реВрд╕реА рдореЗрдВ рдПрдХ "рдЕрдВрддрд░ рдЖрднрд╛рд╕реА рдбрд┐рд╕реНрдХ" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдбрд┐рд╕реНрдХ рдЬрд┐рд╕ рдкрд░ рдХреЗрд╡рд▓ "рдореВрд▓" рдбрд┐рд╕реНрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдВрддрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред

рдХрдЯ рдХреЗ рддрд╣рдд рд╡рд┐рд╡рд░рдг

рдХрд╛рд░реНрдп рдХреА рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  1. рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╕реНрдХ рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдмрд╛рдж рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдмрди рдЬрд╛рдПрдЧрд╛)ред
  2. рд╣рдо рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХреНрд▓реЛрди рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рдо рдкреНрд░реЛ-рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╕реНрдХ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд░рдЦрддреЗ рд╣реИрдВред
  3. рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рд╣рдордиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╕реНрдХ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИред
  4. рдПрдХ рдЕрд▓рдЧ рдбрд┐рд╕реНрдХ рдмрдирд╛рдПрдБред рд╣рдо рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдбрд┐рд╕реНрдХ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ sql рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред
  5. рдЬрдм рддрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдПрдХ рд╕рд╛рдордВрдЬрд╕реНрдпрдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА рд╣реИ рддрдм рддрдХ рдЪрд░рдг 4 рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред

рдореВрд▓ рдбрд┐рд╕реНрдХ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рд╕реНрдХ рдкреНрд░рдмрдВрдзрди рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рдпрд╛ Google рдХрдорд╛рдВрдб рдФрд░ рд▓реЗрдЦ рдореЗрдВ рджреА рдЧрдИ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред

рдиреЛрдЯ рд╕рдордп:

рд╡рд┐рдВрдбреЛрдЬрд╝ 10 рдФрд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рд░реНрд╡рд░ 2016 рдореЗрдВ рдкрд╛рд╡рд░рд╢реЗрд▓ рдХрдорд╛рдВрдбрд▓реЗрдЯ рдиреНрдпреВ-рд╡реАрдПрдЪрдбреА рд╣реИ ред рд╕рд░реНрд╡рд░ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рд╕реНрдХрдкрд╛рд░реНрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдкреБрдЯ рдкрд░, рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИред

рдиреЛрдЯ рджреЛ:

рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рд╕реНрдХ рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИ: рд░рд┐рдХреЙрд░реНрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╕реНрдХ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдШрд░ рдореЗрдВ рдореМрдЬреВрдж рдЕрдВрддрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ - рдЬреИрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рджрд░реНрд╢рди рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрдХрд┐рдЯ рдкрд░ рдпрд╣ рд╡реИрд╕реЗ рднреА рдкрд╣рд▓рд╛ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реИ)ред рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдорд╛рдкрддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдЦрдиреЗ / рдкрдврд╝рдиреЗ рдХреА рдЧрддрд┐ рдХрд┐рддрдиреА рдХрдо рд╣реИред

рдиреЛрдЯ рддреАрди:

рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рдереЗ рдФрд░ рдХреЗрд╡рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИрдВ, MSSQL рдХреЗ рд▓рд┐рдП рд╡рдХреНрд░рддрд╛ рдФрд░ рддрдВрдЧ рдмрдВрдзрди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред

рд╣рдо рдХреБрдЫ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗ:
$server = "server"; $db_file_name = "db_file_name"; $root_path = "path to folder with disks"; $cred = try { Get-StoredCredential -Target "$server\Administrator"; } catch { Get-Credential -Message "server windows user" -UserName "$server\Administrator" } $db_cred = $(try { Get-StoredCredential -Target "$server\sa"; } catch { Get-Credential -Message "sql server user" -UserName "sa" }).GetNetworkCredential(); $session = New-PSSession -ComputerName $server -Credential $cred; 


рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбреЗрд╡рд▓рдкрд░ рдХреА рдорд╢реАрди рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ sql рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдорд╢реАрди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рд╡рд░рд╢реЗрд▓ рд░реАрдореЛрдЯрд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рдЦреБрд▓реЗ рд╕рддреНрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Get-StoredCredential рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди (рдЕрд▓рдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд) рдкрд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдбрд▓реЗрдЯ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рд╕реНрдХрдкрд╛рд░реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛрдб рд╣реИ:
 function run_script([string]$script, [bool]$suppress_output = $false) { $result = Invoke-Command -Session $session -ArgumentList $script -ScriptBlock { param($script) $script.Split("`r`n") | % { Write-Host $_.Trim() }; Out-File -FilePath "tmp" -InputObject $script -Encoding ascii return diskpart /s "tmp" } if($suppress_output) { return $result; } else { $result | ? { !$_.Contains("Microsoft") -and $_ -ne "" } | Write-Host } } 


Sql рдХрдорд╛рдВрдб рдореИрдВ SQLCMD рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
 function run_sql([string]$sql) { Write-Host $sql SQLCMD -S $server -d master -U $($db_cred.UserName) -P $($db_cred.Password) -Q $sql } 


рднрд┐рдиреНрди рдбрд┐рд╕реНрдХ рдмрдирд╛рдирд╛:
  run_script "create vdisk file=`"$root_path\$name.vhdx`" parent=`"$root_path\parent_disk.vhdx`"" 


рдЗрд╕рдХреЗ рдмрд╛рдж рдбрд┐рд╕реНрдХ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
  $disk_letter = Invoke-Command -Session $session -ScriptBlock { ls function:[dz]: -n | ?{ !(test-path $_) } | select -Last 1; } $volumes = run_script "list volume" $true $disks = run_script "list disk" $true $script = " sel vdisk file=`"$current_path\$db_name.vhdx`" attach vdisk"; run_script $script; $disks_after = run_script "list disk" $true $new_disk = $($disks_after | ? { $_ -notin $disks } ) Write-Host $new_disk $new_disk -match "\d+" $diskId = $Matches[0] $script = " select disk $diskId online disk"; run_script $script $volumes_after = run_script "list volume" $true # get added disk $new_volume = $($volumes_after | ? { $_ -notin $volumes } ) Write-Host $new_volume $new_volume -match "\d+" $volumeId = $Matches[0] $script = " select volume $volumeId assign letter=$disk_letter"; run_script $script run_script "list volume"; run_script "list vdisk"; $atach_script = "CREATE DATABASE $db_name ON (FILENAME = '$disk_letter\$db_file_name.mdf'),(FILENAME = '$disk_letter\$db_file_name.ldf') FOR ATTACH"; run_sql "$atach_script" 


"Ls рдлрд╝рдВрдХреНрд╢рди: [dz]: -n" рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдбреНрд░рд╛рдЗрд╡ рд▓реЗрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЬрд╛рджреВ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╕рдмрд╕реЗ рдмрдбрд╝реА рдХрдард┐рдирд╛рдИ рдкрд░рд┐рдгрд╛рдореА рдЖрднрд╛рд╕реА рдбрд┐рд╕реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреНрд░ рдкрд░ рд░рдЦрдирд╛ рд╣реИред рдЙрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдСрдирд▓рд╛рдЗрди рдХрд░рдиреЗ рдХреА рднреА рдЬрд░реВрд░рдд рд╣реИред

рдбреНрд░рд╛рдЗрд╡ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИ:
  run_sql " ALTER DATABASE $name SET OFFLINE WITH ROLLBACK IMMEDIATE GO sp_detach_db $name"; $script = "select vdisk file=`"$root_path\$name.vhdx`" detach vdisk "; run_script $script 


рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛:
 param( [ValidateSet("detach_all", "attach_all_available", "create_new", "attach_db", "detach_db", "remove_file")][Parameter(mandatory=$true)][string] $mode, [string] $name ) function run_sql([string]$sql) { Write-Host $sql SQLCMD -S $server -d master -U $($db_cred.UserName) -P $($db_cred.Password) -Q $sql } function run_script([string]$script, [bool]$suppress_output = $false) { $result = Invoke-Command -Session $session -ArgumentList $script -ScriptBlock { param($script) $script.Split("`r`n") | % { Write-Host $_.Trim() }; Out-File -FilePath "tmp" -InputObject $script -Encoding ascii return diskpart /s "tmp" } if($suppress_output) { return $result; } else { $result | ? { !$_.Contains("Microsoft") -and $_ -ne "" } | Write-Host } } function attach_disk([string]$db_name, [string]$current_path) { $disk_letter = Invoke-Command -Session $session -ScriptBlock { ls function:[dz]: -n | ?{ !(test-path $_) } | select -Last 1; } $volumes = run_script "list volume" $true $disks = run_script "list disk" $true $script = " sel vdisk file=`"$current_path\$db_name.vhdx`" attach vdisk"; run_script $script; $disks_after = run_script "list disk" $true $new_disk = $($disks_after | ? { $_ -notin $disks } ) Write-Host $new_disk $new_disk -match "\d+" $diskId = $Matches[0] $script = " select disk $diskId online disk"; run_script $script $volumes_after = run_script "list volume" $true # get added disk $new_volume = $($volumes_after | ? { $_ -notin $volumes } ) Write-Host $new_volume $new_volume -match "\d+" $volumeId = $Matches[0] $script = " select volume $volumeId assign letter=$disk_letter"; run_script $script run_script "list volume"; run_script "list vdisk"; $atach_script = "CREATE DATABASE $db_name ON (FILENAME = '$disk_letter\$db_file_name.mdf'),(FILENAME = '$disk_letter\$db_file_name.ldf') FOR ATTACH"; run_sql "$atach_script" } $server = "server"; $db_file_name = "db_file_name"; $cred = try { Get-StoredCredential -Target "$server\Administrator"; } catch { Get-Credential -Message "server windows user" -UserName "$server\Administrator" } $db_cred = $(try { Get-StoredCredential -Target "$server\sa"; } catch { Get-Credential -Message "sql server user" -UserName "sa" }).GetNetworkCredential(); $session = New-PSSession -ComputerName $server -Credential $cred; $root_path = "path to folder with disks"; $files = Invoke-Command -Session $session -ArgumentList $root_path -ScriptBlock { param($root_path) Get-ChildItem -Filter "*.vhdx" -Path $root_path } switch ($mode) { "detach_all" { $files ` | % { Write-Host $("*"*40) `r`n $_.FullName `r`n; $_ } ` | % { " ALTER DATABASE $($_.Name.Replace('.vhdx', '')) SET OFFLINE WITH ROLLBACK IMMEDIATE GO sp_detach_db $($_.Name.Replace('.vhdx', ''))" } ` | % { run_sql "$_" } $files ` | % { Write-Host $("*"*40) `r`n $_.FullName `r`n; $_ } ` | % { run_script "select vdisk file=`"$($_.FullName)`" detach vdisk " } break; } "attach_all_available" { $files | % { $_.Name.Replace('.vhdx', '') } | ? { $_ -ne "parent_disk" } | % { attach_disk $_ $root_path } break; } "attach_db" { attach_disk $name $root_path break; } "detach_db" { run_sql " ALTER DATABASE $name SET OFFLINE WITH ROLLBACK IMMEDIATE GO sp_detach_db $name"; $script = "select vdisk file=`"$root_path\$name.vhdx`" detach vdisk "; run_script $script break; } "create_new" { $script = "create vdisk file=`"$root_path\$name.vhdx`" parent=`"$root_path\parent_disk.vhdx`"" run_script $script attach_disk $name $root_path; break; } "remove_file" { Invoke-Command -Session $session -ArgumentList $name,$root_path -ScriptBlock { param($name, $root_path) Remove-Item -Path "$root_path\$name.vhdx" } } } Remove-PSSession $session 


рдЕрдЪрддреБрдВрдЧ рд╕рдордп:

рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ sql рд╕рд░реНрд╡рд░ рдХреЛ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдЪрддреБрдВрдЧ рджреЛ:

рд▓реЗрдЦрдХ, рдмреЗрд╢рдХ, рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрдХрд┐рдЯ рдкрд░ рдЖрджреЗрд╢реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди) рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░ред

рдХреБрд▓:

рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рд╕реНрдХ рдкрд░ 40 рдПрдордмреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛:

рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

Source: https://habr.com/ru/post/hi440804/


All Articles