Поделиться через


Резервное копирование в SQL Server по URL-адресу

В этом разделе представлены основные понятия, требования и компоненты, необходимые для использования службы хранилища BLOB-объектов Azure в качестве места назначения резервного копирования. Функции резервного копирования и восстановления аналогичны при использовании DISK и TAPE, но имеют некоторые отличия. В данном разделе описаны различия и все важные исключения, а также приведено несколько примеров кода.

Требования, компоненты и основные понятия

В этом разделе:

Безопасность

Ниже приведены рекомендации по обеспечению безопасности и требования при резервном копировании или восстановлении из служб хранилища BLOB-объектов Azure.

  • При создании контейнера для службы хранилища BLOB-объектов Azure рекомендуется установить частный доступ. Установка закрытых прав доступа означает, что доступ получают только те пользователи и учетные записи, которые могут предоставить необходимую информацию для проверки подлинности в учетной записи Azure.

    Важно!

    SQL Server требуется, чтобы имя учетной записи Azure и проверка подлинности с помощью ключа доступа хранились в учетных данных SQL Server. Эти сведения используются для проверки подлинности в учетной записи Azure при выполнении операций резервного копирования или восстановления.

  • Учетная запись пользователя, применяемая для выдачи команды BACKUP или RESTORE, должна находиться в роли базы данных db_backup operator с разрешениями Alter any credential .

Введение в основные компоненты и понятия

В следующих двух разделах описана служба хранилища BLOB-объектов Azure и компоненты SQL Server, используемые при резервном копировании или восстановлении из службы хранилища BLOB-объектов Azure. Важно понимать компоненты и взаимодействие между ними для резервного копирования или восстановления из службы хранилища BLOB-объектов Azure.

Создание учетной записи Azure — это первый шаг к этому процессу. SQL Server использует имя учетной записи хранения Azure и значения ключа доступа для проверки подлинности, записи и чтения BLOB-объектов в службе хранилища. Учетные данные службы SQL Server хранят эту информацию для проверки подлинности и используются при выполнении операций резервного копирования или восстановления. Полное пошаговое руководство по созданию учетной записи хранения и выполнению простого восстановления см. в статье Руководство по использованию службы хранилища Azure для SQL Server резервного копирования и восстановления.

сопоставление учетной записи хранения с учетными данными SQL

Служба Хранилище BLOB-объектов Azure

Учетная запись хранения. Учетная запись хранения является отправной точкой для всех служб хранилища. Чтобы получить доступ к службе Хранилище BLOB-объектов Azure, сначала создайте учетную запись хранения Azure. Имя учетной записи хранения и ее свойства ключа доступа необходимы для проверки подлинности в службе Хранилище BLOB-объектов Azure и ее компонентах.

Контейнер: Контейнер обеспечивает группирование набора BLOB-объектов и может хранить неограниченное количество BLOB-объектов. Чтобы записать резервную копию SQL Server в службу BLOB-объектов Azure, необходимо создать по крайней мере корневой контейнер.

Большой двоичный объект. Файл любого типа и размера. Существует два типа BLOB-объектов, которые можно хранить в службе хранилища BLOB-объектов Azure: блочные и страничные BLOB-объекты. SQL Server резервном копировании в качестве типа BLOB-объекта используются страничные BLOB-объекты. Большие двоичные объекты можно адресовать в следующем формате URL-адреса: https://< storage account.blob.core.windows.net/>< container>/<blob>

Хранилище BLOB-объектов Azure

Дополнительные сведения о службе хранилища BLOB-объектов Azure см. в статье Использование службы Хранилище BLOB-объектов Azure.

Дополнительные сведения о страничных BLOB-объектах см. в статье Understanding Block and Page Blobs (Основные сведения о блочных, добавочных и страничных BLOB-объектах).

Компоненты SQL Server

URL-адрес. URL-адрес определяет универсальный идентификатор ресурса (URI) для уникального файла резервной копии. URL-адрес используется для предоставления местоположения и имени файла резервной копии SQL Server . В этой реализации единственным допустимым URL-адресом является url-адрес, указывающий на страничный BLOB-объект в учетной записи хранения Azure. URL-адрес должен указывать на фактический большой двоичный объект, а не просто контейнер. Если большой двоичный объект не существует, он будет создан. Если указан существующий BLOB-объект, резервное копирование завершается ошибкой, если не указан параметр WITH FORMAT.

Предупреждение

Если вы решили скопировать и отправить файл резервной копии в службу хранилища BLOB-объектов Azure, используйте страничный BLOB-объект в качестве хранилища. Восстановление из блочных больших двоичных объектов не поддерживается. Попытка выполнить RESTORE из большого двоичного объекта блочного типа приводит к ошибке.

Ниже приведен пример значения URL-адреса: http[s]://ACCOUNTNAME.Blob.core.windows.net/< CONTAINER>/<FILENAME.bak>. Указывать HTTPS необязательно, но рекомендуется.

Учетные данные. Учетные данные SQL Server являются объектом, который используется для хранения информации о проверке подлинности, которая необходима для подключения к источнику за пределами SQL Server. Здесь SQL Server процессах резервного копирования и восстановления используют учетные данные для проверки подлинности в службе хранилища BLOB-объектов Azure. Учетные данные хранят имя учетной записи хранилища и значения ключа доступа учетной записи хранилища. После создания учетных данных их необходимо указать в параметре WITH CREDENTIAL при выполнении инструкций BACKUP/RESTORE. Дополнительную информацию о просмотре, копировании или повторном создании учетной записи хранилища access keysсм. в разделе Ключи доступа к учетной записи.

Пошаговые инструкции по созданию учетных данных SQL Server см. в разделе Пример создания учетных данных далее в этой статье.

Общие сведения об учетных данных см. в разделе Учетные данные.

Дополнительные сведения о других примерах использования учетных данных см. в статье Создание прокси-сервера агент SQL Server.

Ограничения

  • Резервное копирование в хранилище класса Premium не поддерживается.

  • Максимальный поддерживаемый размер резервной копии — 1 ТБ.

  • Инструкции резервного копирования и восстановления можно выполнить с помощью TSQL, SMO и командлетов PowerShell. Резервное копирование или восстановление из службы хранилища BLOB-объектов Azure с помощью SQL Server Management Studio мастера резервного копирования или восстановления в настоящее время не включено.

  • Функция создания логического имени устройства не поддерживается. Таким образом, не поддерживается функция добавления URL-адреса в качестве устройства резервного копирования с помощью sp_dumpdevice или SQL Server Management Studio.

  • Функция присоединения к существующим резервным большим двоичным объектам не поддерживается. Создать резервную копию в существующем большом двоичном объекте можно только путем перезаписи с помощью параметра WITH FORMAT.

  • Функция создания резервных копий в нескольких больших двоичных объектах в одной операции резервного копирования не поддерживается. К примеру, следующие действия приводят к ошибке.

    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 использует 36 символов для необходимых элементов, которые нужны для указания URL (https://.blob.core.windows.net//.bak ), оставляя 223 символа для имен учетной записи, контейнера и большого двоичного объекта.

Поддержка инструкций резервного копирования и восстановления

Инструкции 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 (Transact-SQL).

Общую информацию и синтаксис инструкций восстановления см. в разделе RESTORE (Transact-SQL).

Поддержка аргументов резервного копирования

Аргумент Поддерживается Исключение Комментарии
DATABASE
LOG
TO (URL) В отличие от DISK и TAPE URL-адрес не поддерживает функцию указания или создания логического имени. Этот аргумент используется, чтобы указать URL-адрес для файла резервной копии.
MIRROR TO
WITH OPTIONS:
CREDENTIAL ПАРАМЕТР WITH CREDENTIAL поддерживается только при использовании параметра BACKUP TO URL для резервного копирования в службу хранилища BLOB-объектов Azure.
DIFFERENTIAL (разностная)
COPY_ONLY
COMPRESSION|NO_COMPRESSION
DESCRIPTION
ИМЯ
EXPIREDATE | RETAINDAYS
NOINIT | INIT Даже если этот параметр указан, он пропускается.

Добавление к большим двоичным объектам невозможно. Для перезаписи резервной копии используйте аргумент FORMAT.
NOSKIP | SKIP
NOFORMAT | FORMAT Даже если этот параметр указан, он пропускается.

Создание резервных копий в существующем большом двоичном объекте завершается ошибкой, если не указан аргумент WITH FORMAT. Если аргумент WITH FORMAT указан, существующий большой двоичный объект будет перезаписан.
MEDIADESCRIPTION
MEDIANAME
BLOCKSIZE
BUFFERCOUNT
MAXTRANSFERSIZE
NO_CHECKSUM | CHECKSUM
STOP_ON_ERROR | CONTINUE_AFTER_ERROR
STATS
REWIND | NOREWIND
UNLOAD | NOUNLOAD
NORECOVERY | STANDBY
NO_TRUNCATE

Дополнительные сведения об аргументах резервного копирования см. в разделе BACKUP (Transact-SQL).

Поддержка аргументов восстановления

Аргумент Поддерживается Исключения Комментарии
DATABASE
LOG
FROM (URL) Аргумент FROM URL используется, чтобы указать URL-адрес для файла резервной копии.
WITH Options:
CREDENTIAL ПАРАМЕТР WITH CREDENTIAL поддерживается только при использовании параметра RESTORE FROM URL для восстановления из Хранилище BLOB-объектов Azure службы.
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 (Transact-SQL).

Использование задачи резервного копирования в среде SQL Server Management Studio

Задача резервного копирования в SQL Server Management Studio была расширена, чтобы включить URL-адрес в качестве одного из вариантов назначения и другие вспомогательные объекты, необходимые для резервного копирования в хранилище Azure, например учетные данные SQL.

Ниже описаны изменения, внесенные в задачу резервного копирования базы данных, чтобы обеспечить резервное копирование в службу хранилища Azure.

  1. Запустите среду SQL Server Management Studio и подключитесь к экземпляру SQL Server. Выберите базу данных, для которой требуется создать резервную копию, щелкните правой кнопкой мыши Задачи и выберите Создать резервную копию... Откроется диалоговое окно Резервное копирование базы данных.

  2. На странице "Общие" параметр URL-адреса используется для создания резервной копии в хранилище Azure. Если выбран этот параметр, на странице будут показаны другие параметры.

    1. Имя файла. Имя файла резервной копии.

    2. Учетные данные SQL: Вы можете указать существующие учетные данные SQL Server или создать новый, щелкнув Создать рядом с полем Учетные данные SQL.

      Важно!

      В диалоговом окне, которое открывается при нажатии кнопки Создать , необходимо ввести сертификат управления или профиль публикации подписки. SQL Server в настоящий момент поддерживает версию 2.0 профиля публикации. Для загрузки поддерживаемой версии профиля публикации см. раздел Загрузка профиля публикации 2.0.

      Если у вас нет доступа к сертификату управления или профилю публикации, можно создать учетные данные SQL, указав имя учетной записи хранилища и сведения ключа доступа при помощи Transact-SQL или SQL Server Management Studio. Образец кода для создания учетных данных с помощью Transact-SQL см. в разделе Создание учетных данных . Также можно в среде SQL Server Management Studio, из экземпляра компонента database engine, щелкнуть правой кнопкой мыши Безопасностьи выбрать пункт Создать, а затем Учетные данные. Укажите имя учетной записи хранения в поле Идентификатор и ключ доступа в поле Пароль .

    3. Контейнер службы хранилища Azure: Имя контейнера службы хранилища Azure для хранения файлов резервных копий.

    4. Префикс URL-адреса. Создается автоматически на основе сведений, указанных в полях, описанных на предыдущих шагах. При изменении этого значения вручную убедитесь в том, что оно соответствует прочим данным, указанным ранее. Например, при изменении URL-адреса хранения убедитесь, что учетные данные SQL заданы для проверки подлинности в той же самой учетной записи хранения.

При выборе URL-адреса в качестве назначения некоторые параметры на странице Параметры носителя отключаются. Следующие разделы содержат дополнительные сведения о диалоговом окне «Резервное копирование базы данных»:

Резервное копирование базы данных (страница «Общие»)

Резервное копирование базы данных (страница «Параметры носителя»)

Резервное копирование базы данных (страница «Параметры резервного копирования»)

Создание учетных данных — проверка подлинности в хранилище Azure

Резервное копирование SQL Server на URL-адрес с помощью мастера планов обслуживания

Как и в описанной выше задаче резервного копирования, мастер планов обслуживания в SQL Server Management Studio был расширен, чтобы включить URL-адрес в качестве одного из вариантов назначения и другие вспомогательные объекты, необходимые для резервного копирования в хранилище Azure, такие как учетные данные SQL. Дополнительные сведения см. в разделе Определение задач резервного копирования мастера использования планов обслуживания.

Восстановление из хранилища Azure с помощью SQL Server Management Studio

При восстановлении базы данных URL-адрес включается в качестве устройства для восстановления с него. Ниже описаны изменения в задаче "Восстановление", чтобы разрешить восстановление из службы хранилища Azure.

  1. При выборе пункта Устройства на странице Общие задачи восстановления в SQL Server Management Studio открывается диалоговое окно Выберите устройства резервного копирования , где в качестве типа носителя резервной копии можно выбрать URL-адрес .

  2. Если выбрать вариант URL-адрес и нажать Добавить, откроется диалоговое окно Подключение к хранилищу Azure . Укажите учетные данные SQL для проверки подлинности в службе хранилища Azure.

  3. SQL Server затем подключается к хранилищу Azure с помощью предоставленных учетных данных SQL и открывает диалоговое окно Поиск файла резервной копии в Azure. Файлы резервной копии, находящиеся в хранилище, отобразятся на этой странице. Выберите файл, который требуется использовать для восстановления, и нажмите кнопку ОК. Откроется диалоговое окно Выбор устройств резервного копирования. При нажатии кнопки ОК в этом диалоговом окне вы вернеесь в диалоговое окно восстановления main, где вы сможете завершить восстановление. Дополнительные сведения см. в разделах:

    Восстановление базы данных (страница "Общие")

    Восстановление базы данных (страница «Файлы»)

    Восстановление базы данных (страница «Параметры»)

Примеры кода

В этом разделе содержатся следующие примеры.

Создание учетных данных

В следующем примере создаются учетные данные, в котором хранятся сведения о проверке подлинности службы хранилища Azure.

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 в службу хранилища BLOB-объектов Azure.

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 перенастраивается на использование модели полного восстановления. Затем в примере создается полная резервная копия базы данных в BLOB-объекте Azure, а по истечении периода обновления создается резервная копия журнала. В этом примере будет создано имя резервной копии файла с меткой времени.

-- 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()

См. также

Резервное копирование SQL Server на URL-адрес — рекомендации и устранение неполадок.
Резервное копирование и восстановление системных баз данных (SQL Server)