將 RDS Custom for SQL Server 執行個體還原至某個時間點 - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 RDS Custom for SQL Server 執行個體還原至某個時間點

您可以將資料庫執行個體還原至特定時間點 (PITR),建立新的資料庫執行個體。若要支援 PITR,您的資料庫執行個體必須啟用備份保留。

RDS Custom for SQL Server 資料庫執行個體的最新可還原時間取決於幾個因素,但通常在目前時間的 5 分鐘內。若要查看資料庫執行個體的最新可還原時間,請使用 AWS CLI describe-db-instances 命令,並查看資料庫執行個體LatestRestorableTime欄位中傳回的值。若要在 Amazon RDS主控台中查看每個資料庫執行個體的最新可還原時間,請選擇自動備份

您可以還原至備份保留期間內的任何時間點。若要查看每個資料庫執行個體最早的可還原時間,請在 Amazon RDS主控台中選擇自動備份

如需 PITR 的一般資訊,請參閱 將資料庫執行個體還原至 Amazon 的指定時間 RDS

PITR RDS Custom for SQL Server 的考量事項

在 RDS Custom for SQL Server PITR中, 與 Amazon 中的 PITR 有下列重要差異RDS:

  • PITR 只會還原資料庫執行個體中的資料庫。它不會還原作業系統或 C: 磁碟機上的檔案。

  • 對於 RDS Custom for SQL Server 資料庫執行個體,資料庫會自動備份,且PITR只有在下列條件下才有資格使用:

    • 資料庫在線上。

    • 其復原模型設定為 FULL

    • 可寫入。

    • 在 D: 磁碟機上有實體檔案。

    • 並未列在 rds_pitr_blocked_databases 資料表中。如需詳細資訊,請參閱使資料庫不符合 的資格 PITR

  • 符合 資格的資料庫PITR取決於其資料庫 ID 的順序。RDS Custom for SQL Server 每個資料庫執行個體最多允許 5,000 個資料庫。不過,RDSCustom for SQL Server 資料庫執行個體PITR的操作所還原的資料庫數目上限取決於執行個體類別類型。如需詳細資訊,請參閱PITR 每個執行個體類別類型符合 資格的資料庫數目

    其他不屬於 的資料庫PITR可以從資料庫快照還原,包括用於 的自動快照備份PITR。

  • 新增資料庫、重新命名資料庫或還原有資格PITR啟動資料庫執行個體快照的資料庫。

  • 當資料庫執行個體經過規模運算操作時,視目標執行個體類別類型而定,符合PITR變更資格的資料庫數量上限。如果擴展執行個體,允許執行個體上的更多資料庫符合 的資格PITR,則會擷取新的快照。

  • 還原的資料庫名稱與來源資料庫執行個體中的名稱相同。您無法指定不同的名稱。

  • AWSRDSCustomSQLServerIamRolePolicy 需要存取其他 AWS 服務。如需詳細資訊,請參閱將存取原則新增至 AWSRDSCustomSQLServerInstanceRole

  • RDS Custom for SQL Server 不支援時區變更。如果您變更作業系統或資料庫執行個體時區, PITR(和其他自動化) 將無法運作。

PITR 每個執行個體類別類型符合 資格的資料庫數目

下表顯示PITR根據執行個體類別類型而有資格使用的資料庫數目上限。

執行個體類別類型 PITR 合格資料庫的數量上限
db.*.large 100
db.*.xlarge 至 db.*.2xlarge 150
db.*.4xlarge 到 db.*.8xlarge 300
db.*.12xlarge 到 db.*.16xlarge 600
db.*.24xlarge、db.*32xlarge 1000

* 代表不同的執行個體類別類型。

資料庫執行個體PITR上符合資格的資料庫數目上限取決於執行個體類別類型。Custom RDS for SQL Server 支援的最大執行個體類別類型,其數字範圍從最小的 100 到最大執行個體類別的 1000。SQL 伺服器系統資料庫 (master, model, msdb, tempdb)不包含在此限制中。當資料庫執行個體向上或向下擴展時,自訂RDS會根據目標執行個體類別類型自動更新符合 資格的資料庫數目PITR。RDS Custom for SQL Server 會在資料庫執行個體上符合PITR變更資格的資料庫數目上限RDS-EVENT-0352時傳送。如需詳細資訊,請參閱自訂引擎版本事件

注意

PITR 僅 2023 年 8 月 26 日之後建立的資料庫執行個體支援超過 100 個資料庫。對於 2023 年 8 月 26 日之前建立的執行個體,無論執行個體類別為何,符合 資格的資料庫數目上限為 PITR 100。若要在 2023 年 8 月 26 日之前建立的資料庫執行個體上啟用超過 100 個資料庫的PITR支援,您可以執行下列動作:

  • 將資料庫引擎版本升級至 15.00.4322.2.v1 或更新版本

在PITR操作期間,RDSCustom 將在還原時間還原來源資料庫執行個體PITR上屬於 的所有資料庫。一旦目標資料庫執行個體完成還原操作,如果啟用備份保留,資料庫執行個體將根據目標資料庫執行個體PITR上有資格使用的資料庫數目上限開始備份。

例如,如果您的資料庫執行個體在具有 200 個資料庫db.*.xlarge的 上執行:

  1. RDS Custom for SQL Server 會選擇依其資料庫 ID 排序的前 150 個資料庫進行PITR備份。

  2. 您可以修改執行個體,以擴展至 db.*.4xlarge。

  3. 完成擴展運算操作後,RDSCustom for SQL Server 將選擇依其資料庫 ID 排序的前 300 個資料庫進行PITR備份。滿足PITR需求條件的 200 個資料庫中的每個資料庫現在都有資格使用 PITR。

  4. 您現在修改執行個體,以縮減至 db.*.xlarge。

  5. 規模運算操作完成後,RDSCustom for SQL Server 會再次選取前 150 個資料庫,依其資料庫 ID 排序以進行PITR備份。

使資料庫不符合 的資格 PITR

您可以選擇從 排除個別資料庫PITR。若要做到這一點,請將它們的 database_id 值放到 rds_pitr_blocked_databases 資料表。使用下列SQL指令碼建立資料表。

若要建立 rds_pitr_blocked_databases 資料表
  • 執行下列SQL指令碼。

    create table msdb..rds_pitr_blocked_databases ( database_id INT NOT NULL, database_name SYSNAME NOT NULL, db_entry_updated_date datetime NOT NULL DEFAULT GETDATE(), db_entry_updated_by SYSNAME NOT NULL DEFAULT CURRENT_USER, PRIMARY KEY (database_id) );

如需符合資格和不符合資格資料庫的清單,請參閱 Amazon S3 儲存貯體 do-not-delete-rds-custom-$ACCOUNT_ID-$REGION-unique_identifierRDSCustomForSQLServer/Instances/DB_instance_resource_ID/TransactionLogMetadata 目錄中的 RI.End 檔案。如需 RI.End 詳細資訊,請參閱 Amazon S3 中的交易日誌

您也可以決定PITR使用下列SQL指令碼的合格資料庫清單。將@limit變數設定為適用於執行個體類別之 PITR的資料庫數目上限。如需詳細資訊,請參閱PITR 每個執行個體類別類型符合 資格的資料庫數目

判斷資料庫執行個體類別PITR上 的合格資料庫清單
  • 執行下列SQL指令碼。

    DECLARE @Limit INT; SET @Limit = (insert-database-instance-limit-here); USE msdb; IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'rds_pitr_blocked_databases')) WITH TABLE0 AS ( SELECT hdrs.database_id as DatabaseId, sdb.name as DatabaseName, 'ALWAYS_ON_NOT_WRITABLE_REPLICA' as Reason, NULL as DatabaseNameOnPitrTable FROM sys.dm_hadr_database_replica_states hdrs INNER JOIN sys.databases sdb ON sdb.database_id = hdrs.database_id WHERE (hdrs.is_local = 1 AND hdrs.is_primary_replica = 0) OR (sys.fn_hadr_is_primary_replica (sdb.name) = 1 AND DATABASEPROPERTYEX (sdb.name, 'Updateability') = 'READ_ONLY') ), TABLE1 as ( SELECT dbs.database_id as DatabaseId, sysdbs.name as DatabaseName, 'OPTOUT' as Reason, CASE WHEN dbs.database_name = sysdbs.name THEN NULL ELSE dbs.database_name END AS DatabaseNameOnPitrTable FROM msdb.dbo.rds_pitr_blocked_databases dbs INNER JOIN sys.databases sysdbs ON dbs.database_id = sysdbs.database_id WHERE sysdbs.database_id > 4 ), TABLE2 as ( SELECT db.name AS DatabaseName, db.create_date AS CreateDate, db.state_desc AS DatabaseState, db.database_id AS DatabaseId, rs.database_guid AS DatabaseGuid, rs.last_log_backup_lsn AS LastLogBackupLSN, rs.recovery_fork_guid RecoveryForkGuid, rs.first_recovery_fork_guid AS FirstRecoveryForkGuid, db.recovery_model_desc AS RecoveryModel, db.is_auto_close_on AS IsAutoClose, db.is_read_only as IsReadOnly, NEWID() as FileName, CASE WHEN(db.state_desc = 'ONLINE' AND db.recovery_model_desc != 'SIMPLE' AND((db.is_auto_close_on = 0 and db.collation_name IS NOT NULL) OR db.is_auto_close_on = 1)) AND db.is_read_only != 1 AND db.user_access = 0 AND db.source_database_id IS NULL AND db.is_in_standby != 1 THEN 1 ELSE 0 END AS IsPartOfSnapshot, CASE WHEN db.source_database_id IS NULL THEN 0 ELSE 1 END AS IsDatabaseSnapshot FROM sys.databases db INNER JOIN sys.database_recovery_status rs ON db.database_id = rs.database_id WHERE DB_NAME(db.database_id) NOT IN('tempdb') AND db.database_id NOT IN (SELECT DISTINCT DatabaseId FROM TABLE1) AND db.database_id NOT IN (SELECT DISTINCT DatabaseId FROM TABLE0) ), TABLE3 as( Select @Limit+count(DatabaseName) as TotalNumberOfDatabases from TABLE2 where TABLE2.IsPartOfSnapshot=1 and DatabaseName in ('master','model','msdb') ) SELECT TOP(SELECT TotalNumberOfDatabases from TABLE3) DatabaseName,CreateDate,DatabaseState,DatabaseId from TABLE2 where TABLE2.IsPartOfSnapshot=1 ORDER BY TABLE2.DatabaseID ASC ELSE WITH TABLE0 AS ( SELECT hdrs.database_id as DatabaseId, sdb.name as DatabaseName, 'ALWAYS_ON_NOT_WRITABLE_REPLICA' as Reason, NULL as DatabaseNameOnPitrTable FROM sys.dm_hadr_database_replica_states hdrs INNER JOIN sys.databases sdb ON sdb.database_id = hdrs.database_id WHERE (hdrs.is_local = 1 AND hdrs.is_primary_replica = 0) OR (sys.fn_hadr_is_primary_replica (sdb.name) = 1 AND DATABASEPROPERTYEX (sdb.name, 'Updateability') = 'READ_ONLY') ), TABLE1 as ( SELECT db.name AS DatabaseName, db.create_date AS CreateDate, db.state_desc AS DatabaseState, db.database_id AS DatabaseId, rs.database_guid AS DatabaseGuid, rs.last_log_backup_lsn AS LastLogBackupLSN, rs.recovery_fork_guid RecoveryForkGuid, rs.first_recovery_fork_guid AS FirstRecoveryForkGuid, db.recovery_model_desc AS RecoveryModel, db.is_auto_close_on AS IsAutoClose, db.is_read_only as IsReadOnly, NEWID() as FileName, CASE WHEN(db.state_desc = 'ONLINE' AND db.recovery_model_desc != 'SIMPLE' AND((db.is_auto_close_on = 0 and db.collation_name IS NOT NULL) OR db.is_auto_close_on = 1)) AND db.is_read_only != 1 AND db.user_access = 0 AND db.source_database_id IS NULL AND db.is_in_standby != 1 THEN 1 ELSE 0 END AS IsPartOfSnapshot, CASE WHEN db.source_database_id IS NULL THEN 0 ELSE 1 END AS IsDatabaseSnapshot FROM sys.databases db INNER JOIN sys.database_recovery_status rs ON db.database_id = rs.database_id WHERE DB_NAME(db.database_id) NOT IN('tempdb') AND db.database_id NOT IN (SELECT DISTINCT DatabaseId FROM TABLE0) ), TABLE2 as( SELECT @Limit+count(DatabaseName) as TotalNumberOfDatabases from TABLE1 where TABLE1.IsPartOfSnapshot=1 and DatabaseName in ('master','model','msdb') ) select top(select TotalNumberOfDatabases from TABLE2) DatabaseName,CreateDate,DatabaseState,DatabaseId from TABLE1 where TABLE1.IsPartOfSnapshot=1 ORDER BY TABLE1.DatabaseID ASC
注意

僅具有符號連結的資料庫也會從符合PITR操作資格的資料庫排除。上述查詢不會根據此條件進行篩選。

Amazon S3 中的交易日誌

備份保留期會判斷 RDS Custom for SQL Server 資料庫執行個體的交易日誌是否會自動擷取並上傳至 Amazon S3。非零值表示建立自動備份,且RDS自訂代理程式每 5 分鐘將交易日誌上傳至 S3。

S3 上的交易日誌檔會使用您在建立資料庫執行個體時提供的 AWS KMS key 進行靜態加密。如需詳細資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的使用伺服器端加密保護資料

每個資料庫的交易日誌會上傳至名稱為 do-not-delete-rds-custom-$ACCOUNT_ID-$REGION-unique_identifier 的 S3 儲存貯體。S3 儲存貯體中的 RDSCustomForSQLServer/Instances/DB_instance_resource_ID 目錄包含兩個子目錄:

  • TransactionLogs – 包含每個資料庫的交易日誌及其各自的中繼資料。

    交易日誌檔名稱遵循 yyyyMMddHHmm.database_id.timestamp 模式,例如:

    202110202230.11.1634769287

    具有尾碼 _metadata 的相同檔案名稱包含交易日誌的相關資訊,例如日誌序號、資料庫名稱和 RdsChunkCountRdsChunkCount 會決定多少實體檔案表示單一交易日誌檔。您可能會看到具有尾碼 _0001_0002 等等的檔案,這表示交易日誌檔的實際區塊。如果您想要使用區塊的交易日誌檔,請務必在下載區塊之後合併。

    請考量具有下列檔案的案例:

    • 202110202230.11.1634769287

    • 202110202230.11.1634769287_0001

    • 202110202230.11.1634769287_0002

    • 202110202230.11.1634769287_metadata

    RdsChunkCount3。合併檔案的順序如下:202110202230.11.1634769287 202110202230.11.1634769287_0001202110202230.11.1634769287_0002

  • TransactionLogMetadata – 包含交易日誌擷取之每個反覆項目的相關中繼資料資訊。

    RI.End 檔案包含其交易日誌已擷取之所有資料庫的資訊,以及已存在但是其交易日誌未擷取之所有資料庫的資訊。RI.End 檔案名稱遵循 yyyyMMddHHmm.RI.End.timestamp 模式,例如:

    202110202230.RI.End.1634769281

PITR 使用 AWS Management Console、 AWS CLI或 RDS 還原API。

您可以使用 AWS Management Console、 AWS CLI或 RDS 將 RDS Custom for SQL Server 資料庫執行個體還原至某個時間點API。

將RDS自訂資料庫執行個體還原至指定的時間
  1. 登入 AWS Management Console 並在 開啟 Amazon RDS主控台https://console.aws.amazon.com/rds/

  2. 在導覽窗格中,選擇 Automated backups (自動備份)

  3. 選擇您要還原的RDS自訂資料庫執行個體。

  4. 針對 Actions (動作),選擇 Restore to point in time (還原至時間點)。

    Restore to point in time (還原到時間點) 視窗隨即出現。

  5. 選擇 Latest restorable time (最近的可還原時間) 以還原最近一次的可能時間,或選擇 Custom (自訂) 以選擇一個時間。

    如果您選擇 Custom (自訂),請輸入您希望執行個體叢集還原到什麼日期和時間。

    時間會顯示在您的本機時區中,該時區是由國際標準時間 () 的偏移所表示UTC。例如,UTC-5 是東部標準時間/中部夏令時間。

  6. 針對資料庫執行個體識別符 ,輸入目標還原的RDS自訂資料庫執行個體 的名稱。名稱必須是唯一的。

  7. 視需要選擇其他選項,例如資料庫執行個體類別。

  8. 選擇 Restore to point in time (還原至時間點)

您可以使用 AWS CLI restore-db-instance-to命令point-in-time建立新的RDS自訂資料庫執行個體,將資料庫執行個體還原至指定的時間。

使用下列其中一個選項來指定要從中還原的備份:

  • --source-db-instance-identifier mysourcedbinstance

  • --source-dbi-resource-id dbinstanceresourceID

  • --source-db-instance-automated-backups-arn backupARN

custom-iam-instance-profile 選項為必要項目。

下列範例會將 my-custom-db-instance 還原至名稱為 my-restored-custom-db-instance 的新資料庫執行個體,截至指定的時間。

用於 Linux, macOS、 或 Unix:

aws rds restore-db-instance-to-point-in-time \ --source-db-instance-identifier my-custom-db-instance\ --target-db-instance-identifier my-restored-custom-db-instance \ --custom-iam-instance-profile AWSRDSCustomInstanceProfileForRdsCustomInstance \ --restore-time 2022-10-14T23:45:00.000Z

用於 Windows:

aws rds restore-db-instance-to-point-in-time ^ --source-db-instance-identifier my-custom-db-instance ^ --target-db-instance-identifier my-restored-custom-db-instance ^ --custom-iam-instance-profile AWSRDSCustomInstanceProfileForRdsCustomInstance ^ --restore-time 2022-10-14T23:45:00.000Z