다음을 통해 공유


자습서: Azure Blob Storage에서 SQL Server 사용

적용 대상: SQL Server 2016(13.x) 이상 버전

이 자습서는 데이터 파일 및 SQL Server 2016 이상 버전 백업에 Azure Blob Storage를 사용하는 방법을 이해하는 데 도움이 됩니다.

Azure Blob Storage에 대한 SQL Server 통합 지원은 SQL Server 2012 서비스 팩 1 CU2 향상된 기능으로 시작되었으며, SQL Server 2014 및 SQL Server 2016에서 더욱 개선되었습니다. 이 기능에 대한 개요 및 사용할 경우의 이점은 Microsoft Azure의 SQL Server 데이터 파일을 참조하세요.

이 자습서에서는 여러 섹션을 통해 Azure Blob Storage에서 SQL Server 데이터 파일을 사용하는 방법을 보여 줍니다. 각 섹션은 특정 작업을 중심으로 하며, 섹션을 순서대로 완료해야 합니다. 먼저 저장된 액세스 정책과 공유 액세스 서명을 사용하여 Blob Storage에 새 컨테이너를 만드는 방법을 알아봅니다. 그런 다음 SQL Server 자격 증명을 만들어 Azure Blob Storage에 SQL Server를 통합하는 방법을 살펴봅니다. 데이터베이스를 Blob Storage에 백업하고 Azure 가상 머신에 복원합니다. 그런 다음 SQL Server 파일-스냅샷 트랜잭션 로그 백업을 사용하여 특정 시점 및 새 데이터베이스로 복원합니다. 마지막으로, 이 자습서에서 파일-스냅샷 백업을 이해하고 작업하는 데 도움이 되는 메타 데이터 시스템 저장 프로시저 및 함수를 사용하는 방법을 보여줍니다.

필수 조건

이 자습서를 완료하려면 SQL Server 백업 및 복원 개념과 T-SQL 구문을 잘 알고 있어야 합니다.
이 자습서를 사용하려면 Azure Storage 계정, SSMS(SQL Server Management Studio), SQL Server 온프레미스 인스턴스에 대한 액세스 권한, SQL Server 2016 이상 버전의 인스턴스를 실행하는 Azure VM(가상 머신) 액세스 권한 및 AdventureWorks2022 데이터베이스가 필요합니다. 또한 BACKUP 및 RESTORE 명령을 실행하는 데 사용하는 계정은 모든 자격 증명 변경 권한이 있는 db_backup operator 데이터베이스 역할에 있어야 합니다.

Important

SQL Server는 Azure Data Lake Storage를 지원하지 않으므로, 이 자습서에 사용되는 스토리지 계정에서 계층 구조 네임스페이스를 사용 안 함으로 설정했는지 확인합니다.

1 - 저장된 액세스 정책 및 공유 액세스 스토리지 만들기

이 섹션에서는 Azure PowerShell 스크립트를 사용하여 저장된 액세스 정책을 통해 Azure Blob Storage 컨테이너에 공유 액세스 서명을 만듭니다.

참고 사항

이 스크립트는 Azure PowerShell 5.0.10586을 사용하여 작성되었습니다.

공유 액세스 서명은 컨테이너, Blob, 큐 또는 테이블에 대한 제한된 액세스 권한을 부여하는 URI입니다. 저장된 액세스 정책은 액세스 철회, 만료 또는 확장을 포함하여 서버 측의 공유 액세스 서명에 대한 추가 수준의 제어를 제공합니다. 이 새로운 향상된 기능을 사용하는 경우 최소한 읽기, 쓰기 및 목록 권한이 있는 컨테이너에 정책을 만들어야 합니다.

Azure PowerShell, Azure Storage SDK, Azure REST API 또는 타사 유틸리티를 사용하여 저장된 액세스 정책과 공유 액세스 서명을 만들 수 있습니다. 이 자습서에서 Azure PowerShell 스크립트를 사용하여 이 작업을 완료하는 방법을 보여줍니다. 이 스크립트는 Resource Manager 배포 모델을 사용하고 다음과 같은 새 리소스를 만듭니다.

  • Resource group
  • 스토리지 계정
  • Azure Blob Storage 컨테이너
  • SAS 정책

이 스크립트는 초반부에서 위의 리소스에 대한 이름과 다음 필수 입력 값의 이름을 지정하는 여러 변수를 선언합니다.

  • 다른 리소스 개체의 이름을 지정하는 데 사용되는 접두사 이름
  • 구독 이름
  • 데이터 센터 위치

2 - 공유 액세스 서명을 사용하여 SQL Server 자격 증명 만들기에서 사용할 적절한 CREATE CREDENTIAL 문을 생성하면 이 스크립트가 완성됩니다. 사용자를 위해 이 문을 클립보드에 복사하고 콘솔에 출력하여 사용자가 볼 수 있도록 합니다.

컨테이너에 정책을 만들고 SAS(공유 액세스 서명)를 생성하려면 다음 단계를 따르세요.

  1. Windows PowerShell 또는 Windows PowerShell ISE를 엽니다(위의 버전 요구 사항 참조).

  2. 아래 스크립트를 편집한 후 실행합니다.

    # Define global variables for the script
    $prefixName = '<a prefix name>'  # used as the prefix for the name for various objects
    $subscriptionID = '<your subscription ID>'   # the ID  of subscription name you will use
    $locationName = '<a data center location>'  # the data center region you will use
    $storageAccountName= $prefixName + 'storage' # the storage account name you will create or use
    $containerName= $prefixName + 'container'  # the storage container name to which you will attach the SAS policy with its SAS token
    $policyName = $prefixName + 'policy' # the name of the SAS policy
    
    # Set a variable for the name of the resource group you will create or use
    $resourceGroupName=$prefixName + 'rg'
    
    # Add an authenticated Azure account for use in the session
    Connect-AzAccount
    
    # Set the tenant, subscription and environment for use in the rest of
    Set-AzContext -SubscriptionId $subscriptionID
    
    # Create a new resource group - comment out this line to use an existing resource group
    New-AzResourceGroup -Name $resourceGroupName -Location $locationName
    
    # Create a new Azure Resource Manager storage account - comment out this line to use an existing Azure Resource Manager storage account
    New-AzStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -Type Standard_RAGRS -Location $locationName
    
    # Get the access keys for the Azure Resource Manager storage account
    $accountKeys = Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName -Name $storageAccountName
    
    # Create a new storage account context using an Azure Resource Manager storage account
    $storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $accountKeys[0].Value
    
    # Creates a new container in Blob Storage
    $container = New-AzStorageContainer -Context $storageContext -Name $containerName
    
    # Sets up a Stored Access Policy and a Shared Access Signature for the new container
    $policy = New-AzStorageContainerStoredAccessPolicy -Container $containerName -Policy $policyName -Context $storageContext -StartTime $(Get-Date).ToUniversalTime().AddMinutes(-5) -ExpiryTime $(Get-Date).ToUniversalTime().AddYears(10) -Permission rwld
    
    # Gets the Shared Access Signature for the policy
    $sas = New-AzStorageContainerSASToken -name $containerName -Policy $policyName -Context $storageContext
    Write-Host 'Shared Access Signature= '$($sas.Substring(1))''
    
    # Sets the variables for the new container you just created
    $container = Get-AzStorageContainer -Context $storageContext -Name $containerName
    $cbc = $container.CloudBlobContainer
    
    # Outputs the Transact SQL to the clipboard and to the screen to create the credential using the Shared Access Signature
    Write-Host 'Credential T-SQL'
    $tSql = "CREATE CREDENTIAL [{0}] WITH IDENTITY='Shared Access Signature', SECRET='{1}'" -f $cbc.Uri,$sas.Substring(1)
    $tSql | clip
    Write-Host $tSql
    
    # Once you're done with the tutorial, remove the resource group to clean up the resources.
    # Remove-AzResourceGroup -Name $resourceGroupName
    
  3. 스크립트가 완료되면 다음 섹션에서 사용할 수 있도록 클립보드에 CREATE CREDENTIAL 문이 있습니다.

2 - 공유 액세스 서명을 사용하여 SQL Server 자격 증명 만들기

이 섹션에서는 SQL Server가 이전 단계에서 만든 Azure Blob Storage 컨테이너에 쓰고 읽을 때 사용할 보안 정보를 저장하기 위한 자격 증명을 만듭니다.

SQL Server 자격 증명은 SQL Server 외부의 리소스에 연결하는 데 필요한 인증 정보를 저장하는 데 사용되는 개체입니다. 이 자격 증명은 Azure Blob Storage 컨테이너의 URI 경로와 이 컨테이너에 대한 공유 액세스 서명을 저장합니다.

SQL Server 자격 증명을 만들려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 새 쿼리 창을 열고 온프레미스 환경에 있는 데이터베이스 엔진의 SQL Server 인스턴스에 연결합니다.

  3. 새 쿼리 창에서 섹션 1의 공유 액세스 서명을 사용하는 CREATE CREDENTIAL 문을 붙여넣고 해당 스크립트를 실행합니다.

    이 스크립트는 다음 코드와 같습니다.

    /* Example:
    USE master
    CREATE CREDENTIAL [https://msfttutorial.blob.core.windows.net/containername]
    WITH IDENTITY='SHARED ACCESS SIGNATURE'
    , SECRET = 'sharedaccesssignature'
    GO */
    
    USE master
    CREATE CREDENTIAL [https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>]
      -- this name must match the container path, start with https and must not contain a forward slash at the end
    WITH IDENTITY='SHARED ACCESS SIGNATURE'
      -- this is a mandatory string and should not be changed
     , SECRET = 'sharedaccesssignature'
       -- this is the shared access signature key that you obtained in section 1.
    GO
    
  4. 사용할 수 있는 모든 자격 증명을 보려면 인스턴스에 연결된 쿼리 창에서 다음 문을 실행합니다.

    SELECT * from sys.credentials
    
  5. 새 쿼리 창을 열고 Azure 가상 머신에 있는 데이터베이스 엔진의 SQL Server 인스턴스에 연결합니다.

  6. 새 쿼리 창에서 섹션 1의 공유 액세스 서명을 사용하는 CREATE CREDENTIAL 문을 붙여넣고 해당 스크립트를 실행합니다.

  7. 컨테이너에 액세스하려는 추가 SQL Server 인스턴스에 대해 5단계와 6단계를 반복합니다.

3 - URL로 데이터베이스 백업

이 섹션에서는 SQL Server 인스턴스의 AdventureWorks2022 데이터베이스를 섹션 1에서 만든 컨테이너로 백업합니다.

참고 사항

SQL Server 2012(11.x) SP1 CU2+ 데이터베이스 또는 SQL Server 2014(12.x) 데이터베이스를 이 컨테이너에 백업하려면, 여기에 설명된 사용되지 않는 구문을 사용하여 WITH CREDENTIAL 구문을 통해 URL에 백업할 수 있습니다.

Blob Storage에 데이터베이스를 백업하려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 새 쿼리 창을 열고 Azure 가상 머신의 SQL Server 인스턴스에 연결합니다.

  3. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣습니다. 섹션 1에서 지정한 컨테이너 및 스토리지 계정 이름에 맞게 URL을 수정한 다음, 이 스크립트를 실행합니다.

    -- To permit log backups, before the full database backup, modify the database to use the full recovery model.
    USE master;
    ALTER DATABASE AdventureWorks2022
       SET RECOVERY FULL;
    
    -- Back up the full AdventureWorks2022 database to the container that you created in section 1
    BACKUP DATABASE AdventureWorks2022
       TO URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2022_onprem.bak'
    
  4. 개체 탐색기 열고 스토리지 계정 및 계정 키를 사용하여 Azure Storage에 연결합니다.

    1. 컨테이너를 확장하고 섹션 1에서 만든 컨테이너를 확장한 다음, 위 3단계의 백업이 이 컨테이너에 표시되는지 확인합니다.

    Azure Storage 계정에 연결하는 다단계 프로세스를 나타내는 스크린샷

4 - URL에서 가상 컴퓨터로 데이터베이스 복원

이 섹션에서는 Azure 가상 머신의 SQL Server 인스턴스로 AdventureWorks2022 데이터베이스를 복원합니다.

참고 사항

이 자습서에서는 간단한 설명을 위해 데이터베이스 백업에 사용한 것과 동일한 컨테이너를 데이터 및 로그 파일에 사용합니다. 프로덕션 환경에서는 여러 컨테이너와 자주 여러 데이터 파일을 사용할 수 있습니다. 큰 데이터베이스를 백업할 때 백업 성능을 높이기 위해 여러 Blob에서 백업을 스트라이프하는 것도 고려할 수 있습니다.

Azure Blob Storage에서 Azure 가상 머신의 SQL Server 인스턴스로 AdventureWorks2022 데이터베이스를 복원하려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 새 쿼리 창을 열고 Azure 가상 머신에 있는 데이터베이스 엔진의 SQL Server 인스턴스에 연결합니다.

  3. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣습니다. 섹션 1에서 지정한 컨테이너 및 스토리지 계정 이름에 맞게 URL을 수정한 다음, 이 스크립트를 실행합니다.

    -- Restore AdventureWorks2022 from URL to SQL Server instance using Azure Blob Storage for database files
    RESTORE DATABASE AdventureWorks2022
       FROM URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2022_onprem.bak'
       WITH
          MOVE 'AdventureWorks2022_data' to 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2022_Data.mdf'
         ,MOVE 'AdventureWorks2022_log' to 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2022_Log.ldf'
    --, REPLACE
    
  4. 개체 탐색기 열고 Azure SQL Server 인스턴스에 연결합니다.

  5. 개체 탐색기에서 데이터베이스 노드를 확장하고 AdventureWorks2022 데이터베이스가 복원되었는지 확인합니다(필요에 따라 노드 새로 고침).

    1. AdventureWorks2022를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
    2. 파일을 선택하고 두 데이터베이스 파일의 경로가 Azure Blob Storage 컨테이너의 blob을 가리키는 URL인지 확인합니다(완료되면 취소 선택).

    Azure VM에 있는 [!INCLUDE [sssampledbobject-md](../includes/sssampledbobject-md.md)]데이터베이스의 스크린샷

  6. 개체 탐색기에서 Azure Storage에 연결합니다.

    1. 컨테이너를 확장하고 섹션 1에서 만든 컨테이너를 확장한 다음, 위 3단계의 AdventureWorks2022_Data.mdfAdventureWorks2022_Log.ldf이(가)가 섹션 3의 백업 파일과 함께 이 컨테이너에 표시되는지 확인합니다(필요에 따라 노드 새로 고침).

    SQL Server 인스턴스 항목 아래에 있는 Azure의 컨테이너 내 데이터 파일을 보여주는 SSMS의 개체 탐색기 스크린샷

5 - 파일-스냅샷 백업을 사용하여 데이터베이스 백업

이 섹션에서는 Azure 스냅샷을 사용하여 거의 즉시 백업을 수행하기 위해 파일-스냅샷 백업을 사용하여 Azure 가상 머신에서 AdventureWorks2022 데이터베이스를 백업합니다. 파일-스냅샷 백업에 대한 자세한 내용은 Azure의 데이터베이스 파일에 대한 파일-스냅샷 백업을 참조하세요.

파일-스냅샷 백업을 사용하여 AdventureWorks2022 데이터베이스를 백업하려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 새 쿼리 창을 열고 Azure 가상 머신에 있는 데이터베이스 엔진의 SQL Server 인스턴스에 연결합니다.

  3. 다음 TRANSACT-SQL 스크립트를 복사하여 쿼리 창에 붙여넣고 실행합니다. 이 쿼리 창을 닫지 마세요. 5단계에서 이 스크립트를 다시 실행합니다. 이 시스템 저장 프로시저를 사용하면 지정된 데이터베이스를 구성하는 각 파일에 대한 기존 파일 스냅샷 백업을 볼 수 있습니다. 이 데이터베이스에 대한 파일 스냅샷 백업이 없는 것을 확인할 수 있습니다.

    -- Verify that no file snapshot backups exist
    SELECT * FROM sys.fn_db_backup_file_snapshots ('AdventureWorks2022');
    
  4. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣습니다. 섹션 1에서 지정한 컨테이너 및 스토리지 계정 이름에 맞게 URL을 수정한 다음, 이 스크립트를 실행합니다. 이 백업이 얼마나 빨리 발생하는지 확인합니다.

    -- Backup the AdventureWorks2022 database with FILE_SNAPSHOT
    BACKUP DATABASE AdventureWorks2022
       TO URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2022_Azure.bak'
       WITH FILE_SNAPSHOT;
    
  5. 4단계의 스크립트가 성공적으로 실행되었는지 확인한 후 다음 스크립트를 다시 실행합니다. 4단계의 파일-스냅샷 백업 작업이 데이터 및 로그 파일 모두의 파일-스냅샷을 생성했습니다.

    -- Verify that two file-snapshot backups exist
    SELECT * FROM sys.fn_db_backup_file_snapshots ('AdventureWorks2022');
    

    스냅샷을 보여주는 fn_db_backup_file_snapshots 결과의 SSMS 스크린샷

  6. 개체 탐색기에서 Azure 가상 머신의 SQL Server 인스턴스에 있는 데이터베이스 노드를 확장하고 AdventureWorks2022 데이터베이스가 이 인스턴스로 복원되었는지 확인합니다(필요에 따라 노드 새로 고침).

  7. 개체 탐색기에서 Azure Storage에 연결합니다.

  8. 컨테이너를 확장하고 섹션 1에서 만든 컨테이너를 확장한 다음, 위 4단계의 AdventureWorks2022_Azure.bak가 섹션 3의 백업 파일 및 섹션 4의 데이터베이스 파일과 함께 이 컨테이너에 표시되는지 확인합니다(필요에 따라 노드 새로 고침).

    Azure의 스냅샷 백업을 보여주는 SSMS의 개체 탐색기 스크린샷

6 - 파일-스냅샷 백업을 사용하여 활동 및 백업 로그 생성

이 섹션에서는 AdventureWorks2022 데이터베이스에 작업을 생성하고 파일-스냅샷 백업을 사용하여 정기적으로 트랜잭션 로그 백업을 만듭니다. 파일 스냅샷 백업 사용에 대한 자세한 내용은 Azure의 데이터베이스 파일에 대한 파일-스냅샷 백업을 참조하세요.

AdventureWorks2022 데이터베이스에 작업을 생성하고 파일-스냅샷 백업을 사용하여 정기적으로 트랜잭션 로그 백업을 만들려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 두 개의 새 쿼리 창을 열고 Azure 가상 머신에 있는 데이터베이스 엔진의 SQL Server 인스턴스에 각 창을 연결합니다.

  3. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창의 하나에 붙여넣은 다음 실행합니다. 4단계에서 새 행을 추가하기 전에 Production.Location 테이블에 14개의 행이 있습니다.

    -- Verify row count at start
    SELECT COUNT (*) from AdventureWorks2022.Production.Location;
    
  4. 다음 Transact-SQL 스크립트를 복사하여 두 가지 별도의 쿼리 창에 붙여넣습니다. 섹션 1에서 지정한 컨테이너 및 스토리지 계정 이름에 맞게 URL을 수정한 다음, 해당 스크립트를 별도의 쿼리 창에서 동시에 실행합니다. 두 스크립트를 완료하는 데 약 7분 정도 걸립니다.

    -- Insert 30,000 new rows into the Production.Location table in the AdventureWorks2022 database in batches of 75
    DECLARE @count INT=1, @inner INT;
    WHILE @count < 400
       BEGIN
          BEGIN TRAN;
             SET @inner =1;
                WHILE @inner <= 75
                   BEGIN;
                      INSERT INTO AdventureWorks2022.Production.Location
                         (Name, CostRate, Availability, ModifiedDate)
                            VALUES (NEWID(), .5, 5.2, GETDATE());
                      SET @inner = @inner + 1;
                   END;
          COMMIT;
       WAITFOR DELAY '00:00:01';
       SET @count = @count + 1;
       END;
    SELECT COUNT (*) from AdventureWorks2022.Production.Location;
    
    --take 7 transaction log backups with FILE_SNAPSHOT, one per minute, and include the row count and the execution time in the backup file name
    DECLARE @count INT=1, @device NVARCHAR(120), @numrows INT;
    WHILE @count <= 7
       BEGIN
             SET @numrows = (SELECT COUNT (*) FROM AdventureWorks2022.Production.Location);
             SET @device = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/tutorial-' + CONVERT (varchar(10),@numrows) + '-' + FORMAT(GETDATE(), 'yyyyMMddHHmmss') + '.bak';
             BACKUP LOG AdventureWorks2022 TO URL = @device WITH FILE_SNAPSHOT;
             SELECT * from sys.fn_db_backup_file_snapshots ('AdventureWorks2022');
          WAITFOR DELAY '00:1:00';
             SET @count = @count + 1;
       END;
    
  5. 첫 번째 스크립트의 출력을 검토하고 최종 행 수가 이제 29,939개임을 확인합니다.

    29,939개의 행 수와 함께 결과 집합을 보여주는 SSMS의 스크린샷

  6. 두 번째 스크립트의 출력을 검토하여 BACKUP LOG 문을 실행할 때마다 두 개의 새 파일 스냅샷이 생성되는 것을 확인합니다.로그 파일의 파일 스냅샷 하나와 데이터 파일의 파일 스냅샷 하나 등 총 두 개의 파일 스냅샷이 각 데이터베이스 파일마다 생성됩니다. 두 번째 스크립트가 완료되면 이제 총 16개의 파일 스냅샷이 있으며, 각 데이터베이스 파일에 대해 8개(BACKUP DATABASE 문에서 하나, BACKUP LOG 문의 각 실행마다 하나씩)가 있습니다.

    백업 스냅샷 기록의 결과 집합을 보여주는 SSMS의 스크린샷

  7. 개체 탐색기에서 Azure Storage에 연결합니다.

  8. 컨테이너를 확장하고, 섹션 1에서 만든 컨테이너를 확장한 다음, 이전 섹션의 데이터 파일과 함께 7개의 새로운 백업 파일이 표시되는지 확인합니다(필요에 따라 노드 새로 고침).

    Azure Container에서 여러 스냅샷이 있는 SSMS의 개체 탐색기 스크린샷

7 - 특정 시점으로 데이터베이스 복원

이 섹션에서는 두 트랜잭션 로그 백업 사이의 특정 시점으로 AdventureWorks2022 데이터베이스를 복원합니다.

기존의 백업에서 특정 시점 복원을 수행하려면 전체 데이터베이스 백업, 차등 백업 및 복원하려는 시점 바로 다음까지의 모든 트랜잭션 로그 파일을 사용해야 합니다. 파일-스냅샷 백업을 사용할 경우 복원하려는 시간을 프레이밍하는 골대를 제공하는 두 개의 인접한 로그 백업 파일만 있으면 됩니다. 로그 백업을 할 때마다 각 데이터베이스 파일(각 데이터 파일 및 로그 파일)의 파일 스냅샷이 만들어지기 때문에 두 개의 로그 파일 스냅샷 백업 세트만 필요합니다.

파일 스냅샷 백업 세트에서 지정된 시점으로 데이터베이스를 복원하려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 새 쿼리 창을 열고 Azure 가상 머신에 있는 데이터베이스 엔진의 SQL Server 인스턴스에 연결합니다.

  3. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣은 다음 실행합니다. 4단계에서 행 수가 적은 시점으로 복원하기 전에 Production.Location 테이블에 29,939개의 행이 있는지 확인합니다.

    -- Verify row count at start
    SELECT COUNT (*) from AdventureWorks2022.Production.Location
    

    29,939개의 행 수를 보여주는 SSMS 결과의 스크린샷

  4. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣습니다. 두 개의 인접한 로그 백업 파일을 선택하고 파일 이름을 이 스크립트에 필요한 날짜와 시간으로 변환합니다. 섹션 1에서 지정한 컨테이너 및 스토리지 계정 이름에 맞게 URL을 수정하고 첫 번째 및 두 번째 백업 파일 이름을 제공한 다음, “June 26, 2018 01:48 PM”의 형식으로 STOPAT 시간을 제공하고 이 스크립트를 실행합니다. 이 스크립트를 완료하려면 몇 분 정도 걸립니다.

    -- restore and recover to a point in time between the times of two transaction log backups, and then verify the row count
    ALTER DATABASE AdventureWorks2022 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    RESTORE DATABASE AdventureWorks2022
       FROM URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/<firstbackupfile>.bak'
       WITH NORECOVERY,REPLACE;
    RESTORE LOG AdventureWorks2022
       FROM URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/<secondbackupfile>.bak'
       WITH RECOVERY, STOPAT = 'June 26, 2018 01:48 PM';
    ALTER DATABASE AdventureWorks2022 set multi_user;
    -- get new count
    SELECT COUNT (*) FROM AdventureWorks2022.Production.Location ;
    
  5. 출력을 검토합니다. 복원 후 행 개수는 18,389개로, 로그 백업 5와 6 사이의 행 개수입니다(사용자 행 개수는 다를 수 있음).

    18-thousand-rows.JPG.

8 - 로그 백업에서 새 데이터베이스로 복원

이 섹션에서는 파일-스냅샷 트랜잭션 로그 백업에서 AdventureWorks2022 데이터베이스를 새 데이터베이스로 복원합니다.

이 시나리오에서는 비즈니스 분석 및 보고를 위해 다른 가상 머신에서 SQL Server 인스턴스로 복원을 수행합니다. 다른 가상 머신의 다른 인스턴스로 복원하면 워크로드를 전용 및 크기가 지정된 가상 머신으로 오프로드하여 트랜잭션 시스템에서 리소스 요구 사항을 제거합니다.

트랜잭션 로그 백업에서 파일-스냅샷 백업을 사용한 복원은 매우 빠르며, 기존의 스트리밍 백업보다 훨씬 더 빠릅니다. 기존 스트리밍 백업을 사용하면 전체 데이터베이스 백업, 차등 백업 및 트랜잭션 로그 백업의 일부 또는 전부(또는 새로운 전체 데이터베이스 백업)를 사용해야 합니다. 그러나 파일-스냅샷 로그 백업을 사용하면 가장 최근의 로그 백업(또는 다른 로그 백업 또는 두 로그 백업 시간 사이의 지점으로 특정 시점 복원을 위한 두 개의 인접한 로그 백업)만 있으면 됩니다. 분명히 말하자면 파일-스냅샷 로그 백업을 할 때마다 각 데이터베이스 파일(각 데이터 파일 및 로그 파일)의 파일 스냅샷이 만들어지기 때문에 로그 파일-스냅샷 백업 세트가 하나만 필요합니다.

파일 스냅샷 백업을 사용하여 트랜잭션 로그 백업에서 새 데이터베이스로 데이터베이스를 복원하려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 새 쿼리 창을 열고 Azure 가상 머신에 있는 데이터베이스 엔진의 SQL Server 인스턴스에 연결합니다.

    참고 사항

    이전 섹션에서 사용한 것과 다른 Azure 가상 머신인 경우 2 - 공유 액세스 서명을 사용하여 SQL Server 자격 증명 만들기 단계를 수행했는지 확인합니다. 다른 컨테이너로 복원하려면 새 컨테이너에 대해 1 - 저장된 액세스 정책 및 공유 액세스 스토리지 만들기를 수행하세요.

  3. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣습니다. 사용할 로그 백업 파일을 선택합니다. 섹션 1에서 지정한 컨테이너 및 스토리지 계정 이름에 맞게 URL을 수정하고, 로그 백업 파일 이름을 제공한 다음, 이 스크립트를 실행합니다.

    -- restore as a new database from a transaction log backup file
    RESTORE DATABASE AdventureWorks2022_EOM
        FROM URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/<logbackupfile.bak>'
        WITH MOVE 'AdventureWorks2022_data' to 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2022_EOM_Data.mdf'
       , MOVE 'AdventureWorks2022_log' to 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/AdventureWorks2022_EOM_Log.ldf'
       , RECOVERY
    --, REPLACE
    
  4. 출력을 검토하여 복원에 성공했는지 확인합니다.

  5. 개체 탐색기에서 Azure Storage에 연결합니다.

  6. 컨테이너를 확장하고, 섹션 1에서 만든 컨테이너를 확장하고(필요한 경우 새로 고침), 이전 섹션의 Blob과 함께 새 데이터 및 로그 파일이 컨테이너에 표시되는지 확인합니다.

    새 데이터베이스에 대한 데이터 및 로그 파일을 보여주는 Azure 컨테이너의 SQL Server Management Studio 스토리지 브라우저 스크린샷

9 - 백업 세트 및 파일-스냅샷 백업 관리

이 섹션에서는 sp_delete_backup(Transact-SQL) 시스템 저장 프로시저를 사용하여 백업 세트를 삭제합니다. 이 시스템 저장 프로시저는 이 백업 세트와 연결된 각 데이터베이스 파일에서 백업 파일 및 파일 스냅샷을 삭제합니다.

참고 사항

Azure Blob Storage 컨테이너에서 백업 파일을 삭제하여 백업 세트를 삭제하려고 하면 백업 파일 자체만 삭제되고 연결된 파일 스냅샷은 그대로 유지됩니다. 이 상황에 처하게 되면 sys.fn_db_backup_file_snapshots(Transact-SQL) 시스템 함수를 사용하여 연결 없는 파일 스냅샷의 URL을 식별하고 sp_delete_backup_file_snapshot(Transact-SQL) 시스템 저장 프로시저를 사용하여 연결 없는 각 파일 스냅샷을 삭제합니다. 자세한 내용은 Azure의 데이터베이스 파일에 대한 파일-스냅샷 백업을 참조하세요.

파일-스냅샷 백업 세트를 삭제하려면 다음 단계를 따르세요.

  1. SSMS를 시작합니다.

  2. 새 쿼리 창을 열고 Azure 가상 머신에서 데이터베이스 엔진의 SQL Server 인스턴스(또는 이 컨테이너에서 읽고 쓸 수 있는 권한이 있는 SQL Server 인스턴스)에 연결합니다.

  3. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣습니다. 연결된 파일 스냅샷과 함께 삭제하려는 로그 백업을 선택합니다. 섹션 1에서 지정한 컨테이너 및 스토리지 계정 이름에 맞게 URL을 수정하고, 로그 백업 파일 이름을 제공한 다음, 이 스크립트를 실행합니다.

    sys.sp_delete_backup 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/tutorial-21764-20181003205236.bak';
    
  4. 개체 탐색기에서 Azure Storage에 연결합니다.

  5. 컨테이너를 확장하고 섹션 1에서 만든 컨테이너를 확장한 다음, 3단계에서 사용한 백업 파일이 이 컨테이너에 더 이상 표시되지 않는지 확인합니다(필요에 따라 노드 새로 고침).

    Azure 컨테이너 및 트랜잭션 로그 백업 Blob 삭제를 보여주는 SQL Server Management Studios 스토리지 브라우저의 두 스크린샷

  6. 다음 Transact-SQL 스크립트를 복사하여 쿼리 창에 붙여넣은 다음 실행하여 두 개의 파일 스냅샷이 삭제되었는지 확인합니다.

    -- verify that two file snapshots have been removed
    SELECT * from sys.fn_db_backup_file_snapshots ('AdventureWorks2022');
    

    삭제된 두 개의 파일 스냅샷을 보여주는 SSMS 결과 창의 스크린샷

10 - 리소스 제거

이 자습서를 완료하고 리소스를 절약하려면 이 자습서에서 만든 리소스 그룹을 삭제해야 합니다.

리소스 그룹을 삭제하려면 다음 Powershell 코드를 실행합니다.

# Define global variables for the script
$prefixName = '<prefix name>'  # should be the same as the beginning of the tutorial

# Set a variable for the name of the resource group you will create or use
$resourceGroupName=$prefixName + 'rg'

# Adds an authenticated Azure account for use in the session
Connect-AzAccount

# Set the tenant, subscription and environment for use in the rest of
Set-AzContext -SubscriptionId $subscriptionID
  
# Remove the resource group
Remove-AzResourceGroup -Name $resourceGroupName

다음 단계