Windows Azure Blob 저장소 서비스로 SQL Server 백업 및 복원

이 항목에서는 SQL Server 백업을 구성하고 Windows Azure Blob 저장소 서비스로 쓰고 복원하는 데 중심이 되는 개념, 고려 사항 및 예제 코드를 소개합니다. Windows Azure Blob 서비스를 사용하여 SQL Server 백업을 저장할 경우의 이점에 대해서도 간략하게 설명합니다.

SQL Server 2012 SP1 CU2에 릴리스된 이 기능을 사용하여 Windows Azure Blob 서비스로 바로 SQL Server 백업 및 복원이 가능합니다. 이 기능으로 Windows Azure 가상 컴퓨터 등의 호스팅 환경을 실행 중인 SQL Server 인스턴스나 온-프레미스 인스턴스에 SQL Server 데이터베이스를 백업할 수 있습니다. 클라우드에 백업은 가용성, 지리적으로 복제된 무제한 오프사이트 저장소 및 클라우드에서의 편리한 데이터 마이그레이션과 같은 이점을 제공합니다. 이 릴리스에서는 tsql이나 SMO를 사용하여 BACKUP 또는 RESTORE 문을 실행할 수 있습니다. 이 릴리스에서는 SQL Server Management Studio 백업 또는 복원 마법사를 사용하여 Windows Azure Blob 저장소 서비스로 백업하거나 복원할 수 없습니다.

SQL Server 2012 SP1 CU4에서는 PowerShell을 사용하여 Windows Azure Blob 저장소 서비스에 백업하고 이 백업을 복원할 수 있습니다. 이 업데이트를 요청하려면 이 기술 자료 문서를 참조하십시오. 이 항목의 예 섹션에는 PowerShell 스크립트가 포함되어 있습니다. 여러 백업을 관리하기 위한 PowerShell 스크립트 예는 Use PowerShell to Backup Multiple Databases to Windows Azure Blob Storage Service을 참조하십시오.

SQL Server 백업에 Windows Azure Blob 서비스를 사용할 경우의 이점

  • 유연하고 안정적인 무제한 오프사이트 저장소: Windows Azure Blob 서비스에 백업 저장은 편리하고 유연하며 쉽게 액세스할 수 있는 오프사이트 옵션입니다. 기존 스크립트/작업을 수정하는 것처럼 쉽게 SQL Server 백업에 사용할 오프사이트 저장소를 만들 수 있습니다. 오프사이트 저장소는 대개 오프사이트 및 프로덕션 데이터베이스 위치 모두에 영향을 줄 수 있는 재해 방지를 위해 프로덕션 데이터베이스 위치로부터 충분히 멀리 있어야 합니다. Blob 저장소 지리적 복제를 선택하여 전체 지역에 영향을 줄 수 있는 재해 발생에 대비한 추가 보호막을 만듭니다. 또한 언제 어디서나 백업을 사용할 수 있으며 복원을 위해 백업에 쉽게 액세스할 수 있습니다.

  • 백업 보관: Windows Azure Blob 저장소 서비스는 백업 보관에 자주 사용하는 테이프 옵션보다 더 효율적입니다. 테이프 저장소를 사용하려면 오프사이트 시설로 물리적 이동과 미디어 보호 조치가 필요합니다. Windows Azure Blob 저장소에 백업을 저장하면 빠르고 지속적이며 항상 사용 가능한 보관 옵션을 사용할 수 있습니다.

  • Windows Azure 서비스를 사용하면 하드웨어 관리에 따른 오버헤드가 없습니다. Windows Azure 서비스는 하드웨어를 관리하며 하드웨어 오류에 대비한 중복과 보호를 위해 지리적 복제를 제공합니다.

  • 현재 Windows Azure 가상 컴퓨터를 실행 중인 SQL Server 인스턴스의 경우 연결된 디스크를 만들어서 Windows Azure Blob 저장소 서비스로 백업할 수 있습니다. 그러나 Windows Azure 가상 컴퓨터에 연결할 수 있는 디스크 수에 제한이 있습니다. 초대형 인스턴스의 경우 16개이며, 그보다 작은 인스턴스의 경우 더 적습니다. Windows Azure Blob 저장소에 직접 백업하면 16개의 디스크 제한을 무시할 수 있습니다.

    또한 데이터베이스를 연결하고 분리하거나 VHD를 다운로드하고 연결할 필요 없이 온-프레미스 SQL Server나 Windows Azure 가상 컴퓨터에서 실행 중인 다른 SQL Server에서 Windows Azure Blob 저장소 서비스에 저장되는 백업 파일을 바로 사용할 수 있습니다

  • 비용상의 이점: 사용되는 서비스에 대한 비용만 지불합니다. 오프사이트 및 백업 보관 옵션만큼 비용 효율적일 수 있습니다. 자세한 내용과 링크는 Windows Azure 청구 고려 사항 섹션을 참조하십시오.

Windows Azure 청구 고려 사항:

Windows Azure 저장소 비용을 이해하면 Windows Azure에서 백업을 만들고 저장하는 데 드는 비용을 예측할 수 있습니다. 

Windows Azure 가격 계산기로 예상 비용을 계산할 수 있습니다.

저장소 요금은 사용 공간을 기준으로 하며 단계적 등급과 중복 수준에 따라 계산됩니다. 자세한 내용과 최선 정보는 가격 정보 문서의 데이터 관리 섹션을 참조하십시오.

데이터 전송: Windows Azure로의 인바운드 데이터 전송은 무료입니다. 아웃바운드 전송의 경우 대역폭 사용 요금이 부과되며 단계적 지역별 등급을 기준으로 계산됩니다. 자세한 내용은 가격 정보 문서의 데이터 전송 섹션을 참조하십시오.

요구 사항, 구성 요소 및 개념

섹션 내용

  • 보안

  • 주요 구성 요소 및 개념 소개

  • Windows Azure Blob 저장소 서비스

  • SQL Server 구성 요소

  • 제한 사항

  • Backup/Restore 문 지원

보안

다음은 Windows Azure Blob 저장소 서비스로 백업하거나 복원하는 경우 보안 고려 사항과 요구 사항입니다.

  • Windows Azure Blob 저장소 서비스의 컨테이너를 만들 때 액세스 권한을 개인으로 설정하는 것이 좋습니다. 액세스 권한을 개인으로 설정하면 사용자나 계정에 대한 액세스 시 필요한 정보를 제공해야 Windows Azure 계정 인증을 받을 수 있도록 제한됩니다.

    보안 정보보안 정보

    SQL Server에서는 SQL Server 자격 증명에 Windows Azure 계정 이름과 액세스 키 인증을 저장해야 합니다. 이 정보는 백업 또는 복원 작업을 수행할 때 Windows Azure 계정 인증을 받는 데 사용됩니다.

  • 백업 또는 복원 명령을 실행하는 데 사용되는 사용자 계정은 Alter any credential 사용 권한이 있는 db_backup operator데이터베이스 역할에 있어야 합니다.

필수 구성 요소 설치

  • Azure 가상 컴퓨터에서 실행 중인 SQL Server: Windows Azure 가상 컴퓨터에 SQL Server를 설치하는 경우 SQL Server 2012 SP1 CU2를 설치하거나 기존 인스턴스를 업데이트하십시오. Microsoft 고객 지원 센터에 업데이트를 요청하려면 이 문서를 참조하십시오.

  • SQL Server 온-프레미스: SQL Server 2012, SP1 CU2 이상 버전에 이 기능이 있습니다. Microsoft 고객 지원 센터에 업데이트를 요청하려면 이 문서를 참조하십시오.

주요 구성 요소 및 개념 소개

다음 두 섹션에서는 Windows Azure Blob 저장소 서비스와 Windows Azure Blob 저장소 서비스로 백업하거나 복원하는 데 사용되는 SQL Server구성 요소를 소개합니다. 구성 요소와 Windows Azure Blob 저장소 서비스로 백업하거나 복원할 때 구성 요소 간의 상호 작용을 이해하는 것이 중요합니다.

이 과정의 첫 단계는 Windows Azure 계정을 만드는 것입니다. SQL Server에서는 Windows Azure storage account name과 해당 access key 값을 사용하여 인증을 받으며 저장소 서비스에 blob을 쓰고 읽습니다. SQL Server자격 증명은 이 인증 정보를 저장하며 백업 또는 복원 작업 중에 사용됩니다. 저장소 계정을 만들고 간단한 복원을 수행하는 전체 연습은 SQL Server 백업 및 복원에 Windows Azure 저장소 서비스 사용 자습서를 참조하십시오.

SQL 자격 증명에 저장소 계정 매핑

Windows Azure Blob 저장소 서비스

저장소 계정: 저장소 계정은 모든 저장소 서비스의 시작 지점입니다. Windows Azure Blob 저장소 서비스에 액세스하려면 먼저 Windows Azure 저장소 계정을 만듭니다. Windows Azure Blob 저장소 서비스와 해당 구성 요소의 인증을 받으려면 storage account name과 해당 access key 속성이 필요합니다.

컨테이너: 컨테이너에서는 그룹화된 blob 집합을 제공하며 blob을 무제한으로 저장할 수 있습니다. Windows Azure Blob 서비스에 SQL Server 백업을 쓰려면 적어도 루트 컨테이너가 만들어져 있어야 합니다.

Blob: 모든 형식과 크기의 파일입니다. Windows Azure Blob 저장소 서비스에는 블록 Blob과 페이지 Blob이라는 두 가지 유형의 blob을 저장할 수 있습니다. SQL Server 백업에서는 페이지 Blob을 Blob 유형으로 사용합니다. Blob 주소를 https://<storage account>.blob.core.windows. net/<container>/<blob>의 URL 형식으로 지정할 수 있습니다.

Azure Blob 저장소

Windows Azure Blob 저장소 서비스에 대한 자세한 내용은 Windows Azure Blob 저장소 서비스 사용 방법을 참조하십시오.

페이지 Blob에 대한 자세한 내용은 블록 및 페이지 Blob 이해를 참조하십시오.

SQL Server 구성 요소

URL: URL은 고유한 백업 파일에 대한 URI(Uniform Resource Identifier)를 지정합니다. URL은 SQL Server 백업 파일의 위치와 이름을 제공하는 데 사용됩니다. 이 구현에서는 Windows Azure 저장소 계정의 페이지 Blob을 가리키는 URL만 유효합니다. URL은 컨테이너가 아닌 실제 Blob을 가리켜야 합니다. Blob이 없으면 만들어집니다. 기존 Blob을 지정하고 “WITH FORMAT” 옵션을 지정하지 않으면 BACKUP이 실패합니다.

주의 사항주의

백업 파일을 복사하고 Windows Azure Blob 저장소 서비스로 업로드하도록 선택하는 경우 페이지 Blob을 저장소 옵션으로 사용하십시오. 블록 Blob에서 복원은 지원되지 않습니다. 블록 Blob 유형에서 RESTORE는 오류와 함께 실패합니다.

URL 값 예: http[s]://ACCOUNTNAME.Blob.core.windows. net/<CONTAINER>/<FILENAME.bak>. HTTPS는 필수 사항은 아니지만 권장 사항입니다.

자격 증명: SQL Server 자격 증명은 SQL Server 외부의 리소스에 연결하는 데 필요한 인증 정보를 저장하는 데 사용되는 개체입니다. 여기에서는 SQL Server 백업 및 복원 프로세스에서 자격 증명을 사용하여 Windows Azure Blob 저장소 서비스의 인증을 받습니다. 자격 증명에는 저장소 계정 이름과 저장소 계정 액세스 키 값이 저장됩니다. 만든 자격 증명은 BACKUP/RESTORE 문을 실행할 때 WITH CREDENTIAL 옵션에 지정해야 합니다. 저장소 계정 access keys를 보거나 복사하거나 재생성하는 방법에 대한 자세한 내용은 저장소 계정의 액세스 키를 참조하십시오.

SQL Server 자격 증명을 만드는 방법에 대한 단계별 지침은 이 항목 뒷부분의 자격 증명 만들기를 참조하십시오.

자격 증명에 대한 자세한 내용은 자격 증명을 참조하십시오.

자격 증명이 사용되는 다른 예에 대한 정보는 SQL Server 에이전트 프록시 만들기를 참조하십시오.

제한 사항

  • 지원되는 최대 백업 크기는 1TB입니다.

  • 이 구현에서는 TSQL이나 SMO를 사용하여 백업 또는 복원 문을 실행할 수 있습니다. 현재 SQL Server Management Studio 백업 또는 복원 마법사로 Windows Azure Blob 저장소 서비스로 백업하거나 복원할 수는 없습니다.

  • 논리적 장치 이름을 만들 수 없습니다. 따라서 SQL Server Management Studio나 sp_dumpdevice를 사용하여 URL을 백업 장치로 추가할 수 없습니다.

  • 기존 백업 Blob에 추가는 지원되지 않습니다. 기존 Blob으로 백업은 WITH FORMAT 옵션을 사용하여 덮어쓸 수만 있습니다.

  • 단일 백업 작업에서 여러 blob으로 백업은 지원되지 않습니다. 예를 들어 다음은 오류를 반환합니다.

    BACKUP DATABASE AdventureWorks2012 
    TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_1.bak' 
       URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_2.bak' 
          WITH CREDENTIAL = 'mycredential' 
         ,STATS = 5;
    GO 
    
  • BACKUP에 블록 크기 지정은 지원되지 않습니다.

  • MAXTRANSFERSIZE 지정은 지원되지 않습니다.

  • RETAINDAYS와 EXPIREDATE 백업 세트 옵션 지정은 지원되지 않습니다.

  • SQL Server에서는 백업 장치 이름이 최대 259자로 제한됩니다. BACKUP TO URL에서 URL, ‘https://.blob.core.windows. net//.bak’를 지정하는 데 36자를 사용하여, 계정, 컨테이너 및 blob 이름에 사용할 수 있는 문자는 223자입니다.

Backup/Restore 문 지원

Backup/Restore 문

지원됨

예외

설명

BACKUP

BLOCKSIZE 및 MAXTRANSFERSIZE는 지원되지 않습니다.

WITH CREDENTIAL 지정 필요

RESTORE

WITH CREDENTIAL 지정 필요

RESTORE FILELISTONLY

WITH CREDENTIAL 지정 필요

RESTORE HEADERONLY

WITH CREDENTIAL 지정 필요

RESTORE LABELONLY

WITH CREDENTIAL 지정 필요

RESTORE VERIFYONLY

WITH CREDENTIAL 지정 필요

RESTORE REWINDONLY

구문과 Backup 문에 대한 자세한 내용은 BACKUP(Transact-SQL)을 참조하십시오.

구문과 Restore 문에 대한 자세한 내용은 RESTORE(Transact-SQL)를 참조하십시오.

Backup 인수 지원

인수

지원됨

예외

설명

DATABASE

LOG

TO (URL)

DISK 및 TAPE와 달리 URL은 논리적 이름 지정 및 작성을 지원하지 않습니다.

이 인수는 백업 파일에 대한 URL 경로를 지정하는 데 사용됩니다.

MIRROR TO

WITH OPTIONS:

CREDENTIAL

WITH CREDENTIAL은 BACKUP TO URL 옵션을 사용하여 Windows Azure Blob 저장소 서비스로 백업할 때만 지원됩니다.

DIFFERENTIAL

COPY_ONLY

COMPRESSION|NO_COMPRESSION

DESCRIPTION

NAME

EXPIREDATE | RETAINDAYS

NOINIT | INIT

이 옵션은 사용 시 무시됩니다.

Blob에 추가는 불가능합니다. 백업을 덮어쓰려면 FORMAT 인수를 사용하십시오.

NOSKIP | SKIP

NOFORMAT | FORMAT

이 옵션은 사용 시 무시됩니다.

WITH FORMAT을 지정하지 않으면 기존 blob으로 백업이 실패합니다. WITH FORMAT을 지정하면 기존 blob을 덮어씁니다.

MEDIADESCRIPTION

MEDIANAME

BLOCKSIZE

BUFFERCOUNT

MAXTRANSFERSIZE

NO_CHECKSUM | CHECKSUM

STOP_ON_ERROR | CONTINUE_AFTER_ERROR

STATS

REWIND | NOREWIND

UNLOAD | NOUNLOAD

NORECOVERY | STANDBY

NO_TRUNCATE

Backup 인수에 대한 자세한 내용은 BACKUP(Transact-SQL)을 참조하십시오.

Restore 인수 지원

인수

지원됨

예외

설명

DATABASE

LOG

FROM (URL)

FROM URL 인수는 백업 파일에 대한 URL 경로를 지정하는 데 사용됩니다.

WITH Options:

CREDENTIAL

WITH CREDENTIAL은 RESTORE FROM URL 옵션을 사용하여 Windows Azure Blob 저장소 서비스에서 복원할 때만 지원됩니다.

PARTIAL

RECOVERY | NORECOVERY | STANDBY

LOADHISTORY

MOVE

REPLACE

RESTART

RESTRICTED_USER

FILE

PASSWORD

MEDIANAME

MEDIAPASSWORD

BLOCKSIZE

BUFFERCOUNT

MAXTRANSFERSIZE

CHECKSUM | NO_CHECKSUM

STOP_ON_ERROR | CONTINUE_AFTER_ERROR

FILESTREAM

STATS

REWIND | NOREWIND

UNLOAD | NOUNLOAD

KEEP_REPLICATION

KEEP_CDC

ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER

STOPAT | STOPATMARK | STOPBEFOREMARK

Restore 인수에 대한 자세한 내용은 RESTORE 인수(Transact-SQL)를 참조하십시오.

이 섹션에서는 다음과 같은 예를 보여 줍니다.

  • 자격 증명 만들기

  • 전체 데이터베이스 백업

  • 데이터베이스 및 로그 백업

  • PRIMARY 파일 그룹의 전체 파일 백업 만들기

  • PRIMARY 파일 그룹의 차등 파일 백업 만들기

  • 데이터베이스 복원 및 파일 이동

  • STOPAT를 사용하여 지정 시간으로 복원

자격 증명 만들기

다음 예에서는 Windows Azure 저장소 인증 정보를 저장하는 자격 증명을 만듭니다.

  1. Tsql

    IF NOT EXISTS
    (SELECT * FROM sys.credentials 
    WHERE credential_identity = 'mycredential')
    CREATE CREDENTIAL mycredential WITH IDENTITY = 'mystorageaccount'
    ,SECRET = '<storage access key>' ;
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    string secret = "<storage access key>";
    
    // Create a Credential
    string credentialName = "mycredential";
    Credential credential = new Credential(server, credentialName);
    credential.Create(identity, secret);
    
  3. PowerShell

    # create variables
    $storageAccount = "mystorageaccount"
    $storageKey = "<storage access key>"
    $secureString = convertto-securestring $storageKey  -asplaintext -force
    $credentialName = "mycredential"
    
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # Create a credential
     New-SqlCredential -Name $credentialName -Path $srvpath -Identity $storageAccount -Secret $secureString
    

전체 데이터베이스 백업

다음 예에서는 Windows Azure Blob 저장소 서비스에 AdventureWorks2012 데이터베이스를 백업합니다.

  1. Tsql

    BACKUP DATABASE AdventureWorks2012 
    TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak' 
          WITH CREDENTIAL = 'mycredential' 
         ,COMPRESSION
         ,STATS = 5;
    GO 
    
  1. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  2. PowerShell

    # create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME" 
    # for default instance, the $srvpath varilable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance
    CD $srvPath 
    $backupFile = $backupUrlContainer + "AdventureWorks2012" +  ".bak"
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On   
    

데이터베이스 및 로그 백업

다음 예에서는 기본적으로 단순 복구 모델을 사용하는 AdventureWorks2012 예제 데이터베이스를 백업하고 로그 백업을 지원하기 위해 AdventureWorks2012 데이터베이스에서 전체 복구 모델을 사용하도록 수정합니다. 마지막으로 Windows Azure Blob에 대한 전체 데이터베이스 백업을 만들고 업데이트 작업 기간이 경과된 후 로그를 백업합니다. 이 예에서는 날짜/시간 스탬프를 포함한 백업 파일 이름을 만듭니다.

  1. Tsql

    -- To permit log backups, before the full database backup, modify the database 
    -- to use the full recovery model.
    USE master;
    GO
    ALTER DATABASE AdventureWorks2012
       SET RECOVERY FULL;
    GO
    
    
    -- Back up the full AdventureWorks2012 database.
           -- First create a file name for the backup file with DateTime stamp
    
    DECLARE @Full_Filename AS VARCHAR (300);
    SET @Full_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Full_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.bak'; 
    --Back up Adventureworks2012 database
    
    BACKUP DATABASE AdventureWorks2012
    TO URL =  @Full_Filename
    WITH CREDENTIAL = 'mycredential';
    ,COMPRESSION
    GO
    -- Back up the AdventureWorks2012 log.
    DECLARE @Log_Filename AS VARCHAR (300);
    SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
    BACKUP LOG AdventureWorks2012
     TO URL = @Log_Filename
    WITH CREDENTIAL = 'mycredential'
    ,COMPRESSION;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    
    // Generate Unique Url for data backup
    string urlDataBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Data-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup Database to Url
    Backup backupData = new Backup();
    backupData.CredentialName = credentialName;
    backupData.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backupData.Devices.AddDevice(urlDataBackup, DeviceType.Url);
    backupData.SqlBackup(server);
    
    // Generate Unique Url for data backup
    string urlLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Log-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup Database Log to Url
    Backup backupLog = new Backup();
    backupLog.CredentialName = credentialName;
    backupLog.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backupLog.Devices.AddDevice(urlLogBackup, DeviceType.Url);
    backupLog.Action = BackupActionType.Log;
    backupLog.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to theSQL Server Instance
    
    CD $srvPath 
    #Create a unique file name for the full database backup
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    #Backup Database to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Database  
    
    #Create a unique file name for log backup
    
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup Log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Log  
    

PRIMARY 파일 그룹의 전체 파일 백업 만들기

다음 예에서는 PRIMARY 파일 그룹의 전체 파일 백업을 만듭니다.

  1. Tsql

    --Back up the files in Primary:
    BACKUP DATABASE AdventureWorks2012
       FILEGROUP = 'Primary'
       TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012files.bck'
       WITH CREDENTIAL = 'mycredential'
       ,COMPRESSION;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bck",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Action = BackupActionType.Files;
    backup.DatabaseFileGroups.Add("PRIMARY");
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to the SQL Server Instance
    
    CD $srvPath 
    #Create a unique file name for the file backup
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bck"
    
    #Backup Primary File Group to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary  
    

PRIMARY 파일 그룹의 차등 파일 백업 만들기

다음 예에서는 PRIMARY 파일 그룹의 차등 파일 백업을 만듭니다.

  1. Tsql

    --Back up the files in Primary:
    BACKUP DATABASE AdventureWorks2012
       FILEGROUP = 'Primary'
       TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012filesdiff.bck'
       WITH 
          CREDENTIAL = 'mycredential'
          ,COMPRESSION
      ,DIFFERENTIAL;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Action = BackupActionType.Files;
    backup.DatabaseFileGroups.Add("PRIMARY");
    backup.Incremental = true;
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    #Create a differential backup of the primary filegroup
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary -Incremental  
    

데이터베이스 복원 및 파일 이동

전체 데이터베이스 백업을 복원하고 C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data 디렉터리로 복원한 데이터베이스를 이동하려면 다음 단계를 수행합니다.

  1. Tsql

    -- Backup the tail of the log first
    
    DECLARE @Log_Filename AS VARCHAR (300);
    SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
    BACKUP LOG AdventureWorks2012
     TO URL = @Log_Filename
    WITH CREDENTIAL = 'mycredential'
    ,NORECOVERY;
    GO
    
    RESTORE DATABASE AdventureWorks2012 FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
    WITH CREDENTIAL = 'mycredential'
    ,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
    ,MOVE 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
          ,STATS = 5 
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
    backup.SqlBackup(server);
    
    // Generate Unique Url for tail log backup
    string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup Tail Log to Url
    Backup backupTailLog = new Backup();
    backupTailLog.CredentialName = credentialName;
    backupTailLog.Database = dbName;
    backupTailLog.Action = BackupActionType.Log;
    backupTailLog.NoRecovery = true;
    backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
    backupTailLog.SqlBackup(server);
    
    // Restore a database and move files
    string newDataFilePath = server.MasterDBLogPath  + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
    string newLogFilePath = server.MasterDBLogPath  + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
    
    Restore restore = new Restore();
    restore.CredentialName = credentialName;
    restore.Database = dbName;
    restore.ReplaceDatabase = true;
    restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
    restore.RelocateFiles.Add(new RelocateFile(dbName+ "_Log", newLogFilePath));
    restore.SqlRestore(server); 
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTNACENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance 
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    # Full database backup to URL
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile  -SqlCredential $credentialName -CompressionOption On    
    
    #Create a unique file name for the tail log backup
    $backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup tail log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName  -BackupAction Log -NoRecovery  
    
    # Restore Database and move files
    
    $newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
    $newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
    
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath)  
    

STOPAT를 사용하여 지정 시간으로 복원

다음 예에서는 지정 시간의 상태로 데이터베이스를 복원하고 복원 작업을 보여 줍니다.

  1. Tsql

    RESTORE DATABASE AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak' 
    WITH 
     CREDENTIAL = 'mycredential'
    ,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
    ,Move 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
    ,NORECOVERY
    --,REPLACE
    ,STATS = 5;
    GO 
    
    RESTORE LOG AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.trn' 
    WITH CREDENTIAL = 'mycredential'
    ,RECOVERY 
    ,STOPAT = 'Oct 23, 2012 5:00 PM' 
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
    backup.SqlBackup(server);
    
    // Generate Unique Url for Tail Log backup
    string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup Tail Log to Url
    Backup backupTailLog = new Backup();
    backupTailLog.CredentialName = credentialName;
    backupTailLog.Database = dbName;
    backupTailLog.Action = BackupActionType.Log;
    backupTailLog.NoRecovery = true;
    backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
    backupTailLog.SqlBackup(server);
    
    // Restore a database and move files
    string newDataFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
    string newLogFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
    
    Restore restore = new Restore();
    restore.CredentialName = credentialName;
    restore.Database = dbName;
    restore.ReplaceDatabase = true;
    restore.NoRecovery = true;
    restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
    restore.RelocateFiles.Add(new RelocateFile(dbName + "_Log", newLogFilePath));
    restore.SqlRestore(server);
    
    // Restore transaction Log with stop at 
    Restore restoreLog = new Restore();
    restoreLog.CredentialName = credentialName;
    restoreLog.Database = dbName;
    restoreLog.Action = RestoreActionType.Log;
    restoreLog.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restoreLog.ToPointInTime = DateTime.Now.ToString(); 
    restoreLog.SqlRestore(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # Navigate to SQL Server Instance Directory
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    # Full database backup to URL
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile  -SqlCredential $credentialName -CompressionOption On   
    
    #Create a unique file name for the tail log backup
    $backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup tail log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName  -BackupAction Log -NoRecovery   
    
    # Restore Database and move files
    
    $newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
    $newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
    
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath) -NoRecovery  
    
    # Restore Transaction log with Stop At:
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backuplogFile  -ToPointInTime (Get-Date).ToString()