이 항목에서는 Azure Blob Storage 서비스를 백업 대상으로 사용하는 데 필요한 개념, 요구 사항 및 구성 요소를 소개합니다. 백업 및 복원 기능은 디스크 또는 TAPE를 사용할 때와 동일하거나 유사하며 몇 가지 차이점이 있습니다. 차이점과 주목할만한 예외 사항, 그리고 몇 가지 코드 예제는 이 주제에 포함되어 있습니다.
요구 사항, 구성 요소 및 개념
이 섹션에서는:
안전
다음은 Azure Blob Storage 서비스에 백업하거나 복원할 때의 보안 고려 사항 및 요구 사항입니다.
Azure Blob Storage 서비스에 대한 컨테이너를 만들 때 프라이빗에 대한 액세스를 설정하는 것이 좋습니다. 프라이빗에 대한 액세스를 설정하면 Azure 계정에 인증하는 데 필요한 정보를 제공할 수 있는 사용자 또는 계정에 대한 액세스가 제한됩니다.
중요합니다
SQL Server를 사용하려면 Azure 계정 이름 및 액세스 키 인증을 SQL Server 자격 증명에 저장해야 합니다. 이 정보는 백업 또는 복원 작업을 수행할 때 Azure 계정에 인증하는 데 사용됩니다.
BACKUP 또는 RESTORE 명령을 발급하는 데 사용되는 사용자 계정은 자격 증명 변경 권한이 있는 db_backup 연산자 데이터베이스 역할에 있어야 합니다.
주요 구성 요소 및 개념 소개
다음 두 섹션에서는 Azure Blob Storage 서비스 및 Azure Blob Storage 서비스에 백업하거나 복원할 때 사용되는 SQL Server 구성 요소를 소개합니다. Azure Blob Storage 서비스에 백업을 수행하거나 복원하려면 구성 요소와 구성 요소 간의 상호 작용을 이해하는 것이 중요합니다.
Azure 계정을 만드는 것이 이 프로세스의 첫 번째 단계입니다. SQL Server는 Azure Storage 계정 이름 및 액세스 키 값을 사용하여 Blob을 인증하고 스토리지 서비스에 쓰고 읽습니다. SQL Server 자격 증명은 해당 인증 정보를 저장하며 백업 또는 복원 작업 중에 사용됩니다. 스토리지 계정을 만들고 간단한 복원을 수행하는 전체 연습은 SQL Server 백업 및 복원에 Azure Storage 서비스를 사용하는 자습서를 참조하세요.
Azure Blob Storage 서비스
스토리지 계정: 스토리지 계정은 모든 스토리지 서비스의 시작점입니다. Azure Blob Storage 서비스에 액세스하려면 먼저 Azure Storage 계정을 만듭니다. Azure Blob Storage 서비스 및 해당 구성 요소에 인증하려면 스토리지 계정 이름 및 액세스 키 속성이 필요합니다.
컨테이너: 컨테이너는 Blob 집합의 그룹화 기능을 제공하며, Blob을 무제한으로 저장할 수 있습니다. Azure Blob Service에 SQL Server 백업을 작성하려면 루트 컨테이너가 하나 이상 생성되어야 합니다.
Blob: 모든 형식 및 크기의 파일입니다. Azure Blob Storage 서비스에 저장할 수 있는 Blob에는 블록 및 페이지 Blob의 두 가지 유형이 있습니다. SQL Server 백업은 Blob 형식으로 페이지 Blob을 사용합니다. Blob은 다음 URL 형식인 https:// storage account.blob.core.windows.net/<<> container>/<blob을 사용하여 주소를 지정할 수 있습니다.>
Azure Blob Storage 서비스에 대한 자세한 내용은 Azure Blob Storage 서비스를 사용하는 방법을 참조하세요.
페이지 Blob에 대한 자세한 내용은 블록 Blob 및 페이지 Blob 이해를 참조하세요.
SQL Server 구성 요소
URL: URL은 고유한 백업 파일에 대한 URI(Uniform Resource Identifier)를 지정합니다. URL은 SQL Server 백업 파일의 위치와 이름을 제공하는 데 사용됩니다. 이 구현에서 유효한 URL은 Azure Storage 계정의 페이지 Blob을 가리키는 URL뿐입니다. URL은 컨테이너뿐만 아니라 실제 Blob을 가리킵니다. Blob이 존재하지 않으면 생성됩니다. 기존 Blob을 지정하면 "WITH FORMAT" 옵션을 지정하지 않으면 BACKUP이 실패합니다.
경고
Azure Blob Storage 서비스에 백업 파일을 복사하고 업로드하도록 선택하는 경우 페이지 Blob을 스토리지 옵션으로 사용합니다. 블록 Blob에서 복원은 지원되지 않습니다. 블록 Blob 유형에서 RESTORE는 오류와 함께 실패합니다.
샘플 URL 값은 http[s]://ACCOUNTNAME.Blob.core.windows.net/<CONTAINER>/<FILENAME.bak>. HTTPS는 필요하지 않지만 권장됩니다.
자격 증명: SQL Server 자격 증명은 SQL Server 외부의 리소스에 연결하는 데 필요한 인증 정보를 저장하는 데 사용되는 개체입니다. 여기서 SQL Server 백업 및 복원 프로세스는 자격 증명을 사용하여 Azure Blob Storage 서비스에 인증합니다. 자격 증명은 스토리지 계정의 이름과 스토리지 계정 액세스 키 값을 저장합니다. 자격 증명이 만들어지면 BACKUP/RESTORE 문을 발급할 때 WITH CREDENTIAL 옵션에 지정해야 합니다. 스토리지 계정 액세스 키를 보거나 복사하거나 다시 생성하는 방법에 대한 자세한 내용은 Storage 계정 액세스 키를 참조하세요.
SQL Server 자격 증명을 만드는 방법에 대한 단계별 지침은 이 항목의 뒷부분에 있는 자격 증명 만들기 예제를 참조하세요.
자격 증명에 대한 일반적인 내용은 자격 증명을 참조하세요.
자세한 내용은 자격 증명이 사용되는 다른 예제에서 SQL Server 에이전트 프록시 만들기를 참조하세요.
제한점
Premium Storage에 대한 백업은 지원되지 않습니다.
지원되는 최대 백업 크기는 1TB입니다.
TSQL, SMO 또는 PowerShell cmdlet을 사용하여 백업 또는 복원 문을 실행할 수 있습니다. SQL Server Management Studio 백업 또는 복원 마법사를 사용하여 Azure Blob Storage 서비스에 백업하거나 복원할 수 없습니다.
논리 디바이스 이름 만들기는 지원되지 않습니다. 따라서 SP_DUMPDEVICE 사용하거나 SQL Server Management Studio를 통해 백업 디바이스로 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자입니다.
백업/복원 문장 지원
백업/복원 문장 | 지원됨 | 예외 | 코멘트 |
백업 | ✓ | BLOCKSIZE 및 MAXTRANSFERSIZE는 지원되지 않습니다. | WITH CREDENTIAL이 지정되어 있어야 합니다. |
복원 | ✓ | WITH CREDENTIAL이 지정되어 있어야 합니다. | |
FILELISTONLY를 복원 | ✓ | WITH CREDENTIAL이 지정되어 있어야 합니다. | |
RESTORE HEADERONLY (헤더만 복원) | ✓ | WITH CREDENTIAL을 지정해야 합니다. | |
레이블만 복원 | ✓ | WITH CREDENTIAL이 지정되어 있어야 합니다. | |
복원 검증 전용 (RESTORE VERIFYONLY) | ✓ | WITH CREDENTIAL이 지정되어 있어야 합니다. | |
RESTORE REWINDONLY (복원 및 재생 전용) | ✓ |
백업 문에 대한 구문 및 일반 정보는 BACKUP(Transact-SQL)을 참조하세요.
복원 문에 대한 구문 및 일반 정보는 RESTORE(Transact-SQL)를 참조하세요.
Backup 인수 지원
논쟁 | 지원됨 | 예외 | 코멘트 |
데이터베이스 | ✓ | ||
로그 | ✓ | ||
TO(URL) | ✓ | DISK 및 TAPE와 달리 URL은 논리 이름을 지정하거나 만드는 것을 지원하지 않습니다. | 이 인수는 백업 파일의 URL 경로를 지정하는 데 사용됩니다. |
미러링하기 | ✓ | ||
옵션 포함: | |||
자격 증명 | ✓ | WITH CREDENTIAL은 BACKUP TO URL 옵션을 사용하여 Azure Blob Storage 서비스에 백업할 때만 지원됩니다. | |
미분 | ✓ | ||
COPY_ONLY | ✓ | ||
압축|비압축 | ✓ | ||
설명 | ✓ | ||
이름 | ✓ | ||
만료일자 | 보존일수 | ✓ | ||
NOINIT | INIT | ✓ | 이 옵션은 사용되는 경우 무시됩니다. Blob에 추가할 수 없습니다. 백업을 덮어쓰려면 FORMAT 인수를 사용합니다. |
|
NOSKIP | 건너뛰다 | ✓ | ||
NOFORMAT | 판 | ✓ | 이 옵션은 사용되는 경우 무시됩니다. WITH FORMAT을 지정하지 않으면 기존 Blob으로 가져온 백업이 실패합니다. WITH FORMAT을 지정하면 기존 Blob을 덮어씁니다. |
|
미디어 설명 | ✓ | ||
MEDIANAME | ✓ | ||
블록 크기 | ✓ | ||
버퍼 수 | ✓ | ||
MAXTRANSFERSIZE | ✓ | ||
노체크섬 | 체크섬 | ✓ | ||
오류 발생 시 중지 | 오류 발생 후 계속 | ✓ | ||
통계 | ✓ | ||
REWIND | NOREWIND | ✓ | ||
UNLOAD | NOUNLOAD | ✓ | ||
NORECOVERY | 대기 모드 | ✓ | ||
NO_TRUNCATE | ✓ |
백업 인수에 대한 자세한 내용은 BACKUP(Transact-SQL)을 참조하세요.
복원 인수 지원
논쟁 | 지원됨 | 예외 | 코멘트 |
데이터베이스 | ✓ | ||
로그 | ✓ | ||
출처 (URL) | ✓ | FROM URL 인수는 백업 파일의 URL 경로를 지정하는 데 사용됩니다. | |
WITH 옵션: | |||
자격 증명 | ✓ | WITH CREDENTIAL은 RESTORE FROM URL 옵션을 사용하여 Azure Blob Storage 서비스에서 복원하는 경우에만 지원됩니다. | |
부분적인 | ✓ | ||
RECOVERY | NORECOVERY | 대기 모드 | ✓ | ||
기록 불러오기 | ✓ | ||
움직이다 | ✓ | ||
교체하다 | ✓ | ||
다시 시작 | ✓ | ||
제한된 사용자 | ✓ | ||
파일 | ✓ | ||
비밀번호 | ✓ | ||
MEDIANAME | ✓ | ||
MEDIAPASSWORD | ✓ | ||
블록 크기 | ✓ | ||
버퍼 수 | ✓ | ||
MAXTRANSFERSIZE | ✓ | ||
체크섬 | 체크섬 없음 | ✓ | ||
오류 발생 시 중지 | 오류 발생 후 계속 | ✓ | ||
FILESTREAM | ✓ | ||
통계 | ✓ | ||
REWIND | NOREWIND | ✓ | ||
UNLOAD | NOUNLOAD | ✓ | ||
유지_복제 | ✓ | ||
KEEP_CDC | ✓ | ||
ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER | ✓ | ||
STOPAT | STOPATMARK | STOPBEFOREMARK | ✓ |
복원 인수에 대한 자세한 내용은 RESTORE 인수(Transact-SQL)를 참조하세요.
SQL Server Management Studio에서 백업 작업 사용
SQL Server Management Studio의 백업 작업은 URL을 대상 옵션 중 하나로 포함하고 SQL 자격 증명과 같은 Azure Storage에 백업하는 데 필요한 기타 지원 개체를 포함하도록 향상되었습니다.
다음 단계에서는 Azure Storage에 백업할 수 있도록 데이터베이스 백업 작업의 변경 내용을 설명합니다.
SQL Server Management Studio를 시작하고 SQL Server 인스턴스에 연결합니다. 백업할 데이터베이스를 선택하고 작업을 마우스 오른쪽 단추로 클릭하고 백업을 선택합니다. 데이터베이스 백업 대화 상자가 열립니다.
일반 페이지에서 URL 옵션은 Azure Storage에 대한 백업을 만드는 데 사용됩니다. 이 옵션을 선택하면 이 페이지에서 사용할 수 있는 다른 옵션이 표시됩니다.
파일 이름: 백업 파일의 이름입니다.
SQL 자격 증명: 기존 SQL Server 자격 증명을 지정하거나 SQL 자격 증명 상자 옆에 있는 만들기 를 클릭하여 새 자격 증명을 만들 수 있습니다.
중요합니다
만들기를 클릭할 때 열리는 대화 상자에는 구독에 대한 관리 인증서 또는 게시 프로필이 필요합니다. SQL Server는 현재 프로필 버전 2.0 게시를 지원합니다. 지원되는 버전의 게시 프로필을 다운로드하려면 게시 프로필 2.0 다운로드를 참조하세요.
관리 인증서 또는 게시 프로필에 액세스할 수 없는 경우 Transact-SQL 또는 SQL Server Management Studio를 사용하여 스토리지 계정 이름 및 액세스 키 정보를 지정하고 SQL 자격 증명을 만들 수 있습니다. Transact-SQL을 사용하여 자격 증명을 만들려면 자격 증명 만들기 섹션의 샘플 코드를 참조하세요. 또는 데이터베이스 엔진 인스턴스에서 SQL Server Management Studio를 사용하여 보안을 마우스 오른쪽 단추로 클릭하고 새로 만들기를 선택하고 자격 증명을 선택합니다. ID의 스토리지 계정 이름과 암호 필드의 액세스 키를 지정합니다.
Azure Storage 컨테이너: 백업 파일을 저장할 Azure Storage 컨테이너의 이름입니다.
URL 접두사: 이는 이전 단계에서 설명한 필드에 지정된 정보를 사용하여 자동으로 빌드됩니다. 이 값을 수동으로 편집하는 경우 이전에 제공한 다른 정보와 일치하는지 확인합니다. 예를 들어 스토리지 URL을 수정하는 경우 SQL 자격 증명이 동일한 스토리지 계정에 인증되도록 설정되어 있는지 확인합니다.
URL을 대상으로 선택하면 미디어 옵션 페이지의 특정 옵션을 사용할 수 없습니다. 다음 항목에서는 데이터베이스 백업 대화 상자에 대한 자세한 정보를 제공합니다.
보수 계획 마법사를 사용하여 URL에 SQL Server 백업 수행
앞에서 설명한 백업 작업과 마찬가지로 SQL Server Management Studio의 유지 관리 계획 마법사는 대상 옵션 중 하나로 URL 을 포함하도록 향상되었으며 SQL 자격 증명과 같은 Azure Storage에 백업하는 데 필요한 기타 지원 개체도 포함되었습니다. 자세한 내용은 유지 관리 계획 사용 마법사의 백업 작업 정의 섹션을 참조하세요.
SQL Server Management Studio를 사용하여 Azure Storage에서 복원
데이터베이스를 복원하는 경우 URL 이 복원할 디바이스로 포함됩니다. 다음 단계에서는 Azure Storage에서 복원할 수 있도록 복원 작업의 변경 내용을 설명합니다.
SQL Server Management Studio에서 복원 작업의 일반 페이지에서 디바이스를 선택하면 백업 미디어 유형으로 URL이 포함된 백업 디바이스 선택 대화 상자로 이동합니다.
URL을 선택하고 추가를 클릭하면 Azure 스토리지에 연결 대화 상자가 열립니다. Azure Storage에 인증할 SQL 자격 증명 정보를 지정합니다.
그런 다음, SQL Server는 제공한 SQL 자격 증명 정보를 사용하여 Azure Storage에 연결하고 Azure에서 백업 파일 찾기 대화 상자를 엽니다. 스토리지에 있는 백업 파일이 이 페이지에 표시됩니다. 복원하는 데 사용할 파일을 선택하고 확인을 클릭합니다. 그러면 백업 디바이스 선택 대화 상자로 돌아가서 이 대화 상자에서 확인을 클릭하면 기본 복원 대화 상자로 돌아가서 복원을 완료할 수 있습니다. 자세한 내용은 다음 항목을 참조하세요.
코드 예제
이 섹션에는 다음 예제가 포함되어 있습니다.
자격 증명 만들기
다음 예제에서는 Azure Storage 인증 정보를 저장하는 자격 증명을 만듭니다.
IF NOT EXISTS
(SELECT * FROM sys.credentials
WHERE credential_identity = 'mycredential')
CREATE CREDENTIAL mycredential WITH IDENTITY = 'mystorageaccount'
,SECRET = '<storage access key>' ;
// 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);
# 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
전체 데이터베이스 백업
다음 예제에서는 AdventureWorks2012 데이터베이스를 Azure Blob Storage 서비스에 백업합니다.
BACKUP DATABASE AdventureWorks2012
TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
WITH CREDENTIAL = 'mycredential'
,COMPRESSION
,STATS = 5;
GO
// 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);
# 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 데이터베이스가 전체 복구 모델을 사용하도록 수정됩니다. 그런 다음, Azure Blob에 대한 전체 데이터베이스 백업을 만들고, 업데이트 작업의 기간 후에 로그를 백업합니다. 이 예제에서는 datetime 스탬프를 사용하여 백업 파일 이름을 만듭니다.
-- 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
// 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);
#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
주 파일 그룹의 전체 파일 백업 만들기
다음 예제에서는 기본 파일 그룹의 전체 파일 백업을 만듭니다.
--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
// 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);
#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
주 파일 그룹의 차등 파일 백업 만들기
다음 예제에서는 주 파일 그룹의 차등 파일 백업을 만듭니다.
--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
// 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);
#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\MSSQL12 이동하려면 MSSQLSERVER\MSSQL\Data 디렉터리는 다음 단계를 사용합니다.
-- 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
// 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);
#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를 사용하여 지정 시간으로 복원
다음 예에서는 데이터베이스를 특정 시점으로 복원하고 복원 작업을 보여 줍니다.
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
// 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);
#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()
또한 참조하십시오
URL에 SQL Server 백업 모범 사례 및 문제 해결
시스템 데이터베이스 백업 및 복원(SQL Server)