SQL Server mencadangkan ke URL untuk praktik terbaik dan pemecahan masalah penyimpanan objek yang kompatibel dengan S3

Berlaku untuk: SQL Server 2022 (16.x)

Artikel ini mencakup praktik terbaik dan tips pemecahan masalah untuk pencadangan dan pemulihan SQL Server ke penyimpanan objek yang kompatibel dengan S3.

Untuk informasi selengkapnya tentang menggunakan Azure Blob Storage untuk operasi pencadangan atau pemulihan SQL Server, lihat:

Pemecahan masalah dan penyebab kesalahan umum

Berikut ini adalah beberapa cara cepat untuk memecahkan masalah kesalahan saat mencadangkan atau memulihkan dari penyimpanan objek yang kompatibel dengan S3. Untuk menghindari kesalahan karena opsi atau batasan yang tidak didukung, lihat Pencadangan dan Pemulihan SQL dengan penyimpanan objek yang kompatibel dengan S3.

Pastikan URL yang terbentuk dengan benar

Berikut adalah contoh URL host virtual yang dibentuk dengan benar saat mengeluarkan kueri cadangan T-SQL seperti berikut:

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

Atau untuk gaya jalur URL:

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

Tinjau di URL:

  1. URL dimulai dengan s3:// skema.

  2. Host <virtualHost> virtual penyimpanan S3 atau domain <domainName> server ada dan berjalan menggunakan HTTPS. Titik akhir akan divalidasi oleh CA yang diinstal pada Host OS SQL Server.

  3. <bucketName> adalah nama wadah ini tempat cadangan ditulis. Ini harus dibuat sebelum menjalankan T-SQL cadangan. T-SQL cadangan tidak membuat wadah untuk pelanggan. Misalnya, jika pengguna tidak membuat wadah 'nonExistingBucket' sebelumnya dan menjalankan pernyataan T-SQL sebagai berikut:

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

    URL yang tidak terbentuk dengan benar dapat mengembalikan hal berikut:

    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. Kebutuhan <pathToBackup> tidak ada sebelum menjalankan T-SQL cadangan. Ini dibuat di server penyimpanan secara otomatis. Misalnya, jika pengguna membuat wadah 'existingBucket' sebelumnya dan bukan jalur 'existingBucket/sqlbackups', berikut ini masih akan berjalan dengan sukses:

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

Membuat kredensial tingkat server sebelum menjalankan pencadangan/pemulihan

Sebelum menjalankan kueri Pencadangan/pemulihan Transact-SQL ke penyimpanan yang kompatibel dengan S3, Anda harus membuat kredensial tingkat server. Kredensial ini harus berisi Kunci akses dan Kunci Rahasia yang disiapkan oleh pelanggan di server penyimpanan objek yang kompatibel dengan S3 mereka sebelum mengeluarkan kueri pencadangan/pemulihan.

Contoh kredensial yang perlu dibuat untuk URL: s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak adalah sebagai berikut:

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

Dalam pernyataan <AccessKeyID> ini tidak diperbolehkan memuat : karakter. Jika kredensial tidak dibuat sebelum menjalankan kueri pencadangan/pemulihan, pengguna akan melihat pesan kesalahan berikut:

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.

Nama kredensial tidak diperlukan untuk mencocokkan jalur URL yang tepat. Berikut adalah contoh cara kerja pencarian kredensial. Jika kita perlu mengkueri jalur s3://10.193.16.183:9000/myS3Bucket/sqlbackups/AdventureWorks2022.bak, nama kredensial berikut dicoba:

  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

Jika ada beberapa pencarian pencocokan kredensial, seperti yang lebih spesifik s3://10.193.16.183:8787/myS3Bucket/sqlbackups dan lebih umum s3://10.193.16.183:8787/myS3Bucket, pilih yang paling spesifik. Ini memungkinkan Anda menyiapkan kontrol akses yang lebih terperinci di tingkat direktori untuk folder apa yang dapat diakses dari SQL Server.

Opsi yang tidak didukung FILE_SNAPSHOT

Saat ini, opsi BACKUP TSQL FILE_SNAPSHOT tidak didukung untuk penyimpanan objek yang kompatibel dengan S3. Ini adalah opsi khusus Azure Blob Storage.

Jika pengguna menjalankan Transact-SQL berikut misalnya:

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

Pesan kesalahan berikut dikembalikan:

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.

Strip cadangan melebihi 100 GB

Saat ini, ukuran file cadangan tunggal yang dibuat oleh pelanggan di penyimpanan objek yang kompatibel dengan S3 selama pencadangan tidak boleh melebihi 100 GB per file, menggunakan default MAXTRANSFERSIZE. Jika strip cadangan melampaui 100 GB, pernyataan sintaks T-SQL cadangan akan menampilkan pesan kesalahan berikut:

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.

Panduan saat ini untuk database besar cadangan pengguna menggunakan beberapa garis untuk cadangan database, masing-masing ukuran yang diizinkan kurang dari atau sama dengan 100 GB. BACKUP T-SQL mendukung striping hingga 64 URL, misalnya:

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

Opsi alternatif untuk pengguna adalah menggunakan opsi 'COMPRESSION':

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

Panjang maksimum URL

Panjang URL total dibatasi hingga 259 byte oleh mesin Pencadangan dan Pemulihan. Ini berarti bahwa s3://hostname/objectkey tidak boleh melebihi 259 karakter. Menyisihkan s3:// pengguna dapat memasukkan panjang jalur (nama host + kunci objek) menjadi 259 – 5 = 254 karakter. Lihat Pencadangan SQL Server ke URL - SQL Server. Pernyataan sintaks T-SQL cadangan melemparkan pesan kesalahan berikut:

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'

Koreksi condong jam

Penyimpanan S3 mungkin menolak koneksi, memberikan kesalahan "InvalidSignatureException" kembali ke SQL Server setiap kali perbedaan waktu antara SQL Host dan server S3 lebih besar dari 15 menit. Di SQL Server ditunjukkan sebagai:

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.

Dukungan SQL Server di Linux

SQL Server menggunakan WinHttp untuk mengimplementasikan klien API HTTP REST yang digunakannya. Ini bergantung pada penyimpanan sertifikat OS untuk validasi sertifikat TLS yang disajikan oleh titik akhir HTTP. Namun, SQL Server di Linux mendelegasikan validasi sertifikat ke SQLPAL, yang memvalidasi sertifikat HTTPS titik akhir dengan sertifikat yang dikirim dengan PAL. Dengan demikian, sertifikat yang ditandatangani sendiri yang disediakan pelanggan tidak dapat digunakan di Linux untuk validasi HTTPS.

Selama pencadangan/pemulihan, pelanggan mendapatkan pesan kesalahan berikut di 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.

Untuk melewati masalah ini, lokasi yang telah ditentukan sebelumnya berikut harus dibuat: /var/opt/mssql/security/ca-certificates. Tempatkan sertifikat yang ditandatangani sendiri, atau sertifikat yang tidak dikirim dengan PAL di lokasi ini. SQL Server membaca sertifikat dari folder selama startup dan menambahkannya ke penyimpanan kepercayaan PAL.

Hingga 50 file dapat disimpan di lokasi ini, jika folder tidak dibuat, ketika SQL Server dimulai, log kesalahan SQL Server akan menunjukkan:

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

Kunci Objek - retensi penghapusan tidak didukung

Pencadangan SQL Server ke fitur penyimpanan objek yang kompatibel dengan S3 tidak mendukung Object Lock, juga disebut fitur Hapus Retensi. Kunci Objek mencegah file dihapus atau ditimpa selama periode retensinya.

Wadah dan lokasi folder yang ditargetkan oleh operasi pencadangan Anda tidak boleh mengaktifkan Kunci Objek. Jika fitur ini diaktifkan dan dikonfigurasi di penyimpanan objek yang kompatibel dengan S3 Anda, operasi pencadangan gagal dengan pesan berikut:

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.