SQL Server 備份到 URL

本主題介紹使用 Azure Blob 儲存服務作為備份目的地所需的概念、需求與元件。 備份與還原功能與使用 DISK 或 TAPE 時相同或相似,但有一些差異。 差異包括任何顯著例外,以及本主題中包含的一些程式碼範例。

需求、組件與概念

本節內容:

安全性

以下是備份或還原 Azure Blob 儲存服務時的安全考量與要求。

  • 在為 Azure Blob 儲存服務建立容器時,我們建議您將存取權限設為私人。 將存取設定為私人會限制能夠提供必要資訊以驗證 Azure 帳號的使用者或帳號的存取權限。

    Important

    SQL Server 需要將 Azure 帳號名稱和存取金鑰認證存於 SQL Server 憑證中。 這些資訊用於在 Azure 帳號執行備份或還原操作時的認證。

  • 用來發出 BACKUP 或 RESTORE 命令的用戶帳戶應該位於具有 Alter any credential 許可權的db_backup操作員資料庫角色中。

關鍵組成部分與概念導論

以下兩個章節介紹 Azure Blob 儲存服務,以及在備份或還原 Azure Blob 儲存服務時所使用的 SQL Server 元件。 了解元件及其間的互動很重要,這樣才能備份或還原 Azure Blob 儲存服務。

建立 Azure 帳號是這個流程的第一步。 SQL Server 使用 Azure 儲存帳號名稱及其存取鍵值來驗證、寫入及讀取 blob 給儲存服務。 SQL Server 憑證儲存這些認證資訊,並用於備份或還原操作。 想完整了解如何建立儲存帳號並執行簡單還原,請參考《使用 Azure 儲存體 Service 進行 SQL Server 備份與還原的教學》。

將儲存帳號映射到 SQL 憑證 將

Azure Blob 儲存體 Service

記憶體帳戶: 記憶體帳戶是所有記憶體服務的起點。 要存取 Azure Blob 儲存體 服務,首先建立一個 Azure 儲存帳號。 儲存帳號名稱及其存取金鑰屬性是驗證 Azure Blob 儲存體 服務及其元件所必需的。

容器: 容器提供一組 Blob 的群組,並可儲存無限數量的 Blob。 要寫一份 SQL Server 備份到 Azure Blob 服務,至少必須建立根容器。

Blob: 任何類型和大小的檔案。 Azure Blob 儲存服務中可儲存兩種 blob:區塊 blob 與頁面 blob。 SQL Server 備份使用頁面 Blob 作為 Blob 類型。 blob 可使用以下網址格式尋址:https://< storage account.blob.core.windows.net/>< container>/<blob>

Azure Blob 儲存體Azure

欲了解更多關於 Azure Blob storage 服務的資訊,請參閱如何使用 Azure Blob 儲存體 Service。

如需有關分頁 Blob 的詳細資訊,請參閱 了解區塊 Blob 和分頁 Blob

SQL Server 元件

URL: URL 會指定唯一備份文件的統一資源識別碼 (URI)。 URL 用來提供 SQL Server 備份檔案的位置與名稱。 在此實作中,唯一有效的 URL 是指向 Azure 儲存帳號中的頁面 Blob。 URL 必須指向實際的 Blob,而不只是容器。 如果 Blob 不存在,它就會被創造出來。 若指定 BACKUP 已存在的 Blob,則失敗,除非指定「WITH FORMAT」選項。

Warning

如果你選擇複製並上傳備份檔案到 Azure Blob 儲存服務,請使用 page blob 作為儲存選項。 不支援從 Block Blob 還原。 RESTORE 從區塊 blob 類型會因錯誤而失敗。

這裡有一個範例網址值:http[s]://ACCOUNTNAME.Blob.core.windows.net/< CONTAINER>/<FILENAME.bak>。 HTTPS 不是必須的,但建議使用。

憑據: SQL Server 認證是用來儲存連線到 SQL Server 外部資源所需的驗證信息的物件。 在這裡,SQL Server 的備份與還原程序會使用憑證來驗證 Azure Blob 儲存服務。 憑證儲存儲存帳號名稱及 存取權的金鑰 值。 建立憑證後,必須在發出 /RESTORE 語句時BACKUP於 WITH CREDENTIAL 選項中指定。 欲了解更多如何查看、複製或重新產生儲存帳戶存取金鑰的資訊,請參見儲存帳戶存取金鑰。

關於如何建立 SQL Server 憑證的逐步說明,請參見本主題後面的「建立憑證範例」。

關於資格的一般資訊,請參見 憑證

關於其他使用憑證的範例,請參見「建立 SQL Server Agent Proxy」。

Limitations

  • 不支援備份到高級儲存裝置。

  • 最大支援的備份容量為 1 TB。

  • 你可以使用 TSQL、SMO 或 PowerShell 指令集來執行備份或還原語句。 目前尚未啟用使用 SQL Server Management Studio 的備份或還原嚮導,從 Azure Blob 儲存服務進行備份或還原。

  • 不支援建立邏輯裝置名稱。 所以不支援用 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 。

  • 指定 backupset 選項—— RETAINDAYSEXPIREDATE 且不支援。

  • SQL Server 的備份裝置名稱最大限制為 259 個字元。 BACKUP TO URL 會用 36 個字元來指定 URL 的必要元素 - 'https://.blob.core.windows.net//.bak',剩下帳號、容器和 blob 名稱合計 223 個字元。

支援備份/還原語句

備份/還原指令 Supported Exceptions 註解
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)

支援備份論證

Argument Supported 例外狀況 註解
DATABASE ✓
LOG ✓
TO(網址) ✓ 與 DISK 和 TAPE 不同,URL 不支援指定或建立邏輯名稱。 這個引數是用來指定備份檔案的 URL 路徑。
鏡像到 ✓
選項:
CREDENTIAL ✓ WITH CREDENTIAL 只支援使用 BACKUP TO URL 選項備份到 Azure Blob 儲存服務。
DIFFERENTIAL ✓
COPY_ONLY ✓
壓縮|NO_COMPRESSION ✓
描述 ✓
名字 ✓
有效期限 |保留日 ✓
NOINIT |初次 ✓ 如果使用這個選項,會被忽略。

無法附加到斑點上。 若要覆寫備份,請使用 FORMAT 參數。
不跳過 |跳過 ✓
無格式 |節目形式 ✓ 如果使用這個選項,會被忽略。

備份到現有 blob 時,除非指定 WITH FORMAT 否則會失敗。 當指定 WITH FORMAT 時,現有的 blob 會被覆寫。
媒體描述 ✓
MEDIANAME ✓
區塊大小 ✓
緩衝計數 ✓
最大轉移大小 ✓
NO_CHECKSUM |校驗碼 ✓
STOP_ON_ERROR |CONTINUE_AFTER_ERROR ✓
STATS ✓
倒帶 |無力倒帶 ✓
卸貨 |名詞 ✓
無法恢復 |待命 ✓
NO_TRUNCATE ✓

欲了解更多關於備份參數的資訊,請參見 BACKUP (Transact-SQL)

支持恢復論點

Argument Supported Exceptions 註解
DATABASE ✓
LOG ✓
FROM(網址) ✓ FROM URL 參數用於指定備份檔案的 URL 路徑。
選項:
CREDENTIAL ✓ WITH CREDENTIAL 僅在使用 RESTORE FROM URL 選項從 Azure Blob 儲存體 服務還原時才被支援。
PARTIAL ✓
復甦 |無法恢復 |待命 ✓
LOADHISTORY ✓
移動 ✓
REPLACE ✓
RESTART ✓
RESTRICTED_USER ✓
檔案 ✓
密碼 ✓
MEDIANAME ✓
MEDIAPASSWORD ✓
區塊大小 ✓
緩衝計數 ✓
最大轉移大小 ✓
校驗碼 |NO_CHECKSUM ✓
STOP_ON_ERROR |CONTINUE_AFTER_ERROR ✓
FILESTREAM ✓
STATS ✓
倒帶 |無力倒帶 ✓
卸貨 |名詞 ✓
KEEP_REPLICATION ✓
KEEP_CDC ✓
ENABLE_BROKER |ERROR_BROKER_CONVERSATIONS |NEW_BROKER ✓
停止 |停馬克 |停在標記前 ✓

欲了解更多關於還原參數的資訊,請參閱 RESTORE 「參數(Transact-SQL)」。

在 SQL Server Management Studio 中使用備份任務

SQL Server Management Studio 中的備份任務已增強,新增 URL 作為目的地選項之一,並新增其他支援物件,如 SQL 憑證,以便備份至 Azure 儲存。

以下步驟說明了備份資料庫任務所做的變更,以允許備份至 Azure 儲存裝置:

  1. 啟動 SQL Server Management Studio 並連接到 SQL Server 實例。 選擇你想備份的資料庫,然後右鍵點選 「任務」,再選擇 「備份......」這會開啟「備份資料庫」對話框。

  2. 在一般頁面中,URL 選項用於建立備份到 Azure 儲存。 當你選擇此選項時,你會看到本頁啟用其他選項:

    1. 檔案名稱: 備份檔案名稱。

    2. SQL 憑證:你可以指定現有的 SQL Server 憑證,或是點擊 SQL 憑證框旁的「建立」來建立新的憑證。

      Important

      點擊 「建立 」時跳出的對話框需要管理憑證或訂閱的發佈設定檔。 SQL Server 目前支援發行設定檔 2.0 版。 若要下載發行設定檔的支援版本,請參閱< 下載發行設定檔 2.0>。

      如果你無法取得管理憑證或發佈設定檔,可以透過指定儲存帳號名稱並使用 Transact-SQL 或 SQL Server Management Studio 來建立 SQL 憑證。 請參閱「建立憑證」章節中的範例程式碼,了解如何使用 Transact-SQL 建立憑證。 或者,使用 SQL Server Management Studio,從資料庫引擎實例中,右鍵點選「安全性」,選擇「新」,再選擇「憑證」。 針對 [識別] 指定儲存體帳戶名稱,並且在 [密碼] 欄位中指定存取金鑰。

    3. Azure 儲存容器: Azure儲存容器名稱,用於存放備份檔案。

    4. 網址前綴: 此系統會根據前述欄位中指定的資訊自動建立。 如果你手動編輯這個數值,務必確保它與你之前提供的資訊相符。 例如,如果你修改了儲存 URL,請確保 SQL 憑證設定為與同一儲存帳號進行認證。

當你選擇網址作為目的地時, 媒體選項 頁面中的某些選項會被停用。 以下主題提供更多關於備份資料庫對話框的資訊:

備份資料庫 (一般頁面)

備份資料庫(媒體選項頁面)

備份資料庫 (備份選項頁面)

Create Credential - 認證至 Azure 儲存體

使用 SQL Server 使用維護計畫嚮導備份至 URL

與前述備份任務類似,SQL Server Management Studio 中的維護計畫精靈已增強,將 URL 作為目的地選項之一,並包含其他支援物件,如 SQL 憑證等,以備份至 Azure 儲存。 欲了解更多資訊,請參閱「使用維護計畫精靈」中的「定義備份任務」章節。

使用 SQL Server Management Studio 從 Azure 儲存還原

如果你正在還原資料庫,會將 URL 作為還原裝置。 以下步驟說明還原任務中允許從 Azure 儲存還原的變更:

  1. 當你在 SQL Server Management Studio 的還原任務的一般頁面選擇裝置時,會帶你進入「選擇備份裝置」對話框,裡面包含 URL 作為備份媒體類型。

  2. 當你選擇網址並點選新增時,會開啟「Connect to Azure storage」對話框。 指定要驗證到 Azure 儲存的 SQL 憑證資訊。

  3. 接著 SQL Server 會用你提供的 SQL 憑證資訊連接到 Azure 儲存,並開啟「在 Azure 中尋找備份檔案」的對話框。 儲存空間中的備份檔案會顯示在本頁。 選擇你想用來還原的檔案,然後點 選確定。 這會帶你回到 「選擇備份裝置 」的對話框,點擊 「確定」 則會回到主的 還原 對話框,在那裡你就能完成還原。 欲了解更多資訊,請參閱以下主題:

    還原資料庫 (一般頁面)

    還原資料庫 (檔案頁面)

    還原資料庫 (選項頁面)

程式碼範例

本節包含下列範例。

建立認證

以下範例建立一個憑證,儲存 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 資料庫備份至 Azure Blob 儲存服務。

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,並在一段時間的更新後備份日誌。 此範例會建立一個帶有日期時間戳記的備份檔名。

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