全部產品
Search
文件中心

ApsaraDB RDS:增量備份資料上雲(SQL Server 2008 R2雲端硬碟、2012及以上版本)

更新時間:Nov 15, 2024

RDS SQL Server提供了增量備份上雲的解決方案。您需要先將全量備份檔案上傳至阿里雲的Object Storage Service服務(OSS),並通過RDS控制台將全量備份資料恢複至指定的RDS SQL Server資料庫中。然後通過RDS控制台將差異備份或記錄備份檔案匯入該RDS SQL Server資料庫中,以實現增量備份上雲的效果。該方案能夠將業務停機時間控制在分鐘層級,從而有效縮短業務停機時間。

適用情境

RDS SQL Server增量資料上雲適用於以下情境:

  • 基於備份檔案物理遷移至RDS SQL Server,而不是邏輯遷移。

    說明
    • 物理遷移是指基於檔案的遷移,邏輯遷移是指將資料產生DML語句寫入RDS SQL Server。

    • 物理遷移可做到資料庫遷移後和本地環境100%一致。邏輯遷移無法做到100%一致,例如索引片段率、統計資訊等。

  • 對業務停止時間敏感,需要將業務停機時間控制在分鐘層級。

    說明

    如果您對業務停止時間不是非常敏感(例如可以接受2小時的中斷),當資料庫小於100 GB時,建議您通過全量備份檔案上雲。具體操作,請參見全量備份資料上雲(SQL Server 2008 R2雲端硬碟、2012及以上版本)

前提條件

  • RDS SQL Server執行個體版本為2008 R2雲端硬碟、2012及以上,且執行個體中沒有與待上雲資料庫名稱相同的資料庫。如需建立執行個體,請參見建立RDS SQL Server執行個體

    說明

    RDS SQL Server 2008 R2雲端硬碟執行個體已停止新售,詳情請參見【停售/下線】2023年07月14日起RDS SQL Server 2008 R2雲端硬碟執行個體停止售賣

  • RDS SQL Server執行個體擁有足夠的儲存空間。如果空間不足,請提前升級執行個體空間。具體操作,請參見變更配置

  • RDS SQL Server執行個體已建立高許可權帳號。具體操作,請參見建立資料庫和帳號

  • 本地SQL Server資料庫的復原模式需要設定為FULL模式。

    說明
    • 在進行增量備份資料上雲時,需要進行交易記錄備份,而Simple模式下不允許進行交易記錄備份。

    • 如果差異備份檔案很大,可能會導致增量備份上雲的時間變長。

  • 在本機資料庫環境中執行DBCC CHECKDB語句,以確保資料庫中沒有任何的allocation errorsconsistency errors。正常執行結果如下:

    ...
    CHECKDB found 0 allocation errors and 0 consistency errors in database 'xxx'.
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.
  • 已開通OSS服務。具體操作,請參見開通OSS服務

  • OSS Bucket與RDS SQL Server執行個體需要處於相同地區。相關操作,請參見2. 上傳備份檔案到OSS

  • 如果通過RAM使用者登入,則必須滿足以下條件:

    • RAM帳號具備AliyunOSSFullAccess許可權和AliyunRDSFullAccess許可權。如何為RAM使用者授權,請參見通過RAM對OSS進行許可權管理通過RAM對RDS進行許可權管理

    • 阿里雲帳號(主帳號)已授權RDS官方服務帳號可以訪問您OSS的許可權。

      點擊展開查看授權方法

      1. 前往RDS執行個體詳情頁備份恢複頁面,單擊OSS備份資料恢複上雲按鈕。

      2. 資料匯入嚮導頁面單擊兩次下一步,進入3. 資料匯入步驟。

        若該頁面左下角顯示您已授權RDS官方服務帳號可以訪問您OSS的許可權,則表示已授權。否則表示還未授權,單擊該頁面的授權地址同意授權即可。

        image

    • 所在阿里雲帳號(主帳號)需手動建立權限原則,然後將許可權添加到RAM帳號中。如何建立權限原則,請參見通過指令碼編輯模式建立自訂權限原則

      點擊展開查看策略內容

      {
          "Version": "1",
          "Statement": [
              {
                  "Action": [
                      "ram:GetRole"
                  ],
                  "Resource": "acs:ram:*:*:role/AliyunRDSImportRole",
                  "Effect": "Allow"
              }
          ]
      }

注意事項

  • 本方案遷移的層級為資料庫,即每次只能遷移一個資料庫上雲。如果需要遷移多個或所有資料庫,建議採用執行個體級的遷移上雲方案。具體操作,請參見SQL Server執行個體層級遷移上雲

  • 不支援高版本的備份檔案往低版本做遷移,例如從SQL Server 2016遷移到SQL Server 2012。

  • 備份檔案名不能包含@、|等特殊字元,否則會導致上雲失敗。

  • 授予RDS服務帳號訪問OSS的許可權以後,系統會在存取控制RAM的角色管理中建立名為AliyunRDSImportRole的角色,請勿修改或刪除這個角色,否則會導致上雲任務無法下載備份檔案而失敗。如果修改或刪除了這個角色,您需要通過資料上雲嚮導重新授權。

  • 本方案遷移上雲後,無法使用原有的帳號,需要在RDS控制台重新建立帳號。

  • 在OSS備份資料恢複上雲任務沒有完成之前,請不要刪除OSS上的備份檔案,否則會導致上雲任務失敗。

  • 支援的上雲備份檔案尾碼格式為.bak(全量備份)、.diff(差異備份)、.trn.log(交易記錄備份)。

    說明
    • 實際使用時,並非嚴格要求每種備份類型必須對應其格式尾碼,例如.bak可代表全量備份、差異備份或交易記錄備份。

    • 如果備份檔案不是上述提到的檔案尾碼,系統可能無法正確識別該檔案的類型並影響後續操作。

    • 對於通過RDS控制台下載的SQL Server記錄備份檔案(而非本文步驟一官方指令碼產生的.bak備份檔案),該檔案預設格式為.zip.log,格式處理後可直接用於增量上雲。

      處理方法:先將檔案擴充改為.zip以解壓,再將解壓得到的database_name.lbak重新命名為.bak格式,最後上傳此.bak檔案到OSS中作為增量記錄備份進行上雲。

操作流程舉例

上雲階段

步驟

說明

全量階段

Step1. 00:00之前

完成準備工作,包括:

  • 完成DBCC CheckDB檢查。

  • 關閉本地環境備份系統。

  • 修改資料庫為FULL復原模式。

Step2. 00:01

開始對線下資料庫做FULL Backup,耗時近1小時。

Step3. 02:00

上傳備份檔案到OSS Bucket,耗時近1小時。

Step4. 03:00

開始在RDS控制台恢複FULL Backup檔案,耗時19小時。

增量階段

Step5. 22:00

開始資料庫增量LOG備份上雲,完成LOG備份並上傳至OSS,耗時約20分鐘。

Step6. 22:20

完成LOG Backup上雲,耗時約10分鐘。

Step6. 22:30

  • 重複Step5~6,不斷Backup LOG、上傳到OSS、增量上雲LOG備份檔案,確保最後一個Backup LOG檔案盡量小(500MB以下)。

  • 停止本地應用對資料庫的寫入操作,再做一個LOG Backup,最後一次增量上雲。

開啟資料庫

Step8. 22:34

完成了最後一個LOG Backup檔案增量上雲操作,耗時4分鐘,開始將資料庫上線。

Step9. 22:35

資料庫上線完畢,如果選擇非同步執行DBCC操作,上線速度快,耗時1分鐘。

從整個的動作流程和時間軸來看,使用者需要停止應用的時間非常的短,僅在最後一個LOG Backup之前停止應用寫入即可。在本例中整個應用停止的時間控制在5分鐘內。

1. 備份本機資料庫

  1. 下載備份指令碼,用SSMS開啟備份指令碼。

  2. 修改如下參數。

    配置項

    說明

    @backup_databases_list

    需要備份的資料庫,多個資料庫以分號或者逗號分隔。

    @backup_type

    備份類型。參數值如下:

    • FULL:全量備份

    • DIFF:差異備份

    • LOG:記錄備份

    @backup_folder

    備份檔案所在的本地目錄。如不存在,會自動建立。

    @is_run

    是否執行備份。參數值如下:

    • 1:執行備份。

    • 0:只做檢查,不執行備份。

  3. 執行備份指令碼。

    無論指定何種備份類型,本指令碼均預設產生 .bak 格式檔案。

2. 上傳備份檔案到OSS

重要

如果OSS中已經建立了Bucket,請檢查Bucket是否滿足如下要求:

  • 請確儲存儲備份檔案的OSS Bucket儲存類型為標準儲存。不能是低頻訪問儲存、Archive Storage、冷Archive Storage、深度冷Archive Storage。更多詳情,請參見儲存類型概述

  • 請確保Bucket未開啟資料加密。更多詳情,請參見資料加密

  1. 建立儲存空間Bucket。

    1. 登入OSS管理主控台

    2. 單擊Bucket列表,然後單擊建立Bucket

    3. 配置如下關鍵參數,其他參數可以保持預設。

      重要
      • 建立的儲存空間僅用於本次資料上雲,且上雲後不再使用,因此只需配置關鍵參數即可,為避免資料泄露及產生相關費用,上雲完成後請及時刪除。

      • 建立Bucket時請勿開啟資料加密。更多詳情,請參見資料加密

      參數

      說明

      取值樣本

      Bucket 名稱

      儲存空間名稱,全域唯一,設定後無法修改。

      命名規則:

      • 只能包括小寫字母、數字和短劃線(-)。

      • 必須以小寫字母或者數字開頭和結尾。

      • 長度必須在3~63字元之間。

      migratetest

      地區

      Bucket所屬的地區,如果您通過ECS內網上傳資料至Bucket中,且通過內網將資料恢複至RDS中,則需要三者地區保持一致。

      華東1(杭州)

      儲存類型

      選擇標準儲存。本文上雲操作不支援其他儲存類型的Bucket。

      標準儲存

  2. 上傳備份檔案到OSS。

    說明

    當RDS執行個體和OSS的Bucket在同一地區時,二者可以通過內網互連,且資料上傳速度更快,並且不會產生外網流量費用。因此,在上傳備份檔案時,建議將檔案上傳至與目標RDS執行個體在同一地區的Bucket上。

    本機資料庫備份完成後,需要將備份檔案上傳到您的OSS Bucket中,您可以採用如下方法之一:

    使用ossbrowser工具上傳(推薦)

    1. 下載ossbrowser

    2. 以Windows x64作業系統為例,解壓下載的oss-browser-win32-x64.zip壓縮包,雙擊運行oss-browser.exe應用程式。

    3. 使用AK登入方式,配置參數AccessKeyIdAccessKeySecret,其他參數保持預設,然後單擊登入登入ossbrowser

      說明

      AccessKey用於身分識別驗證,確保資料安全,請妥善保管,如何建立及擷取,請參見建立AccessKey

    4. 單擊目標Bucket,進入儲存空間。進入bucket中

    5. 單擊上傳表徵圖,選擇需要上傳的備份檔案,然後單擊開啟,即可將本地檔案上傳至OSS中。

    使用OSS控制台上傳

    說明

    如果備份檔案小於5 GB,建議您直接通過OSS控制台上傳備份檔案。

    1. 登入OSS管理主控台

    2. 單擊Bucket列表,然後單擊目標Bucket名稱。網頁進入bucket

    3. 檔案清單中,單擊上傳檔案網頁上傳檔案

    4. 您可以將備份檔案拖拽至待上傳檔案地區,也可以單擊掃描檔案,選擇需要上傳的備份檔案。網頁掃描檔案

    5. 單擊頁面下方的上傳檔案,即可將本地備份檔案上傳至OSS中。

    使用OSS API分區上傳

    說明

    如果備份檔案大於5 GB,建議您調用OSS API採用分區上傳的方式將備份檔案上傳到OSS Bucket中。

    本樣本以Java專案為例,從環境變數中擷取訪問憑證代碼。運行本程式碼範例之前,請先配置環境變數。如何配置訪問憑證,請參見配置訪問憑證。更多樣本,請參見分區上傳

    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.internal.Mimetypes;
    import com.aliyun.oss.model.*;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // 填寫Bucket名稱,例如examplebucket。
            String bucketName = "examplebucket";
            // 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
            String objectName = "exampledir/exampleobject.txt";
            // 待上傳本地檔案路徑。
            String filePath = "D:\\localpath\\examplefile.txt";
            // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
            String region = "cn-hangzhou";
    
            // 建立OSSClient執行個體。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
            OSS ossClient = OSSClientBuilder.create()
            .endpoint(endpoint)
            .credentialsProvider(credentialsProvider)
            .clientConfiguration(clientBuilderConfiguration)
            .region(region)               
            .build();
            
            try {
                // 建立InitiateMultipartUploadRequest對象。
                InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
    
                // 如果需要在初始化分區時佈建要求頭,請參考以下範例程式碼。
                 ObjectMetadata metadata = new ObjectMetadata();
                // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
                // 指定該Object的網頁緩衝行為。
                // metadata.setCacheControl("no-cache");
                // 指定該Object被下載時的名稱。
                // metadata.setContentDisposition("attachment;filename=oss_MultipartUpload.txt");
                // 指定該Object的內容編碼格式。
                // metadata.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
                // 指定初始化分區上傳時是否覆蓋同名Object。此處設定為true,表示禁止覆蓋同名Object。
                // metadata.setHeader("x-oss-forbid-overwrite", "true");
                // 指定上傳該Object的每個part時使用的伺服器端加密方式。
                // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
                // 指定Object的密碼編譯演算法。如果未指定此選項,表明Object使用AES256密碼編譯演算法。
                // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_DATA_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
                // 指定KMS託管的使用者主要金鑰。
                // metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");
                // 指定Object的儲存類型。
                // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
                // 指定Object的對象標籤,可同時設定多個標籤。
                // metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
                // request.setObjectMetadata(metadata);
    
                // 根據檔案自動化佈建ContentType。如果不設定,ContentType預設值為application/oct-srream。
                if (metadata.getContentType() == null) {
                    metadata.setContentType(Mimetypes.getInstance().getMimetype(new File(filePath), objectName));
                }
    
                // 初始化分區。
                InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
                // 返回uploadId。
                String uploadId = upresult.getUploadId();
                // 根據uploadId執行取消分區上傳事件或者列舉已上傳分區的操作。
                // 如果您需要根據uploadId執行取消分區上傳事件的操作,您需要在調用InitiateMultipartUpload完成初始化分區之後擷取uploadId。 
                // 如果您需要根據uploadId執行列舉已上傳分區的操作,您需要在調用InitiateMultipartUpload完成初始化分區之後,且在調用CompleteMultipartUpload完成分區上傳之前擷取uploadId。
                // System.out.println(uploadId);
    
                // partETags是PartETag的集合。PartETag由分區的ETag和分區號組成。
                List<PartETag> partETags =  new ArrayList<PartETag>();
                // 每個分區的大小,用於計算檔案有多少個分區。單位為位元組。
                final long partSize = 1 * 1024 * 1024L;   //1 MB。
    
                // 根據上傳的資料大小計算分區數。以本地檔案為例,說明如何通過File.length()擷取上傳資料的大小。
                final File sampleFile = new File(filePath);
                long fileLength = sampleFile.length();
                int partCount = (int) (fileLength / partSize);
                if (fileLength % partSize != 0) {
                    partCount++;
                }
                // 遍曆分區上傳。
                for (int i = 0; i < partCount; i++) {
                    long startPos = i * partSize;
                    long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
                    UploadPartRequest uploadPartRequest = new UploadPartRequest();
                    uploadPartRequest.setBucketName(bucketName);
                    uploadPartRequest.setKey(objectName);
                    uploadPartRequest.setUploadId(uploadId);
                    // 設定上傳的分區流。
                    // 以本地檔案為例說明如何建立FIleInputstream,並通過InputStream.skip()方法跳過指定資料。
                    InputStream instream = new FileInputStream(sampleFile);
                    instream.skip(startPos);
                    uploadPartRequest.setInputStream(instream);
                    // 設定分區大小。除了最後一個分區沒有大小限制,其他的分區最小為100 KB。
                    uploadPartRequest.setPartSize(curPartSize);
                    // 設定分區號。每一個上傳的分區都有一個分區號,取值範圍是1~10000,如果超出此範圍,OSS將返回InvalidArgument錯誤碼。
                    uploadPartRequest.setPartNumber( i + 1);
                    // 每個分區不需要按順序上傳,甚至可以在不同用戶端上傳,OSS會按照分區號排序組成完整的檔案。
                    UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
                    // 每次上傳分區之後,OSS的返回結果包含PartETag。PartETag將被儲存在partETags中。
                    partETags.add(uploadPartResult.getPartETag());
                }
    
    
                // 建立CompleteMultipartUploadRequest對象。
                // 在執行完成分區上傳操作時,需要提供所有有效partETags。OSS收到提交的partETags後,會逐一驗證每個分區的有效性。當所有的資料分區驗證通過後,OSS將把這些分區組合成一個完整的檔案。
                CompleteMultipartUploadRequest completeMultipartUploadRequest =
                        new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
    
                // 如果需要在完成分區上傳的同時設定檔案存取權限,請參考以下範例程式碼。
                // completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);
                // 指定是否列舉當前UploadId已上傳的所有Part。僅在Java SDK為3.14.0及以上版本時,支援通過服務端List分區資料來合并完整檔案時,將CompleteMultipartUploadRequest中的partETags設定為null。
                // Map<String, String> headers = new HashMap<String, String>();
                // 如果指定了x-oss-complete-all:yes,則OSS會列舉當前UploadId已上傳的所有Part,然後按照PartNumber的序號排序並執行CompleteMultipartUpload操作。
                // 如果指定了x-oss-complete-all:yes,則不允許繼續指定body,否則報錯。
                // headers.put("x-oss-complete-all","yes");
                // completeMultipartUploadRequest.setHeaders(headers);
    
                // 完成分區上傳。
                CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
                System.out.println(completeMultipartUploadResult.getETag());
            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message:" + oe.getErrorMessage());
                System.out.println("Error Code:" + oe.getErrorCode());
                System.out.println("Request ID:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message:" + ce.getMessage());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    }

3. 建立資料上雲任務

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側功能表列中選擇備份恢複

  3. 單擊頁面上方的OSS備份資料恢複上雲

  4. 資料匯入嚮導頁面,單擊兩次下一步,進入資料匯入步驟。

    說明

    如果您是第一次使用OSS備份資料恢複上雲功能,需要給RDS官方服務帳號授予訪問OSS的許可權,請單擊授權地址並同意授權,否則會因許可權問題導致OSS Bucket下拉式清單為空白。

  5. 設定如下參數,單擊確定

    請耐心等待上雲任務完成,您可以單擊重新整理查看資料上雲任務最新狀態。

    配置項

    說明

    資料庫名

    備份資料匯入目標RDS執行個體上的資料庫名,名稱需要符合SQL Server官方限制。

    重要
    • 進行上雲操作前,請確保目標執行個體上不存在與備份檔案指定要還原的資料庫名稱相同的資料庫,也不存在相同名稱的未附加資料庫檔案。若都不存在,則可以使用備份組中同名資料庫檔案名稱還原資料庫。

    • 如果目標執行個體上存在與備份檔案指定要還原的資料庫名稱相同的資料庫,或者存在同名的未附加資料庫檔案,上雲操作將失敗。

    OSS Bucket

    選擇備份檔案所在的OSS Bucket。

    OSS子檔案夾名

    備份檔案所在的子檔案夾名。

    OSS檔案清單

    單擊右側放大鏡按鈕,可以按照備份檔案名首碼模糊尋找,會展示檔案名稱、檔案大小和更新時間。請選擇需要上雲的備份檔案。

    上雲方案

    選擇不開啟資料庫

    • 開啟資料庫(只有一個全量備份檔案):全量上雲,適合僅有一個完全備份檔案上雲的情境。此時CreateMigrateTask中的BackupMode = FULL並且IsOnlineDB = True

    • 不開啟資料庫(還有差異備份或記錄檔):增量上雲,適合有完全備份檔案加上記錄備份(或者差異備份檔案)上雲的情境,此時CreateMigrateTask 中的BackupMode = UPDF並且IsOnlineDB = False

4. 匯入差異或記錄備份檔案

SQL Server本機資料庫全量備份上雲完成後,接下來需要匯入差異備份或者記錄備份檔案。

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側功能表列中選擇備份恢複,單擊備份資料上雲記錄頁簽。

  3. 在工作清單中找到待匯入備份檔案的記錄,在右側單擊上傳增量檔案,選擇增量檔案後單擊確認

    說明
    • 如果您有多個記錄備份檔案,請使用同樣的方法逐個產生上雲任務。

    • 請在上傳增量檔案時,盡量保證最後一個備份檔案的大小不超過500MB,以此來縮短增量上雲的時間開銷。

    • 在最後一個記錄備份檔案產生前,請停止本機資料庫所有的寫入操作,以保證線下資料庫和RDS SQL Server上的資料庫資料一致。

5. 開啟資料庫

匯入檔案後RDS SQL Server中的資料庫會處於In Recovery或者Restoring狀態。高可用系列會處於In Recovery狀態,單機版會處於Restoring狀態,此時的資料庫還無法進行讀寫操作,需要開啟資料庫。

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側功能表列中選擇備份恢複,單擊備份資料上雲記錄頁簽。

  3. 在工作清單中找到待匯入備份檔案的記錄,在右側單擊開啟資料庫

  4. 選擇資料庫的開啟檔案,單擊確定

    說明

    開啟資料庫一致性檢查有以下兩種方式:

    • 非同步執行DBCC:在開啟資料庫的時候系統不做DBCC CheckDB,會在開啟資料庫任務結束以後,非同步執行DBCC CheckDB操作,以此來節約開啟資料庫操作的時間開銷(資料庫比較大,DBCC CheckDB非常耗時),減少您的業務停機時間。如果您對業務停機時間要求非常敏感,且不關心DBCC CheckDB結果,建議使用非同步執行DBCC。此時CreateMigrateTask 中的CheckDBMode = AsyncExecuteDBCheck

    • 同步執行DBCC:相對於非同步執行DBCC,有的使用者非常關心DBCC CheckDB的結果,以此來找出使用者線下資料庫資料一致性錯誤。此時,建議您選擇同步執行DBCC,影響是會拉長開啟資料庫的時間。此時CreateMigrateTask 中的CheckDBMode = SyncExecuteDBCheck

步驟六:查看上雲任務備份檔案詳情

您可以在備份恢複頁面備份資料上雲記錄頁簽內查看備份上雲記錄,單擊對應任務最右側的查看檔案詳情,將展示對應任務所有關聯的備份檔案詳情。

常見錯誤

全量備份資料上雲中常見錯誤,請參見全量備份資料上雲-常見錯誤

您在增量上雲過程中,可能會遇到如下的錯誤:

  • 資料庫開啟失敗

    • 錯誤資訊:Failed to open database xxx.

    • 錯誤原因:線下SQL Server資料庫啟用了一些進階功能,如果使用者選擇的RDS SQL Server版本不支援這些進階功能,會導致資料庫開啟失敗。例如本地SQL Server資料庫是企業版,啟用了資料壓縮(Data Compression)或者分區(Partition),OSS上雲到RDS SQL Server Web版,就會報告這個錯誤。

    • 解決方案:

  • Database Backup鏈中LSN無法對接

    • 錯誤資訊:The log in this backup set begins at LSN XXX, which is too recent to apply to the database.RESTORE LOG is terminating abnormally.

    • 錯誤原因:在SQL Server資料庫中,差異備份或者記錄備份能夠成功還原的前提是,差異或者記錄備份的LSN必須與上一次還原的備份檔案LSN能夠對接上,否則就會報告這個錯誤。

    • 解決方案:請選擇對應的LSN備份檔案進行增量備份檔案上雲,您可以按照備份檔案備份操作時間先後順序進行增量上雲操作。

  • 非同步DBCC Checkdb失敗

    • 錯誤資訊:asynchronously DBCC checkdb failed: CHECKDB found 0 allocation errors and 2 consistency errors in table 'XXX' (object ID XXX).

    • 錯誤原因:備份檔案還原到RDS SQL Server上,上雲任務系統會非同步做DBCC CheckDB檢查,如果檢查不通過,說明本機資料庫中已經有錯誤發生。

    • 解決方案:

      • 在RDS SQL Server上執行:

        DBCC CHECKDB (DBName,REPAIR_ALLOW_DATA_LOSS)
        重要

        使用該命令修複錯誤的過程,可能會導致資料丟失。

      • 在本地使用如下命令修複錯誤後重新進行增量上雲。

        DBCC CHECKDB (DBName,REPAIR_ALLOW_DATA_LOSS)
  • 完全備份檔案類型

    • 錯誤資訊:Backup set (xxx) is a Database FULL backup, we only accept transaction log or differential backup.

    • 錯誤原因:在增量上雲RDS SQL Server過程中,全量備份檔案還原完畢後,就只能再接受記錄備份檔案或者是差異備份檔案。如果使用者再次選擇了全量備份檔案,就會報告這個錯誤。

    • 解決方案:選擇記錄備份檔案或者差異備份檔案。

  • 資料庫個數超出最大限制數

    • 錯誤資訊:The database (xxx) migration failed due to databases count limitation.

    • 錯誤原因:當資料庫達到數量限制以後再做上雲操作,任務會失敗報告這個錯誤。

    • 解決方案:遷移上雲資料庫到其他的RDS SQL Server,或者刪除不必要的資料庫。

  • RAM帳號操作許可權不足

    • Q1:執行建立資料上雲任務步驟5使,各配置項參數均已填寫完整,但確定按鈕為灰色無法單擊?

    • A1:無法單擊的原因可能是您為RAM使用者,您的帳號許可權不足。請參見本文前提條件,確保相應許可權已授予。

    • Q2:使用RAM子帳號進行AliyunRDSImportRole授權時提示沒有許可權如何解決?

    • A2:使用阿里雲主帳號為RAM子帳號臨時增加AliyunRAMFullAccess許可權解決。如何為RAM使用者授權,請參見通過RAM對RDS進行許可權管理

相關API

API

描述

CreateMigrateTask

將OSS上的備份檔案還原到RDS SQL Server執行個體,建立資料上雲任務。

CreateOnlineDatabaseTask

開啟RDS SQL Server備份資料上雲任務的資料庫。

DescribeMigrateTasks

查詢RDS SQL Server執行個體備份資料上雲工作清單。

DescribeOssDownloads

查詢RDS SQL Server備份資料上雲任務的檔案詳情。