Quali sono i problemi più comuni che possono verificarsi quando si utilizzano il backup e il ripristino nativi in RDS per SQL Server?

10 minuti di lettura
0

Sto eseguendo un backup o un ripristino nativi per la mia istanza Amazon Relational Database Service (Amazon RDS) per Microsoft SQL Server. Quali sono gli errori più comuni che posso riscontrare durante questo processo?

Risoluzione

Quando utilizzi l'opzione di backup e ripristino nativi di RDS per SQL Server, potresti riscontrare errori di convalida. Questi errori vengono visualizzati immediatamente e non viene creata un'attività. Di seguito sono riportati gli errori più comuni e le correzioni suggerite:

Errore: attività interrotta a causa di un errore o di una richiesta RESTORE_DB simultanea

Questo errore si verifica se hai problemi relativi allo spazio sull'istanza DB durante il ripristino del backup da Amazon Elastic Compute Cloud (Amazon EC2) oppure on-premise:

[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.

Per risolvere l'errore, effettua le seguenti operazioni:

Opzione 1:

1.    Esegui il comando seguente sull'istanza di origine (EC2 oppure on-premise). Questo comando verifica la dimensione del database, inclusi i file di dati e Tlog. Nell'esempio seguente, sostituisci [DB_NAME] con il nome del database.

SELECT DB_NAME(database_id) AS DatabaseName,
Name AS Logical_Name,
Physical_Name, (size*8)/1024/1024 SizeGB
FROM sys.master_files
WHERE DB_NAME(database_id) = '[DB_NAME]'
GO
Database Size = (DB_Name size + DB_Name_Log size)

2.    Confronta la dimensione del database delle istanze di origine con lo spazio di archiviazione disponibile sull'istanza DB. Aumenta di conseguenza lo spazio di archiviazione disponibile e ripristina il database.

Opzione 2:

Riduci il file di registro del DB attuale su SQL Server di origine per liberare lo spazio inutilizzato, quindi esegui il backup del database.

Utilizza il comando seguente per ridurre il file di registro.

DBCC SHRINKFILE (LogFileName, Desired Size in MB)

Errore: attività interrotta a causa di un errore o di una richiesta RESTORE_DB simultanea

Il seguente errore si verifica quando riscontri problemi di autorizzazione relativi al ruolo o alla policy AWS Identity and Access Management (IAM) associati all'opzione SQLSERVER_BACKUP_RESTORE:

[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

Per risolvere l'errore, effettua le seguenti operazioni:

1.    Verifica la query di ripristino per assicurarti che il bucket S3 e il prefisso della cartella siano corretti:

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.    Verifica che la policy IAM includa i seguenti attributi:

{
  "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/*"
    }
  ]
}

Nota: sostituisci arn:aws:s3:::bucket_name con l'ARN del tuo bucket S3.

3.    Verifica che la policy sia associata correttamente al ruolo fornito nell'opzione SQLSERVER_BACKUP_RESTORE.

4.    Verifica che l'opzione SQLSERVER_BACKUP_RESTORE sia il gruppo di opzioni associato all'istanza DB:

ARN del bucket S3
Prefisso della cartella S3 (facoltativo)

Per ulteriori informazioni, consulta How do I perform native backups of an Amazon RDS DB instance that's running SQL Server? (In che modo posso eseguire backup nativi di un'istanza database di Amazon RDS che esegue SQL Server?)

Errore: attività interrotta a causa di un errore o di una richiesta RESTORE_DB simultanea

Questo errore di solito è associato al ripristino del database di più account.

Esempio:

  • L'account A dispone di un bucket S3 in cui è archiviato il backup.
  • L'account B dispone di un'istanza DB RDS in cui è necessario eseguire il ripristino.

L'errore si verifica quando riscontri problemi relativi alle autorizzazioni in un ruolo o in una policy IAM associati all'opzione. Oppure, c'è un problema di autorizzazioni con la policy del bucket associata al bucket S3 di più account.

[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.

Per risolvere l'errore, effettua le seguenti operazioni:

1.    Verifica che la policy IAM nell'account B (l'account in cui si trova l'istanza DB su cui verrà eseguito il ripristino) includa i seguenti attributi:

{
  "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.    Verifica che la policy del bucket associata al bucket S3 nell'account A includa i seguenti attributi:

{
  "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"   /*---- Change Details here
        ]
      },
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
             ],
      "Resource": [
        "arn:aws:s3:::PUT-BUCKET-NAME"   /*---- Change Details here
      ]
    },
    {
      "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"   /*---- Change Details here
        ]
      },
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListMultipartUploadParts",
        "s3:AbortMultipartUpload"
      ],
      "Resource": [
        "arn:aws:s3::: PUT-BUCKET-NAME/*"  /*---- Change Details here
      ]
    }
  ]
}

Per ulteriori informazioni, consulta quanto segue:

Errore: impossibile trovare il certificato del server con l'identificazione personale "XXXXXX"

Questo errore si verifica quando cerchi di ripristinare un database con Transparent Data Encryption (TDE) da EC2 oppure on-premise su RDS per SQL Server:

[2022-06-1511:55:22.280] Cannot find server certificate with thumbprint 'XXXXXXX'.
[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.

Questo errore indica un tentativo di ripristinare un backup di un database crittografato utilizzando TDE su un'istanza SQL diversa dal server di origine. Il certificato TDE del server di origine deve essere importato nel server di destinazione. Per ulteriori informazioni sull'importazione di certificati del server e sulle relative limitazioni, consulta Supporto per Transparent Data Encryption in SQL Server.

Per risolvere questo errore oltre all'importazione di certificati, effettua le seguenti operazioni:

Sono disponibili due soluzioni alternative per prevenire questo errore.

Opzione 1: il backup del database proviene da un'istanza on-premise o EC2, ma RDS SQL Server di destinazione è in Multi-AZ

1.    Crea un backup del database di origine con TDE attivato.

2.    Ripristina il backup come nuovo DB nel server on-premise.

3.    Disattiva TDE sul database appena creato. Utilizza i seguenti comandi per disattivare TDE:

Esegui il seguente comando per disattivare la crittografia sul database. Nel comando seguente, sostituisci Databasename con il nome corretto per il tuo database.

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

Esegui il seguente comando per rimuovere la DEK utilizzata per la crittografia. Nel comando seguente, sostituisci Databasename con il nome corretto per il tuo database.

USE [Databasename];
GO
DROP DATABASE ENCRYPTION KEY;
GO

4.    Crea un backup nativo di SQL Server e ripristina quest'ultimo nell'istanza RDS desiderata. Per ulteriori informazioni, consulta How do I perform native backups of an Amazon RDS DB instance that's running SQL Server? (In che modo posso eseguire backup nativi di un'istanza database di Amazon RDS che esegue SQL Server?)

5.    Riattiva TDE nel nuovo database RDS.

Opzione 2: il database proviene da un database RDS per SQL Server crittografato con TDE

1.    Utilizza uno snapshot dall'istanza di origine per ripristinare il DB in una nuova istanza.

2.    Disattiva TDE sul database creato dallo snapshot.

3.    Crea un backup nativo di SQL e ripristina quest'ultimo nell'istanza RDS desiderata.

4.    Riattiva TDE nel nuovo database RDS.

Errori più comuni osservati per il backup nativo su RDS per SQL Server

Errore: attività interrotta a causa di un errore o di una sovrapposizione con la finestra di backup preferita per il backup automatico di RDS

Il seguente errore si verifica quando riscontri problemi di autorizzazione relativi al ruolo o alla policy IAM associati all'opzione SQLSERVER_BACKUP_RESTORE.

[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

Per risolvere il problema, effettua le seguenti operazioni:

1.    Verifica la query di ripristino per assicurarti che il bucket S3 e il prefisso della cartella siano corretti:

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.    Verifica che la policy IAM includa i seguenti attributi:

{
  "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/*"
    }
  ]
}

Nota: sostituisci arn:aws:s3:::bucket_name con l'ARN del tuo bucket S3.

3.    Verifica che la policy sia associata correttamente al ruolo mostrato nell'opzione SQLSERVER_BACKUP_RESTORE.

4.    Verifica che l'opzione SQLSERVER_BACKUP_RESTORE sia il gruppo di opzioni associato all'istanza DB.

ARN del bucket S3
Prefisso della cartella S3 (facoltativo)

Per ulteriori informazioni, consulta How do I perform native backups of an Amazon RDS DB instance that's running SQL Server? (In che modo posso eseguire backup nativi di un'istanza database di Amazon RDS che esegue SQL Server?)

Errore: scrittura su "XXX" non riuscita, impossibile scrivere blocchi su S3, caricamento del flusso di scrittura S3 non riuscito

Si tratta di un problema noto di RDS per SQL Server. La dimensione del database a volte viene stimata in modo errato e causa il seguente errore nella procedura di backup.

[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 "XXXX" 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

La soluzione alternativa a questo errore consiste nell'attivare la compressione del backup del database. Questa soluzione comprime il backup, facilitando la ricezione del file da parte di S3.

Esegui il seguente comando per attivare la compressione del backup:

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