跳至內容

當我在 Amazon RDS for SQL Server 資料庫執行個體上使用原生備份與還原功能時,該如何解決發生的錯誤?

7 分的閱讀內容
0

我想解決在備份與還原 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 資料庫執行個體時發生的錯誤。

簡短描述

若要解決在 Amazon RDS for SQL Server 資料庫執行個體使用原生備份和還原功能時發生的錯誤,請嘗試下列操作:

  • 增加資料庫執行個體上的空間。
  • 針對 SQLSERVER_BACKUP_RESTORE 選項,授與 AWS Identity and Access Management (IAM) 角色的存取權限。
  • 將 AWS Key Management Service (KMS) 權限授與選項群組的 IAM 角色。
  • 授與權限給 IAM 政策或儲存貯體政策,以滿足跨帳戶備份需求。
  • 匯入透明資料加密 (TDE) 憑證。
  • 指定正確的 Windows 磁碟機代號。
  • 將備份檔案的 MAXTRANSFERSIZE 設定為大於執行還原時所使用的值。
  • 縮減備份檔案大小,以便將檔案傳輸到 Amazon Simple Storage Service (Amazon S3)。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱「對 AWS CLI 錯誤進行疑難排解」。此外,請確定您使用的是最新的 AWS CLI 版本。

增加資料庫執行個體上的空間

從 Amazon Elastic Compute Cloud (Amazon EC2) 或內部部署執行個體還原備份時,資料庫執行個體可能沒有足夠的空間。此時,Amazon RDS 會停止還原任務。

日誌輸出範例:

[2022-04-07 05:21:22.317] Aborted the task because of a task failure or a concurrent RESTORE_DB request.  
[2022-04-07 05:21:22.437] Task has been aborted  
[2022-04-07 05:21:22.440] There is not enough space on the disk to perform restore database operation.

若要解決此問題,您可以增加資料庫執行個體上的可用儲存空間。或者,縮減資料庫執行個體上的交易日誌檔案大小。

增加可用儲存空間

請完成下列步驟:

  1. 在 EC2 或內部部署執行個體上執行下列查詢,檢查資料庫資料檔案與交易日誌檔案的大小:
    SELECT DB_NAME(database_id) AS DatabaseName,  
           Name AS Logical_Name,  
           Physical_Name,  
           (size*8)/1024/1024 AS SizeGB  
      FROM sys.master_files  
     WHERE DB_NAME(database_id) = 'DB_NAME'  
        GO  
           Database Size = (DB_Name size + DB_Name_Log size)
    **注意:**將 DB_NAME 替換成您的資料庫名稱。
  2. 根據 EC2 或內部部署執行個體資料庫大小,比對資料庫執行個體上的可用儲存空間是否足夠。
  3. 增加資料庫執行個體上的可用儲存空間,然後還原資料庫。

縮減交易日誌檔案大小

請完成下列步驟:

  1. 若要縮減 EC2 或內部部署執行個體上目前的交易日誌檔案大小,請執行下列命令:
    DBCC SHRINKFILE (FileName, FileSizeMB)
    **注意:**將 FileName 替換成您的資料檔案或交易日誌檔案名稱,並將 FileSizeMB 替換成目標檔案大小 (以 MB 為單位)。
  2. 備份資料庫。

針對 SQLSERVER_BACKUP_RESTORE 選項,授與 IAM 角色的存取權限

若與 SQLSERVER_BACKUP_RESTORE 選項相關聯的 IAM 角色權限不足,Amazon RDS 將會停止相關任務。

日誌輸出範例:

[2020-12-15 08:56:22.143] Aborted the task because of a task failure or a concurrent RESTORE_DB request.  
[2020-12-15 08:56:22.213] Task has been aborted  
[2020-12-15 08:56:22.217] Access Denied

-或-

[2022-07-16 16:08:22.067] Task execution has started.   
[2022-07-16 16:08:22.143] Aborted the task because of a task failure or an overlap with your preferred backup window for RDS automated backup.  
[2022-07-16 16:08:22.147] Task has been aborted  
[2022-07-16 16:08:22.150] Access Denied

若要解決此問題,請完成以下步驟:

  1. 執行下列命令,確認還原查詢中 S3 儲存貯體和資料夾前綴是否正確:

    exec msdb.dbo.rds_restore_database  
          @restore_db_name='database_name',  
          @s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name_and_extension';
  2. 將下列陳述式新增至 IAM 權限政策:

    {  
      "Version": "2012-10-17",  
      "Statement": [  
        {  
          "Effect": "Allow",  
          "Action": [  
            "s3:ListBucket",  
            "s3:GetBucketLocation"  
          ],  
          "Resource": "arn:aws:s3:::bucket_name"  
        },  
        {  
          "Effect": "Allow",  
          "Action": [  
            "s3:GetObjectAttributes",  
            "s3:GetObject",  
            "s3:PutObject",  
            "s3:ListMultipartUploadParts",  
            "s3:AbortMultipartUpload"  
          ],  
          "Resource": "arn:aws:s3:::bucket_name/*"  
        }  
      ]  
    }

    **注意:**請在上述政策中,將 arn:aws:s3:::bucket_name 替換成您 S3 儲存貯體的 Amazon Resource Name (ARN)。

  3. 將政策新增至與 SQLSERVER_BACKUP_RESTORE 選項相關聯的角色。

  4. 在與資料庫執行個體相關聯的選項群組中,確認是否包含 SQLSERVER_BACKUP_RESTORE 選項。

如需更多資訊,請參閱「如何將 SQL Server 資料庫原生備份到 Amazon RDS,並從 Amazon S3 還原?」

將 AWS KMS 權限授與選項群組的 IAM 角色

RDS for SQL Server 原生備份和還原功能可以將用戶端備份檔案加密和解密。如果與選項群組相關聯的 IAM 角色政策缺少 KMS 金鑰權限,會導致備份或還原失敗。

日誌輸出範例:

 [2025-12-12 01:34:22.217] Aborted the task because of a task failure or an overlap with your preferred backup window for RDS automated backup.   
 [2025-12-12 01:34:22.223] Task has been aborted   
 [2025-12-12 01:34:22.230] User: arn:aws:sts::0123456789:assumed-role/<your_role_name>/RDS-SqlServerBackupRestore is not authorized to perform: kms:DescribeKey on resource: arn:aws:kms:ap-northeast-1:0123456789:key/<your_kms_key_id> because no identity-based policy allows the kms:DescribeKey action

若要解決此問題,請將下列陳述式新增至與選項群組相關聯的 IAM 政策。

{  
  "Version":"2012-10-17",                  
  "Statement": [  
    {  
      "Sid": "AllowAccessToKey",  
      "Effect": "Allow",  
      "Action": [  
        "kms:DescribeKey",  
        "kms:GenerateDataKey",  
        "kms:Encrypt",  
        "kms:Decrypt"  
      ],  
      "Resource": "arn:aws:kms:us-east-1:0123456789:key/key-id"  
    },  
    {  
      "Sid": "AllowAccessToS3",  
      "Effect": "Allow",  
      "Action": [  
        "s3:ListBucket",  
        "s3:GetBucketLocation"  
      ],  
      "Resource": "arn:aws:s3:::PUT-BUCKET-NAME"  
    },  
    {  
      "Sid": "GetS3Info",  
      "Effect": "Allow",  
      "Action": [  
        "s3:GetObjectAttributes",  
        "s3:GetObject",  
        "s3:PutObject",  
        "s3:ListMultipartUploadParts",  
        "s3:AbortMultipartUpload"  
      ],  
      "Resource": "arn:aws:s3:::PUT-BUCKET-NAME/*"  
    }  
  ]  
}

授與權限給 IAM 政策或儲存貯體政策,以滿足跨帳戶備份需求

在還原跨 AWS 帳戶資料庫備份時,Amazon RDS 可能會因為權限不足而停止還原任務。例如,您將備份檔儲存在帳戶 A 的 S3 儲存貯體中,然後還原到帳戶 B 中的 Amazon RDS 資料庫執行個體。

這通常是因為與選項群組相關聯的 IAM 角色政策,或與 S3 儲存貯體相關聯的儲存貯體政策缺少權限。

日誌輸出範例:

[2022-02-03 15:57:22.180] Aborted the task because of a task failure or a concurrent RESTORE_DB request.  
[2022-02-03 15:57:22.260] Task has been aborted  
[2022-02-03 15:57:22.263] Error making request with Error Code Forbidden and Http Status Code Forbidden. No further error information was returned by the service.

若要解決此問題,請完成以下步驟:

  1. 將下列陳述式新增至帳戶 B 中與選項群組相關聯的 IAM 政策:

    {  
      "Version": "2012-10-17",  
      "Statement":  
        [  
          {  
            "Effect": "Allow",  
            "Action":  
              [  
                "s3:ListBucket",  
                "s3:GetBucketLocation"  
              ],  
            "Resource": "arn:aws:s3:::name_of_bucket_present_in_Account_A"  
          },  
          {  
            "Effect": "Allow",  
            "Action":  
              [  
                "s3:GetObject",  
                "s3:PutObject",  
                "s3:ListMultipartUploadParts",  
                "s3:AbortMultipartUpload"  
              ],  
            "Resource": "arn:aws:s3:::name_of_bucket_present_in_Account_A/*"  
          },  
          {  
            "Action": [  
              "kms:DescribeKey",  
              "kms:GenerateDataKey",  
              "kms:Decrypt",  
              "kms:Encrypt"  
              "kms:ReEncryptTo",  
              "kms:ReEncryptFrom"  
            ],  
            "Effect": "Allow",  
            "Resource": [  
              "arn:aws: PUT THE NAME OF THE KEY HERE",  
              "arn:aws:s3:::name_of_bucket_present_in_Account_A/*"  
            ]  
          }  
        ]  
    }
  2. 將下列陳述式新增至與帳戶 A 中與 S3 儲存貯體相關聯的儲存貯體政策:

    {  
      "Version": "2012-10-17",  
      "Statement": [  
        {  
          "Sid": "Permission to cross account",  
          "Effect": "Allow",  
          "Principal": {  
            "AWS": [  
              "arn:aws:iam::AWS-ACCOUNT-ID-OF-RDS:role/service-role/PUT-ROLE-NAME"  
            ]  
          },  
          "Action": [  
            "s3:ListBucket",  
            "s3:GetBucketLocation"  
                 ],  
          "Resource": [  
            "arn:aws:s3:::PUT-BUCKET-NAME"  
          ]  
        },  
        {  
          "Sid": "Permission to cross account on object level",  
          "Effect": "Allow",  
          "Principal": {  
            "AWS": [  
              "arn:aws:iam::AWS-ACCOUNT-ID-OF-RDS:role/service-role/PUT-ROLE-NAME"  
            ]  
          },  
          "Action": [  
            "s3:GetObject",  
            "s3:PutObject",  
            "s3:ListMultipartUploadParts",  
            "s3:AbortMultipartUpload"  
          ],  
          "Resource": [  
            "arn:aws:s3:::PUT-BUCKET-NAME/*"  
          ]  
        }  
      ]  
    }

如需更多資訊,請參閱「利用原生備份和還原功能匯入與匯出 SQL Server 資料庫」和「儲存貯體擁有者將跨帳戶權限授與其不擁有的物件」。

匯入 TDE 憑證

還原資料庫備份時,若未將 TDE 憑證匯入目的地伺服器,還原任務將會停止。例如,您嘗試將具有 TDE 的資料庫從 EC2 或內部部署執行個體還原至 RDS for SQL Server 資料庫執行個體。

日誌輸出範例:

[2022-06-15 11:55:22.280] Cannot find server certificate with thumbprint '########'.  
[2022-06-15 11:55:22.280] RESTORE FILELIST is terminating abnormally.  
[2022-06-15 11:55:22.300] Aborted the task because of a task failure or a concurrent RESTORE_DB request.  
[2022-06-15 11:55:22.333] Task has been aborted  
[2022-06-15 11:55:22.337] Empty restore file list result retrieved.

若要解決此問題,請將 TDE 憑證匯入目的地伺服器。

請採取下列其中一種因應措施來防範此問題。

您從內部部署或 EC2 執行個體備份資料庫,但目標 RDS for SQL Server 位於多個可用區域內

請完成下列步驟:

  1. 針對已開啟 TDE 的 EC2 或內部部署資料庫建立備份。

  2. 在內部部署伺服器上,將備份檔還原成新的資料庫。

  3. 執行下列命令,以關閉新資料庫的加密功能:

    USE master;  
    GO  
    ALTER DATABASE Databasename SET ENCRYPTION OFF;  
    GO

    **注意:**將 Databasename 替換成您的資料庫名稱。

  4. 執行下列命令,以移除新資料庫的資料庫加密金鑰 (DEK):

    USE Databasename;  
    GO  
    DROP DATABASE ENCRYPTION KEY;  
    GO

    **注意:**將 Databasename 替換成您的資料庫名稱。

  5. 執行原生 SQL Server 備份,然後將備份檔還原到資料庫執行個體。

  6. 開啟新資料庫執行個體的 TDE。

從使用 TDE 加密的 RDS for SQL Server 資料庫執行個體,備份資料庫實例

請完成下列步驟:

  1. 使用 RDS for SQL Server 執行個體的資料庫快照還原成新的資料庫執行個體。
    **注意:**如果您變更資料庫執行個體的版本,請參閱「Microsoft SQL Server 注意事項」。
  2. 關閉新資料庫執行個體的 TDE。
  3. 執行原生 SQL 備份,然後將備份檔還原到資料庫執行個體。
  4. 開啟新資料庫執行個體的 TDE。

指定正確的 Windows 磁碟機代號

RDS for SQL Server 支援將資料庫還原到額外的儲存磁碟區。當您為儲存磁碟區指定錯誤的 Windows 磁碟機代號時,會導致還原作業失敗。

查詢和錯誤訊息範例:

-- Native restore query  
EXEC msdb.dbo.rds_restore_database      
    @restore_db_name='my_database',  
    @s3_arn_to_restore_from='arn:aws:s3:::<your_bucket_name>/my_database.bak',  
    @data_file_volume='Y:', -- incorrect drive letter.  
    @log_file_volume='Z:';  -- incorrect drive letter.  
-- Error message  
Message 50000、Level 16、State 1、Procedure msdb.dbo.rds_restore_database、Line 122  
Volume for data files is unavailable. Choose from available volumes.

若要解決此問題,請檢查 Windows 磁碟機代號。請完成下列步驟:

  1. 使用 describe-db-instances 命令,列出資料庫執行個體上掛載的額外儲存磁碟區:

    aws rds describe-db-instances \  
      --db-instance-identifier your-db-instance-id \  
      --query 'DBInstances[].AdditionalStorageVolumes[].VolumeName' \  
      --output text

    **注意:**將 your-db-instance-id 替換成您的資料庫執行個體識別碼。
    **注意:**如果無法取得磁碟區名稱,您需要將 AWS CLI 更新為最新版本。

    如需更多有關儲存磁碟區的資訊,請參閱 “Considerations for using additional storage volumes with RDS for SQL Server” (針對 RDS for SQL Server 使用額外儲存磁碟區的注意事項)。

  2. 修正您的查詢,為 @data_file_volume 和 @log_file_volume 指定正確的 Windows 磁碟機代號。

將備份檔案的 MAXTRANSFERSIZE 設定為大於執行還原時所使用的值

當備份包含 FILESTREAM 或記憶體內部 OLTP 檔案群組,且還原時使用了錯誤的 MAXTRANSFERSIZE,便會發生 MAXTRANSFERSIZE 錯誤。

**注意:**RDS for SQL Server 不支援 FILESTREAM 功能。

如果明確指定 MAXTRANSFERSIZE,可能會發生錯誤: "RESTORE requires MAXTRANSFERSIZE=<required_size> but <your_specified_size> was specified."

查詢和日誌輸出範例:

-- query  
EXEC msdb.dbo.rds_restore_database      
    @restore_db_name='my_database',  
    @s3_arn_to_restore_from='arn:aws:s3:::<your_bucket_name>/my_database.bak',  
    @max_transfer_size=65536 -- specified MAXTRANSFERSIZE explicitly  

-- error message  
 [2025-12-11 07:26:22.320] Task execution has started.   
 [2025-12-11 07:26:22.520] RESTORE requires MAXTRANSFERSIZE=4194304 but 65536 was specified.  RESTORE DATABASE is terminating abnormally.

若要解決此問題,請不要指定 MAXTRANSFERSIZE:

EXEC msdb.dbo.rds_restore_database      
    @restore_db_name='my_database',  
    @s3_arn_to_restore_from='arn:aws:s3:::<your_bucket_name>/my_database.bak'  

或者,指定等於或大於錯誤訊息中所指示大小的值:

EXEC msdb.dbo.rds_restore_database      
    @restore_db_name='my_database',  
    @s3_arn_to_restore_from='arn:aws:s3:::<your_bucket_name>/my_database.bak',  
    @max_transfer_size=4194304

縮減備份檔案大小,以便傳輸到 Amazon S3

當您移動的物件超過 Amazon S3 分段操作的物件大小上限時,就會發生此問題。Amazon S3 會將較大的物件分割成多段,因而導致分段的數量超過每次上傳的上限。

日誌輸出範例:

[2022-04-21 16:45:04.597] reviews_consumer/reviews_consumer_PostUpdate_042122.bak: Completed processing 100% of S3 chunks.  
[2022-04-21 16:47:05.427] Write on "####" failed: 995(The I/O operation has been aborted because of either a thread exit or an application request.) A nonrecoverable I/O error occurred on file "XXXX:" 995(The I/O operation has been aborted because of either a thread exit or an application request.). BACKUP DATABASE is terminating abnormally.  
[2022-04-21 16:47:22.033] Unable to write chunks to S3 as S3 processing has been aborted.  
[2022-04-21 16:47:22.040] reviews_consumer/reviews_consumer_PostUpdate_042122.bak: Aborting S3 upload, waiting for S3 workers to clean up and exit  
[2022-04-21 16:47:22.053] Aborted the task because of a task failure or an overlap with your preferred backup window for RDS automated backup.  
[2022-04-21 16:47:22.060] reviews_consumer/reviews_consumer_PostUpdate_042122.bak: Aborting S3 upload, waiting for S3 workers to clean up and exit  
[2022-04-21 16:47:22.067] S3 write stream upload failed. Encountered an error while uploading an S3 chunk: Part number must be an integer between 1 and 10000, inclusive S3 write stream upload failed. Encountered an error while uploading an S3 chunk: Part number must be an integer between 1 and 10000, inclusive S3 write stream upload failed. Encountered an error while uploading an S3 chunk: Part number must be an integer between 1 and 10000, inclusive S3 write stream upload failed. Encountered an error while uploading an S3 chunk: Part number must be an integer between 1 and 10000, inclusive

若要解決此問題,請開啟資料庫備份壓縮以縮減備份大小,讓 Amazon S3 能夠接收檔案。

執行下列命令,即可開啟備份壓縮:

exec rdsadmin..rds_set_configuration 'S3 backup compression', 'true';