Резервное копирование и восстановление SQL Server с помощью службы хранилищ больших двоичных объектов Windows Azure

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

Эта функция, появившаяся в пакете обновления SQL Server 2012 1 (SP1) CU2, позволяет SQL Server выполнять резервное копирование и восстановление непосредственно через службу хранилища больших двоичных объектов Windows Azure. Эту функцию можно использовать для резервного копирования SQL Server локального экземпляра базы данных или экземпляра SQL Server, размещенного где-либо, например на виртуальной машине Windows Azure. Резервное копирование в облако дает такие преимущества, как доступность, безлимитное геореплицированное удаленное хранение и простота миграции данных в облако и обратно. В этой версии можно выполнять инструкции BACKUP и RESTORE с помощью tsql или SMO. В этой версии функции резервного копирования и восстановления через службу хранилища больших двоичных объектов Windows Azure с помощью SQL Server мастера архивации или восстановления Management Studio недоступны.

В SQL Server 2012 с пакетом обновления 1 (SP1) и накопительным обновлением (CU) 4 поддерживается резервное копирование и восстановление в службе хранилища больших двоичных объектов Windows Azure с использованием PowerShell. Для запроса этого обновления см. данную статью базы знаний. В этом разделе включены скрипты PowerShell в подразделе с примерами. Примеры скриптов PowerShell для управления несколькими операциями резервного копирования см. в разделе Use PowerShell to Backup Multiple Databases to Windows Azure Blob Storage Service.

Преимущества использования службы хранилища больших двоичных объектов Windows Azure для SQL Server резервного копирования

  • Гибкое, надежное и безлимитное удаленное хранилище: Хранение резервных копий с помощью службы хранилища больших двоичных объектов Windows Azure является удобным и гибким, а также позволяет реализовать доступ к данным из-за пределов вычислительной системы. Для создания удаленного хранилища для резервных копий SQL Server достаточно внести изменения в существующие скрипты и задания. Удаленное хранилище обычно должно быть расположено достаточно далеко от рабочей базы данных, чтобы одна авария не могла повлиять одновременно и на удаленную копию, и на рабочую базу данных. Георепликация хранилища больших двоичных объектов обеспечивает дополнительный уровень защиты в случае аварии регионального масштаба. Кроме того, резервные копии доступны в любом месте и в любое время, а также к ним легко получить доступ для восстановления.

  • Архив резервных копий: Служба хранилища больших двоичных объектов Windows Azure — это лучшая альтернатива часто применяемому созданию архива резервных копий на магнитной ленте. Может потребоваться физически транспортировать накопители на магнитной ленте в удаленное помещение и принимать меры для защиты носителей. Хранение резервных копий в хранилище больших двоичных объектов Windows Azure обеспечивает быстрое, доступное и надежное архивирование.

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

  • В настоящее время для экземпляров SQL Server, запущенных в виртуальной машине Windows Azure, создание резервных копий с помощью службы хранилища больших двоичных объектов Windows Azure можно выполнить, создав подключенные диски. Однако количество дисков, которые можно подключить к виртуальной машине Windows Azure, ограниченно. Для сверхбольших экземпляров данное ограничение составляет 16 дисков, а для небольших экземпляров это количество меньше. С осуществлением резервного копирования непосредственно в хранилище больших двоичных объектов Windows Azure есть возможность обойти предел в 16 дисков.

    Кроме того, файл резервной копии, который сохраняется в службе хранилища больших двоичных объектов Windows Azure, напрямую доступен в локальной службе SQL Server или удаленной службе SQL Server в виртуальной машине Windows Azure. Присоединение и отсоединение базы данных, а также скачивание и подключение виртуального жесткого диска не требуется.

  • Экономические преимущества: Оплата только тех услуг, которые используются. Может применяться в качестве экономически эффективного решения по удаленному резервному копированию и архивированию. Для получения дополнительной информации и ссылок см. раздел Возможности оплаты Windows Azure.

Возможности оплаты Windows Azure:

Понимание стоимости хранения Windows Azure позволяет прогнозировать стоимость создания и хранения резервных копий в Windows Azure. 

Ценовой калькулятор Windows Azure может помочь оценить затраты.

Хранение. Стоимость основывается на используемом пространстве и высчитывается по градуированной шкале и уровню избыточности. Дополнительные сведения и обновленную информацию см. в разделе Управление данными статьи Расчет цен.

Передача данных: Входящие передачи данных в Windows Azure бесплатны. Исходящие передачи оцениваются по пропускной способности, а их стоимость высчитывается по градуированной шкале, привязанной к региону. Дополнительные сведения см. в разделе Передача данных в статье «Расчет цен».

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

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

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

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

  • Служба хранилища больших двоичных объектов Windows Azure

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

  • Ограничения

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

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

Далее описаны вопросы безопасности и требования к резервному копированию и восстановлению с помощью службы хранилища больших двоичных объектов Windows Azure.

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

    Примечание по безопасностиПримечание по безопасности

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

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

Компоненты, необходимые для установки

  • SQL Server выполняется на виртуальной машине Azure. Если SQL Server устанавливается на виртуальной машине Windows Azure, установите версию SQL Server 2012 с пакетом обновления 1 (SP1) CU2 или обновите существующий экземпляр. Для запроса обновления у службы поддержки пользователей Microsoft см. данную статью.

  • SQL Server локальные: SQL Server 2012 с пакетом обновления 1 (SP1) или более поздней версии CU2 включают эту функцию. Для запроса обновления у службы поддержки пользователей Microsoft см. данную статью.

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

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

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

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

Служба хранилища больших двоичных объектов Windows Azure

Учетная запись хранилища: Учетная запись хранилища является отправной точкой для всех служб хранилища. Для доступа к службе хранилища больших двоичных объектов Windows Azure необходимо сначала создать учетную запись хранилища Windows Azure. Для проверки подлинности в службе хранилища больших двоичных объектов Windows Azure и его компонентах необходимы storage account name и его свойства access key.

Контейнер: Контейнер обеспечивает группирование набора больших двоичных объектов и может хранить их неограниченное количество. Для создания резервных копий SQL Server в службе хранилища больших двоичных объектов Windows Azure необходимо как минимум создать корневой контейнер.

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

Хранилище больших двоичных объектов Azure

Дополнительную информацию о службе хранилища больших двоичных объектов Windows Azure см. в разделе Как использовать службу хранилища больших двоичных объектов Windows Azure

Дополнительную информацию о больших двоичных объектах см. в разделе Основные сведения о блочных и страничных больших двоичных объектах

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

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

ПредупреждениеВнимание!

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

Пример URL-адреса: http[s]://ИМЯ_УЧЕТНОЙ_ЗАПИСИ.Blob.core.windows. net/<КОНТЕЙНЕР>/<ИМЯ_ФАЙЛА.bak>. Указывать HTTPS не обязательно, но рекомендуется.

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

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

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

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

Ограничения

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

  • В этой реализации можно выполнить инструкции резервного копирования или восстановления с помощью объектов SMO или TSQL. Функция резервного копирования или восстановления из службы хранилища больших двоичных объектов Windows 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 для резервного копирования с помощью службы хранилища больших двоичных объектов Windows Azure.

DIFFERENTIAL (разностная)

COPY_ONLY

COMPRESSION|NO_COMPRESSION

DESCRIPTION

NAME

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:

CREDENTIAL

Функция WITH CREDENTIAL поддерживается только при использовании параметра RESTORE FROM URL для восстановления из службы хранилища больших двоичных объектов Windows 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).

Примеры.

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

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

  • Создание резервной копии всей базы данных

  • Создание резервной копии базы данных и журнала

  • Создание полной резервной копии первичной файловой группы

  • Создание разностной резервной копии файлов первичных файловых групп

  • Восстановление базы данных и перемещение файлов

  • Восстановление состояния на определенный момент времени с помощью 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
    

Создание резервной копии всей базы данных

Следующий пример производит резервное копирование базы данных AdventureWorks2012 в службу хранилища больших двоичных объектов Windows Azure.

  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 и после обновления резервное копирование журнала. В этом примере будет создано имя резервной копии файла с отметкой времени.

  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  
    

Создание полной резервной копии первичной файловой группы

В следующем примере создается полная резервная копия файлов первичной файловой группы.

  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  
    

Создание разностной резервной копии файлов первичной файловой группы

В следующем примере создается разностная резервная копия файлов первичной файловой группы.

  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 directory, выполните следующие действия.

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