Procedure consigliate e risoluzione dei problemi di archiviazione oggetti compatibile con S3 per il backup di SQL Server nell'URL

Si applica a: SQL Server 2022 (16.x)

Questo articolo include procedure consigliate e suggerimenti per la risoluzione dei problemi relativi al backup e al ripristino di SQL Server in archiviazione oggetti compatibile con S3.

Per altre informazioni sull'uso di Archiviazione BLOB di Azure per le operazioni di backup e ripristino di SQL Server, vedere:

Risoluzione dei problemi e cause di errore comuni

Di seguito sono elencate alcune modalità rapide per la risoluzione di errori durante l'esecuzione del backup dall’archiviazione oggetti compatibile con S3 o del ripristino dalla stessa. Per evitare errori dovuti a opzioni non supportate o limitazioni, vedere Backup e ripristino di SQL con archiviazione di oggetti compatibile con S3.

Assicurarsi che l'URL abbia un formato corretto

Di seguito è riportato un esempio di URL host virtuale correttamente formato quando si esegue una query T-SQL di backup, ad esempio:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<bucketName>.<virtualHost>/<pathToBackup>/<backupFileName>' 

Oppure, per lo stile del percorso URL:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<domainName>/<bucketName>/<pathToBackup>/<backupFileName>';

Esaminare l'URL:

  1. L'URL inizia con lo schema s3://.

  2. L'host virtuale di archiviazione S3 <virtualHost> o il dominio del server <domainName> esiste ed è in esecuzione tramite HTTPS. L'endpoint verrà convalidato da una CA installata nell'host del sistema operativo di SQL Server.

  3. <bucketName> è il nome del bucket in cui viene scritto il backup. Questa operazione deve essere creata prima di eseguire il T-SQL di backup. Il T-SQL di backup non crea il bucket per il cliente. Ad esempio, se l'utente non crea il bucket 'nonExistingBucket' in anticipo ed esegue un'istruzione T-SQL come indicato di seguito:

    BACKUP DATABASE AdventureWorks2022
    TO URL = 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak';
    

    Un URL non correttamente formato può restituire quanto segue:

    Msg 3201, Level 16, State 1, Line 50
    Cannot open backup device 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
    Msg 3013, Level 16, State 1, Line 50
    BACKUP DATABASE is terminating abnormally.
    
  4. Non è necessario che <pathToBackup> esista prima di eseguire il T-SQL di backup. Viene creato automaticamente nel server di archiviazione. Ad esempio, se l'utente crea il bucket 'existingBucket' in anticipo e non il percorso 'existingBucket/sqlbackups', il codice seguente verrà comunque eseguito correttamente:

BACKUP DATABASE AdventureWorks2022
TO URL =  's3://<your-endpoint>/existingBucket/sqlbackups/AdventureWorks2022.bak';

Creare credenziali a livello di server prima di eseguire il backup/ripristino

Prima di eseguire query Transact-SQL di backup/ripristino nell'archiviazione compatibile con S3, è necessario creare credenziali a livello di server. Queste credenziali devono contenere la chiave di accesso e la chiave privata configurata dai clienti nel server di archiviazione oggetti compatibile con S3 prima di eseguire query di backup/ripristino.

Un esempio di credenziale che deve essere creata per l'URL: s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak è il seguente:

CREATE CREDENTIAL [s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak]
WITH IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>';

In questa istruzione <AccessKeyID> non è consentito contenere un carattere :. Se le credenziali non vengono create prima di eseguire la query di backup/ripristino, l'utente visualizzerà il messaggio di errore seguente:

Msg 3201, Level 16, State 1, Line 50
Cannot open backup device 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
Msg 3013, Level 16, State 1, Line 50
BACKUP DATABASE is terminating abnormally.

Il nome delle credenziali non deve corrispondere al percorso URL esatto. Di seguito è riportato un esempio di funzionamento della ricerca delle credenziali. Se è necessario eseguire una query sul percorso s3://10.193.16.183:9000/myS3Bucket/sqlbackups/AdventureWorks2022.bak, vengono tentati i nomi delle credenziali seguenti:

  1. s3://10.193.16.183:8787/myS3Bucket/sqlbackups/AdventureWorks2022.bak
  2. s3://10.193.16.183:8787/myS3Bucket/sqlbackups
  3. s3://10.193.16.183:8787/myS3Bucket

Se sono presenti più credenziali corrispondenti alla ricerca, ad esempio più specifiche s3://10.193.16.183:8787/myS3Bucket/sqlbackups e più generiche s3://10.193.16.183:8787/myS3Bucket, scegliere quella più specifica. In questo modo è possibile configurare un controllo di accesso più granulare a livello di directory per le cartelle a cui è possibile accedere da SQL Server.

Opzione FILE_SNAPSHOT non supportata

Attualmente, l'opzione TSQL di BACKUP FILE_SNAPSHOT non è supportata per l'archiviazione di oggetti compatibile con S3. Si tratta di un'opzione specifica di Archiviazione BLOB di Azure.

Se l'utente esegue il comando Transact-SQL seguente, ad esempio:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH FILE_SNAPSHOT;

Viene restituito il messaggio di errore seguente:

Msg 3073, Level 16, State 1, Line 62
The option WITH FILE_SNAPSHOT is only permitted if all database files are in Azure Storage.
Msg 3013, Level 16, State 1, Line 62
BACKUP DATABASE is terminating abnormally.

Striping di backup superiore a 100 GB

Attualmente, le dimensioni di un singolo file di backup creato dai clienti nell'archiviazione oggetti compatibile con S3 durante un backup non possono superare i 100 GB per ogni file, usando l'impostazione predefinita MAXTRANSFERSIZE. Se lo striping di backup supera i 100 GB, l'istruzione di sintassi T-SQL di backup genera il messaggio di errore seguente:

Msg 3202, Level 16, State 1, Line 161
Write on 's3://<endpoint>:<port>/<bucket>/<path>/<db_name>.bak' failed: 87(The parameter is incorrect.)
Msg 3013, Level 16, State 1, Line 161
BACKUP DATABASE is terminating abnormally.

Le linee guida correnti per il backup di database di grandi dimensioni dell'utente prevedono l’uso di più striping per il backup del database, ognuno delle dimensioni consentite minori o uguali a 100 GB. Il T-SQLdi BACKUP supporta lo striping fino a 64 URL, ad esempio:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_1.bak',
URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_2.bak';

Un'opzione alternativa per gli utenti consiste nell'usare l'opzione 'COMPRESSION':

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH COMPRESSION;

Lunghezza massima dell’URL

La lunghezza totale dell'URL è limitata a 259 byte dal motore di backup e ripristino. Ciò significa che s3://hostname/objectkey non può superare i 259 caratteri. Lasciando da parte s3://, l'utente può immettere la lunghezza del percorso (nome host + chiave oggetto) che può essere di 259 - 5 = 254 caratteri. Fare riferimento a Backup di SQL Server nell’URL - SQL Server. L'istruzione di sintassi T-SQL di backup genera il messaggio di errore seguente:

SQL Server has a maximum limit of 259 characters for a backup device name. The BACKUP TO URL consumes 36 characters for the required elements used to specify the URL - 'https://.blob.core.windows.net//.bak', leaving 223 characters for account, container, and blob names put together'

Correzione dell'asimmetria dell'orologio

L'archiviazione S3 potrebbe rifiutare la connessione, restituendo un errore "InvalidSignatureException" a SQL Server ogni volta che la differenza di tempo tra l'host SQL e il server S3 è superiore a 15 minuti. In SQL Server viene visualizzato come:

Msg 3201, Level 16, State 1, Line 28
Cannot open backup device '<path>'. Operating system error 5(Access is denied.).
Msg 3013, Level 16, State 1, Line 28
BACKUP DATABASE is terminating abnormally.

Supporto per SQL Server in Linux

SQL Server usa WinHttp per implementare il client delle API REST HTTP usate. Si basa sull'archivio certificati del sistema operativo per le convalide dei certificati TLS presentati dagli endpoint HTTP(s). Tuttavia, SQL Server in Linux delega la convalida del certificato a SQLPAL, che convalida i certificati HTTPS degli endpoint con il certificato fornito con l'elenco di accesso alla pubblicazione. Di conseguenza, i certificati autofirmati forniti dal cliente non possono essere usati in Linux per la convalida HTTPS.

Durante il backup/ripristino, il cliente riceve il messaggio di errore seguente in Linux:

Msg 3201, Level 16, State 1, Line 20
Cannot open backup device 's3://<endpoint>/<bucket>/testingDB.bak'. Operating system error 12175(failed to retrieve text for this error. Reason: 15105).
Msg 3013, Level 16, State 1, Line 20
BACKUP DATABASE is terminating abnormally.

Per risolvere questo problema, è necessario creare il percorso predefinito seguente: /var/opt/mssql/security/ca-certificates. Inserire certificati autofirmati o certificati non forniti con l'elenco di accesso alla pubblicazione in questa posizione. SQL Server legge i certificati dalla cartella durante l'avvio e li aggiunge all'archivio attendibilità elenco di accesso alla pubblicazione.

In questo percorso è possibile archiviare fino a 50 file; se la cartella non viene creata, all'avvio di SQL Server, verrà visualizzato il log degli errori di SQL Server:

2022-02-05 00:32:10.86 Server      Installing Client TLS certificates to the store.
2022-02-05 00:32:10.88 Server      Error searching first file in /var/opt/mssql/security/ca-certificates: 3(The system cannot find the path specified.)

Blocco oggetti: la conservazione dell'eliminazione non è supportata

La funzionalità di backup di SQL Server nell'archiviazione oggetti compatibile con S3 non supporta il blocco oggetti, detta anche funzionalità di conservazione dell’eliminazione. Blocco oggetti impedisce l'eliminazione o la sovrascrittura dei file per la durata del periodo di conservazione.

Il bucket e il percorso della cartella di destinazione dell'operazione di backup non devono avere il blocco oggetti abilitato. Se questa funzionalità è abilitata e configurata nell'archivio oggetti compatibile con S3, l'operazione di backup avrà esito negativo, restituendo il messaggio seguente:

Msg 3202, Level 16, State 1, Line 13
Write on 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak' failed: 87 (The parameter is incorrect).
Msg 3013, Level 16, State 1, Line 13
BACKUP DATABASE is terminating abnormally.