내보내기(0) 인쇄
모두 확장

자습서: 하이브리드 IT에서 재해 복구를 위한 로그 전달

업데이트 날짜: 2014년 4월

이 자습서에서는 하이브리드 IT 환경에서 종단 간 SQL Server 로그 전달을 구현하는 방법을 보여 줍니다. 자습서의 마지막에서는 SQL Server AlwaysOn 솔루션이 다음 요소로 구성됩니다.

  • 프런트 엔드 및 백 엔드 서브넷을 비롯한 여러 서브넷을 포함하는 가상 네트워크

  • 온-프레미스 네트워크의 VPN 장치 뒤에서 실행되는 하나의 SQL Server 컴퓨터 및 하나의 도메인 컨트롤러

  • Azure VPN 장치와 온-프레미스 VPN 장치 사이의 사이트 간 VPN 연결

  • Azure의 백 엔드 서브넷에 배포되고 온-프레미스 AD 도메인에 조인된 SQL Server VM

  • 주 데이터베이스 서버로 구성된 온-프레미스 SQL Server 컴퓨터

  • 보조 데이터베이스 서버로 구성된 Azure의 SQL Server VM

이 자습서에는 더미 가상 네트워크(10.0.0.0/24) 및 더미 Active Directory 도메인(corp.contoso.com)을 온-프레미스로 설정하는 방법을 포함하여 솔루션 종단 간을 설정하는 방법에 대한 지침이 포함되어 있습니다. 기존 온-프레미스 네트워크 및 Active Directory를 사용하려면 관련 섹션을 건너뛰고 Create VPN Connection to Azure and SQL Server VM in Azure로 이동하십시오. 그러나 이후 단계가 기존 온-프레미스 구성의 사용자 지정 사양과 함께 작동할지는 확실하지 않습니다.

이 자습서는 각 단계의 세부 사항까지 설명하지 않고 위에 설명된 솔루션을 설정하는 데 필요한 단계를 보여 주기 위한 것입니다. 따라서 이 자습서는 GUI 구성 단계를 보여주지 않고 PowerShell 스크립팅을 사용하여 각 단계를 신속하게 안내합니다. 자습서에서는 다음과 같이 가정합니다.

  • 이미 가상 컴퓨터 구독이 있는 Azure 계정을 가지고 있습니다.

  • 온-프레미스 네트워크의 가장자리에 공용 IP 주소를 가진 지원되는 VPN 장치가 있습니다. 자세한 내용은 가상 네트워크용 VPN 장치 정보를 참조하십시오.

  • Azure PowerShell cmdlet을 설치했습니다.

  • GUI를 사용하여 가상 컴퓨터 갤러리에서 SQL Server VM을 프로비전하는 방법을 이미 알고 있습니다. 자세한 내용은 Azure에서 SQL Server 가상 컴퓨터 프로비전을 참조하십시오.

  • 온-프레미스 솔루션에 대한 로그 전달을 구성하는 방법을 이미 알고 있습니다. 자세한 내용은 로그 전달 정보(SQL Server)를 참조하십시오.

  • 간단하게 하기 위해 자습서 전체에서 사용되는 동일 암호는 Contoso!000입니다.

  1. 도메인 컨트롤러 및 DHCP 서버로 사용할 온-프레미스 컴퓨터에 Windows Server 2008 R2를 설치합니다.

  2. 인터넷에 컴퓨터를 연결하고 모든 업데이트를 설치합니다.

  3. 인터넷과 컴퓨터 연결을 끊고 VPN 장치와 동일한 서브넷에 컴퓨터를 연결합니다.

  4. 관리자 모드에서 Windows PowerShell 창을 엽니다.

  5. 이 컴퓨터를 구성하는 데 사용할 다음 PowerShell 변수를 정의합니다.

    $dcName = "DC1"
    $dcIP = "10.0.0.1"
    $subnetMask = "255.255.255.0"
    $gatewayIP = "10.0.0.2"
    $password = "Contoso!000"
    
    
  6. 컴퓨터의 도메인 컨트롤러에 대한 IP 주소를 10.0.0.1로 구성합니다(서브넷 마스크: 255.255.255.0, 게이트웨이 IP 주소: 10.0.0.2).

    netsh interface ip set address name="Local Area Connection" static $dcIP $subnetMask $gatewayIP 1
    
  7. 컴퓨터 이름을 DC1으로 바꿉니다.

    netdom renamecomputer $ENV:COMPUTERNAME /newname:$dcName /usero:Administrator /passwordo:$password /force /reboot
    
  8. 컴퓨터가 다시 시작되면 다시 로그인하고 이 컴퓨터를 도메인 컨트롤러로 구성하는 데 사용할 다음 PowerShell 변수를 정의합니다.

    $domainSuffix = "corp.contoso.com"
    $domainNetBIOS = "CORP"
    $password = "Contoso!000"
    
    
  9. DCPROMO.EXE를 실행하여 새 도메인 포리스트에 corp.contoso.com이라는 Active Directory 도메인을 만듭니다.

    dcpromo.exe `
        /unattend `
        /ReplicaOrNewDomain:Domain `
        /NewDomain:Forest `
        /NewDomainDNSName:$domainSuffix `
        /ForestLevel:4 `
        /DomainNetbiosName:$domainNetBIOS `
        /DomainLevel:4 `
        /InstallDNS:Yes `
        /ConfirmGc:Yes `
        /CreateDNSDelegation:No `
        /SafeModeAdminPassword:"$password" 
    

    컴퓨터가 다시 시작되면 컴퓨터는 새로 만든 corp.contoso.com 도메인의 도메인 컨트롤러가 됩니다.

  10. 암호가 Contoso!000인 CORP\Administrator으로 도메인 컨트롤러에 로그인합니다. 자습서의 나머지 부분에서도 이 암호를 동일하게 사용합니다.

  11. 관리자 모드에서 Windows PowerShell 창을 엽니다.

  12. 도메인을 구성하는 데 도움이 되도록 다음 PowerShell 변수를 정의합니다.

    $dcName = "DC1"
    $dcIP = "10.0.0.1"
    $gatewayIP = "10.0.0.2"
    $scopeIP = "10.0.0.0"
    $scopeName = "Corpnet"
    $scopeStart = "10.0.0.100"
    $scopeEnd = "10.0.0.150"
    $domainSuffix = "corp.contoso.com"
    $pwd = ConvertTo-SecureString "Contoso!000" -AsPlainText -Force
    
  13. Active Directory PowerShell 모듈을 가져오고 여러 사용자를 만듭니다.

    Import-Module ActiveDirectory
    
    New-ADUser -Name 'Install' -AccountPassword $pwd -PasswordNeverExpires $true -ChangePasswordAtLogon $false -Enabled $true
    New-ADUser -Name 'SQLAgent1' -AccountPassword $pwd -PasswordNeverExpires $true -ChangePasswordAtLogon $false -Enabled $true
    New-ADUser -Name 'SQLAgent2' -AccountPassword $pwd -PasswordNeverExpires $true -ChangePasswordAtLogon $false -Enabled $true
    

    CORP\SQLAgent1CORP\SQLAgent2는 두 SQL Server 인스턴스 서버에서 실행되는 SQL Server 에이전트 서비스에 대한 서비스 계정으로 사용됩니다.

  14. 개인 서브넷의 새 범위를 가진 DHCP 서비스를 구성합니다. 게이트웨이 IP 주소는 10.0.0.2로 설정되어 있으며 이 주소는 온-프레미스 VPN 장치에서 사용하도록 구성할 주소입니다.

    Import-Module ServerManager
    Add-WindowsFeature DHCP
    Set-Service dhcpserver -StartupType automatic
    Start-service dhcpserver
    netsh dhcp server add scope $scopeIP 255.255.255.0 $scopeName $scopeName
    netsh dhcp server scope $scopeIP set state 0
    netsh dhcp server scope $scopeIP add iprange $scopeStart $scopeEnd
    netsh dhcp server scope $scopeIP set optionvalue 003 IPADDRESS $gatewayIP
    netsh dhcp server scope $scopeIP set optionvalue 006 IPADDRESS $dcIP
    netsh dhcp server scope $scopeIP set optionvalue 015 STRING $domainSuffix
    netsh dhcp server scope $scopeIP set state 1
    netsh dhcp add server $dcName.$domainSuffix $dcIP 
    

이제 기능 Active Directory 도메인과 함께 개인 서브넷에서 실행되는 기능 TCP/IP 네트워크를 가지고 있습니다. 온-프레미스 SQL Server 시스템을 구성할 준비가 되었습니다.

  1. 온-프레미스 SQL Server 인스턴스에 사용할 추가 온-프레미스 컴퓨터에 Windows Server 2008 R2를 설치합니다.

  2. 인터넷에 컴퓨터를 연결하고 모든 업데이트를 설치합니다.

  3. 인터넷과 컴퓨터 연결을 끊고 VPN 장치와 동일한 서브넷에 컴퓨터를 연결합니다.

  4. 관리자 모드에서 Windows PowerShell 창을 엽니다.

  5. 이전에 만든 COR 도메인에 컴퓨터를 조인합니다. 기존 온-프레미스 네트워크 및 도메인을 사용하는 경우 조직의 각 도메인에 컴퓨터를 조인합니다. 각 컴퓨터에 대해 $computerName 변수를 SQLOnPrem으로 변경합니다.

    $domain = "CORP"
    $domainAdmin = "CORP\Administrator"
    $password = "Contoso!000"
    
    $computerName = SQLOnPrem
    netdom join $env:COMPUTERNAME /domain:$domain /userd:$domainAdmin /passwordd:$password 
    netdom renamecomputer $env:COMPUTERNAME /newname:$computerName /userd:$domainAdmin /passwordd:$password /force /reboot
    

    이 명령을 실행하면 컴퓨터가 자동으로 다시 부팅됩니다.

  6. 컴퓨터가 다시 부팅되면 로컬 관리자로 다시 로그인하고 관리자 모드에서 Windows PowerShell 창을 엽니다.

  7. 설치 디렉터리에 대한 변수를 설정하고 SQLOnPrem에 SQL Server 2012를 설치합니다.

    $installDir = "<Directory of SQL Server Setup.exe>"
    $agtsvcacct = "CORP\SQLAgent1"
    $sqlAdmin = "CORP\Install"
    $password = "Contoso!000"
    
    cd $installDir
    .\Setup.exe `
        /q `
        /ACTION=Install `
        /FEATURES=SQL,SSMS `
        /INSTANCENAME=MSSQLSERVER `
        /AGTSVCACCOUNT="$agtsvcacct" `
        /AGTSVCPASSWORD="$password" `
        /SQLSYSADMINACCOUNTS="$sqlAdmin" `
        /IACCEPTSQLSERVERLICENSETERMS
    
    
  8. SQL Server의 원격 액세스를 위해 방화벽을 엽니다.

    netsh advfirewall firewall add rule `
        name='SQL Server (TCP-In)' `
        program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' `
        dir=in `
        action=allow `
        protocol=TCP
    
    
  9. 기본 인스턴스에서 TCP 프로토콜을 사용하도록 설정하고 SQL Server 서비스를 다시 시작합니다.

    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")
    $wmi = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $env:COMPUTERNAME
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].IsEnabled = "True"
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].Alter()
    $svc = Get-Service -Name 'MSSQLSERVER'
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $svc.Stop(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc.Start(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout) 
    
  10. 로컬 관리자로 CORP\Install을 추가합니다. 이 사용자를 사용하여 WSFC 클러스터와 가용성 그룹을 구성하게 됩니다.

    net localgroup administrators "$sqlAdmin" /Add
    
  11. 두 컴퓨터에서 로그아웃합니다.

    Logoff.exe
    

이제 온-프레미스 개인 서브넷 및 SQL Server 구성을 마쳤습니다. 다음 단계에서는 온-프레미스 개인 서브넷과 Azure 네트워크 간에 VPN 연결을 구성한 다음 Azure에서 도메인에 가입된 SQL Server VM을 만듭니다.

  1. 인터넷에 연결된 컴퓨터의 PowerShell 창에서 Azure 모듈을 가져오고 게시 설정 파일을 컴퓨터에 다운로드하고 다운로드한 게시 설정을 가져와서 PowerShell 세션을 Azure 구독에 연결합니다.

    Import-Module `
        "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\Azure\Azure.psd1"
    Get-AzurePublishSettingsFile
    Import-AzurePublishSettingsFile <publishsettingsfilepath> 
    

    Get-AzurePublishgSettingsFile 명령은 Azure를 통해 관리 인증서를 자동으로 생성하고 컴퓨터에 다운로드합니다. 브라우저가 자동으로 열리고 Azure 구독에 대한 Microsoft 계정 자격 증명을 입력하라는 메시지가 표시됩니다. 다운로드한 .publishsettings 파일에는 Azure 구독을 관리하는 데 필요한 모든 정보가 포함되어 있습니다. 이 파일을 로컬 디렉터리에 저장한 후 Import-AzurePublishSettingsFile 명령을 사용하여 가져옵니다.

    security보안 참고
    publishsettings 파일에는 Azure 구독 및 서비스를 관리하는 데 사용되는 자격 증명(인코딩되지 않음)이 포함되어 있습니다. 이 파일에 대한 최상의 보안 방법은 이 파일을 원본 디렉터리 외부(예: Libraries\Documents 폴더)에 임시로 저장한 다음 가져오기가 완료되면 삭제하는 것입니다. publishsettings 파일에 액세스할 수 있는 악의적인 사용자는 Azure 서비스를 편집하고 만들고 삭제할 수 있습니다.

  2. 클라우드 IT 인프라를 만드는 데 사용할 일련의 변수를 정의합니다.

    $workingDir = "C:\workingDirectory\"
    $location = "West US"
    $affinityGroupName = "ContosoAG"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $virtualNetworkName = "ContosoNET" 
    $localNetworkName = "ContosoNETLocal"
    $networkConfigPath = $workingDir + "NetworkConfig.xml"
    $storageAccountName = "<uniquestorageaccountname>"
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer = "https://$storageAccountName.blob.core.windows.net/vhds/"
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $serviceName = "<uniqueservicename>"
    $sqlServerName = "SQLInCloud"
    $vmAdminUser = "AzureAdmin" 
    $vmAdminPassword = "Contoso!000"
    $dnsSettings = New-AzureDns -Name "LocalDC" -IPAddress "10.0.0.1"
    $domainName= "corp"
    $domainSuffix = "corp.contoso.com"
    $subnetName = "CloudBack"
    $domainUser = "Administrator"
    $dataDiskSize = 100
    

    다음 사항에 유의하여 명령이 나중에 성공적으로 수행되도록 합니다.

    • $storageAccountName$serviceName 변수는 각각 인터넷에서 클라우드 저장소 계정과 클라우드 서버를 식별하는 데 사용되므로 고유해야 합니다.

    • $affinityGroupName, $virtualNetworkName$localNetworkName 변수에 지정된 이름은 나중에 사용할 가상 네트워크 구성 문서에 구성되어 있습니다.

    • $sqlImageName은 SQL Server 2012 서비스 팩 1 엔터프라이즈 버전이 포함된 VM 이미지의 업데이트된 이름을 지정합니다.

    • 간단하게 하기 위해 자습서 전체에서 사용되는 동일 암호는 Contoso!000입니다.

  3. 선호도 그룹을 만듭니다.

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. NetworkConfig.xml이라는 구성 파일을 가져와서 가상 네트워크를 만듭니다.

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    구성 파일에는 다음과 같은 XML 문서가 들어 있습니다. 간단히 말해서 이 문서는 ContosoAG라는 선호도 그룹에 ContosoNET이라는 가상 네트워크를 지정하고 주소 공간 10.10.0.0/16을 가지고 있습니다. CloudBack 서브넷 또는 10.1.1.0/24는 SQL Server VM을 배치할 위치입니다. GatewaySubnet 서브넷 또는 10.1.254.0/24는 Azure가 가상 VPN 장치를 배치하는 데 사용됩니다. 서브넷 이름 GatewaySubnet은 변경할 수 없습니다. $affinityGroupName, $virtualNetworkName$localNetworkName 변수를 이전에 변경한 경우 아래의 해당 이름도 변경해야 합니다. 또한 문서는 온-프레미스 DNS 서버의 IP 주소 10.0.0.1을 구성하고 DnsServersRef 요소에 이 DNS 서버에 대한 참조를 만듭니다.

    <NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
      <VirtualNetworkConfiguration>
        <Dns>
          <DnsServers>
            <DnsServer name="LocalDC" IPAddress="10.0.0.1" />
          </DnsServers>
        </Dns>
        <LocalNetworkSites>
          <LocalNetworkSite name="ContosoNETLocal">
            <AddressSpace>
              <AddressPrefix>10.0.0.0/24</AddressPrefix>
            </AddressSpace>
            <VPNGatewayAddress>24.12.228.169</VPNGatewayAddress>
          </LocalNetworkSite>
        </LocalNetworkSites>
        <VirtualNetworkSites>
          <VirtualNetworkSite name="ContosoNET" AffinityGroup="ContosoAG">
            <AddressSpace>
              <AddressPrefix>10.1.0.0/16</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="CloudBack">
                <AddressPrefix>10.1.1.0/24</AddressPrefix>
              </Subnet>
              <Subnet name="GatewaySubnet">
                <AddressPrefix>10.1.254.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
            <DnsServersRef>
              <DnsServerRef name="LocalDC" />
            </DnsServersRef>
            <Gateway profile="Small">
              <ConnectionsToLocalNetwork>
                <LocalNetworkSiteRef name="ContosoNETLocal" />
              </ConnectionsToLocalNetwork>
            </Gateway>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration>
    
  5. 가상 네트워크 게이트웨이를 만들고 게이트웨이의 프로비전을 마칠 때까지 기다립니다.

    New-AzureVNetGateway -VNetName $virtualNetworkName
    
    $gateway = Get-AzureVNetGateway -VNetName $virtualNetworkName
    While ($gateway.State -ne "Provisioned")
    {
        write-host "Waiting...Current State = " $gateway.Status
        Start-Sleep -Seconds 15
        $gateway = Get-AzureVNetGateway -VNetName $virtualNetworkName
    }
    
    "IP Address   : " + $gateway.VIPAddress
    "Preshared Key: " + (Get-AzureVNetGatewayKey -VNetName $virtualNetworkName -LocalNetworkSiteName $localNetworkName).Value
    
    

    가상 네트워크 게이트웨이를 프로비전하는 데는 시간이 걸립니다. 프로비전된 게이트웨이의 공용 IP 주소와 미리 공유된 키가 PowerShell 창에 표시됩니다.

  6. 가상 네트워크 게이트웨이의 공용 IP 주소 및 미리 공유된 키를 사용하여 온-프레미스 VPN 장치를 구성합니다. VPN 장치와 관련된 구성 스크립트를 사용하려면 가상 네트워크용 VPN 장치 정보를 참조하십시오.

    이 단계의 마지막에서는 VPN 연결이 완벽하게 연결되어 있어야 합니다. 자세한 내용은 사이트 간 VPN 연결 설정을 참조하십시오.

  7. 인터넷에 연결된 컴퓨터의 PowerShell 창에서, 만든 선호도 그룹과 연결된 저장소 계정을 만듭니다.

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName
    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName
    
  8. 새 클라우드 서비스에 SQL Server VM을 만듭니다.

    New-AzureVMConfig `
        -Name $sqlServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sqlServerName.vhd" `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -WindowsDomain `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword `
            -DisableAutomaticUpdates `
            -Domain $domainName `
            -JoinDomain $domainSuffix `
            -DomainUserName $domainUser `
            -DomainPassword $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1 `
                    -LocalPort 1433 | 
                    New-AzureVM `
                        -ServiceName $serviceName `
                        -AffinityGroup $affinityGroupName `
                        -VNetName $virtualNetworkName `
                        -DnsSettings $dnsSettings
    

    이러한 일련의 파이프된 명령은 다음 작업을 수행합니다.

    • New-AzureVMConfig는 가상 컴퓨터 갤러리의 SQL Server 2012 서비스 팩 1 엔터프라이즈 버전 이미지를 사용하여 VM 구성을 만듭니다. 또한 운영 체제 디스크를 쓰기 캐싱이 아닌 읽기 캐싱 전용으로 설정합니다. 데이터베이스 파일을 VM에 연결하여 읽기 또는 쓰기 캐싱이 없도록 구성하는 별도의 데이터 디스크로 마이그레이션하는 것이 좋습니다. 그러나 온-프레미스 데이터베이스 서버는 데이터베이스 파일에 C 드라이브를 사용하므로 데이터베이스 파일을 이동하지 않게 됩니다. 따라서 나중에 온-프레미스 서버를 모두 WSFC 클러스터에 조인할 경우 Azure VM의 구성이 온-프레미스 서버와 동일할 수 있습니다.

    • Add-AzureProvisioningConfig는 만든 온-프레미스 Active Directory 도메인에 VM을 조인합니다.

    • Add-AzureEndpoint는 클라이언트 응용 프로그램이 인터넷에서 SQL Server 서비스 인스턴스에 액세스할 수 있도록 액세스 끝점을 추가합니다.

    • New-AzureVM은 새 클라우드 서비스를 만들고 새 클라우드 서비스에 새 Azure VM을 만듭니다.

  9. 새 VM이 완전히 프로비전될 때까지 기다린 다음 원격 데스크톱 파일을 작업 디렉터리에 다운로드하십시오. while 루프는 새 Azure VM을 사용할 준비가 될 때까지 계속해서 폴링합니다.

    $VMStatus = Get-AzureVM -ServiceName $serviceName -Name $sqlServerName
    
    While ($VMStatus.Status -ne "ReadyRole")
    {
        write-host "Waiting...Current Status = " $VMStatus.InstanceStatus
        Start-Sleep -Seconds 15
        $VMStatus = Get-AzureVM -ServiceName $serviceName -Name $sqlServerName
    } 
    Get-AzureRemoteDesktopFile `
        -ServiceName $serviceName `
        -Name $sqlServerName `
        -LocalPath "$workingDir$sqlServerName.rdp"
    

이제 새 SQL Server VM인 SQLInCloud에 연결하고 이를 초기화합니다.

이 섹션에서는 가용성 그룹에 조인할 수 있도록 만든 새 SQL Server VM에서 기본 SQL Server 설치를 수정해야 합니다. 특히 다음에 대해 주의하십시오.

  • VM은 모든 SQL Server 서비스(예: 데이터베이스 엔진, SSIS, SSAS, SSRS 등)와 함께 설치되어 있습니다. 기본 MSSQLSERVER 인스턴스 및 전체 텍스트 검색 데몬과 같이 필요한 것 이외의 SQL 서비스를 모두 사용하지 않도록 설정해야 합니다.

  • 서비스 계정 SQL Server 에이전트를 CORP\SQLAgent2로 변경해야 합니다.

  • TCP 프로토콜은 SQL Server VM에서 이미 사용할 수 있도록 설정되어 있습니다. 그러나 SQL Server의 원격 액세스를 위해서는 방화벽을 열어야 합니다.

  1. 원격 데스크톱 파일을 시작하여 SQLInCloud에 연결합니다. VM을 만들 때 지정한 컴퓨터 관리자의 사용자 이름 AzureAdmin과 암호 Contoso!000을 사용합니다.

  2. 컴퓨터가 corp.contoso.com에 성공적으로 연결되었는지 확인합니다.

  3. SQL Server 설치가 자동화된 초기화 태스크 실행을 완료할 때까지 기다렸다가 계속 진행합니다.

  4. 관리자 모드에서 PowerShell 창을 엽니다.

  5. 다음 변수를 정의합니다.

    $desirableServices = @("SqlServer","SqlAgent","9")
    $svcaccount = "CORP\SQLAgent2"
    $password = "Contoso!000"
    

    $desirableServices 변수의 경우 SqlServer는 데이터베이스 엔진 서비스의 서비스 유형이고, SqlAgent는 SQL Server 에이전트 서비스의 서비스 유형이며, 9는 전체 텍스트 검색 데몬의 서비스 유형입니다.

  6. SQL Server PowerShell 공급자를 가져옵니다.

    Set-ExecutionPolicy -Execution RemoteSigned -Force
    Import-Module -Name "sqlps" -DisableNameChecking
    
  7. SSIS, SSAS, SSRS 등 바람직하지 않은 SQL 서비스를 모두 중지하고 해당 시작 모드를 Disabled로 설정합니다.

    $wmi = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $env:COMPUTERNAME
    $wmi.services | where {$desirableServices -notcontains $_.Type} | foreach{$_.StartMode = "Disabled"; $_.Alter(); $_.Stop();}
    
  8. 기본 인스턴스의 SQL Server 에이전트 서비스 계정을 CORP\SQLAgent2로 변경합니다.

    $wmi.services | where {$_.Type -eq 'SqlAgent'} | foreach{$_.SetServiceAccount($svcaccount,$password)}
    $svc = Get-Service -Name 'SQLSERVERAGENT'
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $svc.Stop(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    # Start the SQL Server service and wait for the service to be fully started
    $svc.Start(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running,$timeout)
    
  9. SQL Server의 원격 액세스를 위해 방화벽을 엽니다.

    netsh advfirewall firewall add rule name='SQL Server (TCP-In)' program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' dir=in action=allow protocol=TCP
    

이제 로그 전달을 구성할 준비가 되었습니다.

  1. 원격 데스크톱 파일을 시작하여 SQLOnPrem에 다시 연결합니다. 로그인하려면 기본 제공 관리자 계정을 사용합니다.

  2. 관리자 모드에서 PowerShell 창을 엽니다. 아직 SQLOnPrem에서 로그아웃하지 않은 경우 SQL Server 경로가 PowerShell 환경 변수에 로드되도록 하려면 기존 PowerShell 창을 닫은 다음 관리자 모드에서 새 PowerShell 창을 열어야 합니다.

  3. 로그 전달 작업에 사용할 네트워크 공유를 만듭니다.

    $backup = "C:\LocalBackup"
    $acct1 = "CORP\SQLAgent1"
    $acct2 = "CORP\SQLAgent2"
    
    New-Item $backup -ItemType directory
    net share backup=$backup "/grant:$acct1,FULL" "/grant:$acct2,FULL"
    icacls.exe "$backup" /grant:r ("$acct1" + ":(OI)(CI)F") ("$acct2" + ":(OI)(CI)F")
    
  4. SQLOnPrem에서 아래의 Transact-SQL 스크립트를 실행하여 로그 전달을 설정합니다. 이 스크립트는 SSMS(SQL Server Management Studio) 사용자 인터페이스에서 다음 변수를 사용하여 생성됩니다.

    1. 데이터베이스: MyDB1

    2. 백업 디렉터리: C:\LocalBackup

    3. 백업 디렉터리 공유 경로: \\SQLOnPrem\backup

    4. 보조 서버: SQLInCloud

    5. 로그 백업에 대한 대상 디렉터리(SQLInCloud): C:\LocalBackup

    SSMS에서 생성된 스크립트의 두 번째 부분은 나중에 SQLInCloud에서 실행합니다.

    SQLCMD -S SQLOnPrem
    
    DECLARE @LS_BackupJobIdAS uniqueidentifier 
    DECLARE @LS_PrimaryIdAS uniqueidentifier 
    DECLARE @SP_Add_RetCodeAs int 
    
    
    EXEC @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database 
    @database = N'MyDB1' 
    ,@backup_directory = N'C:\LocalBackup' 
    ,@backup_share = N'\\SQLOnPrem\backup' 
    ,@backup_job_name = N'LSBackup_MyDB1' 
    ,@backup_retention_period = 4320
    ,@backup_compression = 2
    ,@backup_threshold = 60 
    ,@threshold_alert_enabled = 1
    ,@history_retention_period = 5760 
    ,@backup_job_id = @LS_BackupJobId OUTPUT 
    ,@primary_id = @LS_PrimaryId OUTPUT 
    ,@overwrite = 1 
    
    
    IF (@@ERROR = 0 AND @SP_Add_RetCode = 0) 
    BEGIN 
    
    DECLARE @LS_BackUpScheduleUIDAs uniqueidentifier 
    DECLARE @LS_BackUpScheduleIDAS int 
    
    
    EXEC msdb.dbo.sp_add_schedule 
    @schedule_name =N'LSBackupSchedule_SQL11' 
    ,@enabled = 1 
    ,@freq_type = 4 
    ,@freq_interval = 1 
    ,@freq_subday_type = 4 
    ,@freq_subday_interval = 15 
    ,@freq_recurrence_factor = 0 
    ,@active_start_date = 20121127 
    ,@active_end_date = 99991231 
    ,@active_start_time = 0 
    ,@active_end_time = 235900 
    ,@schedule_uid = @LS_BackUpScheduleUID OUTPUT 
    ,@schedule_id = @LS_BackUpScheduleID OUTPUT 
    
    EXEC msdb.dbo.sp_attach_schedule 
    @job_id = @LS_BackupJobId 
    ,@schedule_id = @LS_BackUpScheduleID  
    
    EXEC msdb.dbo.sp_update_job 
    @job_id = @LS_BackupJobId 
    ,@enabled = 1 
    
    
    END 
    
    
    EXEC master.dbo.sp_add_log_shipping_alert_job 
    
    EXEC master.dbo.sp_add_log_shipping_primary_secondary 
    @primary_database = N'MyDB1' 
    ,@secondary_server = N'SQLInCloud' 
    ,@secondary_database = N'MyDB1' 
    ,@overwrite = 1 
    
    Exit
    
  5. 원격 데스크톱 파일을 시작하여 SQLInCloud에 다시 연결합니다. 로그인하려면 기본 제공 관리자 계정을 사용합니다.

  6. 관리자 모드에서 PowerShell 창을 엽니다.

  7. 로그 전달 복사 및 복원 작업에 사용할 로컬 디렉터리를 만듭니다.

    $backup = "C:\LocalBackup"
    $acct2 = "CORP\SQLAgent2"
    
    New-Item $backup -ItemType directory
    icacls.exe "$backup" /grant:r ("$acct2" + ":(OI)(CI)F")
    
  8. SQLInCloud에서 아래의 Transact-SQL 스크립트를 실행하여 로그 전달을 설정합니다. 이 스크립트는 SSMS에서 생성된 스크립트의 두 번째 부분입니다.

    SQLCMD -S SQLInCloud
    
    DECLARE @LS_Secondary__CopyJobIdAS uniqueidentifier 
    DECLARE @LS_Secondary__RestoreJobIdAS uniqueidentifier 
    DECLARE @LS_Secondary__SecondaryIdAS uniqueidentifier 
    DECLARE @LS_Add_RetCodeAs int 
    
    
    EXEC @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary 
    @primary_server = N'SQLOnPrem' 
    ,@primary_database = N'MyDB1' 
    ,@backup_source_directory = N'\\SQLOnPrem\backup' 
    ,@backup_destination_directory = N'C:\LocalBackup' 
    ,@copy_job_name = N'LSCopy_SQLOnPrem_MyDB1' 
    ,@restore_job_name = N'LSRestore_SQLOnPrem_MyDB1' 
    ,@file_retention_period = 4320 
    ,@overwrite = 1 
    ,@copy_job_id = @LS_Secondary__CopyJobId OUTPUT 
    ,@restore_job_id = @LS_Secondary__RestoreJobId OUTPUT 
    ,@secondary_id = @LS_Secondary__SecondaryId OUTPUT 
    
    IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
    BEGIN 
    
    DECLARE @LS_SecondaryCopyJobScheduleUIDAs uniqueidentifier 
    DECLARE @LS_SecondaryCopyJobScheduleIDAS int 
    
    
    EXEC msdb.dbo.sp_add_schedule 
    @schedule_name =N'DefaultCopyJobSchedule' 
    ,@enabled = 1 
    ,@freq_type = 4 
    ,@freq_interval = 1 
    ,@freq_subday_type = 4 
    ,@freq_subday_interval = 15 
    ,@freq_recurrence_factor = 0 
    ,@active_start_date = 20121127 
    ,@active_end_date = 99991231 
    ,@active_start_time = 0 
    ,@active_end_time = 235900 
    ,@schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT 
    ,@schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT 
    
    EXEC msdb.dbo.sp_attach_schedule 
    @job_id = @LS_Secondary__CopyJobId 
    ,@schedule_id = @LS_SecondaryCopyJobScheduleID  
    
    DECLARE @LS_SecondaryRestoreJobScheduleUIDAs uniqueidentifier 
    DECLARE @LS_SecondaryRestoreJobScheduleIDAS int 
    
    
    EXEC msdb.dbo.sp_add_schedule 
    @schedule_name =N'DefaultRestoreJobSchedule' 
    ,@enabled = 1 
    ,@freq_type = 4 
    ,@freq_interval = 1 
    ,@freq_subday_type = 4 
    ,@freq_subday_interval = 15 
    ,@freq_recurrence_factor = 0 
    ,@active_start_date = 20121127 
    ,@active_end_date = 99991231 
    ,@active_start_time = 0 
    ,@active_end_time = 235900 
    ,@schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT 
    ,@schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT 
    
    EXEC msdb.dbo.sp_attach_schedule 
    @job_id = @LS_Secondary__RestoreJobId 
    ,@schedule_id = @LS_SecondaryRestoreJobScheduleID  
    
    
    END 
    
    
    DECLARE @LS_Add_RetCode2As int 
    
    
    IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) 
    BEGIN 
    
    EXEC @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database 
    @secondary_database = N'MyDB1' 
    ,@primary_server = N'SQLOnPrem' 
    ,@primary_database = N'MyDB1' 
    ,@restore_delay = 0 
    ,@restore_mode = 0 
    ,@disconnect_users= 0 
    ,@restore_threshold = 45   
    ,@threshold_alert_enabled = 1 
    ,@history_retention_period= 5760 
    ,@overwrite = 1 
    
    END 
    
    
    IF (@@error = 0 AND @LS_Add_RetCode = 0) 
    BEGIN 
    
    EXEC msdb.dbo.sp_update_job 
    @job_id = @LS_Secondary__CopyJobId 
    ,@enabled = 1 
    
    EXEC msdb.dbo.sp_update_job 
    @job_id = @LS_Secondary__RestoreJobId 
    ,@enabled = 1 
    
    END 
    
    Exit
    

축하합니다. 온-프레미스에서 실행되는 주 데이터베이스 서버와 Azure에서 실행되는 보조 데이터베이스 서버가 포함된 하이브리드 IT 환경에서 로그 전달을 구현했습니다. SQL Server 에이전트에서 로그 전달 작업을 모니터링하여 로그가 SQLOnPrem에서 성공적으로 생성되고 SQLInCloud에서 성공적으로 복사 및 복원되는지 확인할 수 있습니다.

표시:
© 2014 Microsoft