Membuat cadangan rekam jepret Transact-SQL
Berlaku untuk: SQL Server 2022 (16.x)
Artikel ini menjelaskan apa, mengapa, dan cara menggunakan cadangan rekam jepret Transact-SQL. Cadangan rekam jepret Transact-SQL (T-SQL) diperkenalkan di SQL Server 2022 (16.x).
Database semakin besar dan lebih besar setiap hari. Secara tradisional, cadangan SQL Server adalah cadangan streaming. Pencadangan streaming tergantung pada ukuran database. Operasi pencadangan menggunakan sumber daya (CPU, memori, I/O, jaringan) yang memengaruhi throughput beban kerja OLTP bersamaan selama pencadangan. Salah satu cara untuk membuat performa cadangan konstan, daripada bergantung pada ukuran data, adalah dengan melakukan pencadangan rekam jepret menggunakan mekanisme yang disediakan oleh perangkat keras atau layanan penyimpanan yang mendasar.
Karena cadangan itu sendiri terjadi di tingkat perangkat keras, fitur ini bukan solusi SQL Server murni. SQL Server harus terlebih dahulu menyiapkan data dan file log untuk rekam jepret, sehingga file dijamin berada dalam status yang nantinya dapat dipulihkan. Setelah langkah ini selesai, operasi tulis dijeda di SQL Server (permintaan baca masih diizinkan), dan kontrol diserahkan ke aplikasi cadangan untuk menyelesaikan rekam jepret. Setelah rekam jepret berhasil diselesaikan, aplikasi harus mengembalikan kontrol kembali ke SQL Server tempat operasi tulis kemudian dilanjutkan.
Karena kita harus membekukan operasi tulis selama operasi rekam jepret, sangat penting bahwa rekam jepret terjadi dengan cepat, sehingga beban kerja di server tidak terganggu untuk jangka waktu yang lama. Di masa lalu, pengguna mengandalkan solusi non-Microsoft yang dibangun di atas layanan Penulis SQL untuk menyelesaikan pencadangan rekam jepret. Layanan Penulis SQL tergantung pada Windows VSS (Layanan Bayangan Volume) bersama dengan SQL Server VDI (Antarmuka Perangkat Virtual) untuk melakukan orkestrasi antara SQL Server dan rekam jepret tingkat disk.
Klien cadangan berdasarkan layanan SQL Writer cenderung kompleks, dan mereka hanya bekerja di Windows. Dengan cadangan rekam jepret T-SQL, sisi SQL Server dari orkestrasi dapat ditangani dengan serangkaian perintah T-SQL. Fungsionalitas ini memungkinkan pengguna untuk membuat aplikasi cadangan kecil mereka sendiri yang dapat berjalan di Windows atau Linux, atau bahkan solusi skrip jika penyimpanan yang mendasarinya mendukung antarmuka pembuatan skrip untuk memulai rekam jepret.
Berikut adalah contoh skrip PowerShell, yang menunjukkan solusi end-to-end untuk mencadangkan dan memulihkan database di Azure SQL IaaS Virtual Machine. Sampel menggunakan kemampuan pencadangan rekam jepret T-SQL yang diperkenalkan di SQL Server 2022 (16.x).
Alur kerja
Sintaks cadangan rekam jepret T-SQL memisahkan mekanisme rekam jepret yang bergantung pada vendor dari operasi penangguhan dan pencadangan. Dengan sintaks ini, Anda dapat:
Bekukan database dengan
ALTER
perintah , yang memberikan kesempatan bagi Anda untuk melakukan rekam jepret penyimpanan yang mendasar. Setelah itu, Anda dapat mencukur database dan merekam rekam jepret denganBACKUP
perintah .Lakukan rekam jepret beberapa database secara bersamaan dengan perintah dan
BACKUP SERVER
baruBACKUP GROUP
. Dengan opsi ini, rekam jepret dapat dilakukan pada granularitas rekam jepret penyimpanan yang mendasar, menghilangkan kebutuhan untuk melakukan rekam jepret dari disk yang sama beberapa kali.Lakukan
FULL
pencadangan danCOPY_ONLY FULL
pencadangan. Cadangan ini juga dicatat dalammsdb
.Lakukan pemulihan point-in-time menggunakan cadangan log yang diambil dengan pendekatan streaming normal setelah pencadangan rekam jepret
FULL
. Pencadangan diferensial streaming juga didukung jika diinginkan.
Catatan
Bitmap diferensial dibersihkan selama tahap pertama saat menangguhkan database dengan ALTER
perintah . Jika pengguna memutuskan untuk mencairkan database tanpa melakukan pencadangan karena rekam jepret gagal atau karena alasan lain, bitmap diferensial tidak valid. Setiap cadangan diferensial berikutnya lebih intensif I/O, karena mereka harus memindai seluruh database untuk melakukan pencadangan diferensial. Bitmap diferensial menjadi valid lagi setelah pencadangan rekam jepret berhasil.
Diagram berikut mengilustrasikan alur kerja tingkat tinggi cadangan rekam jepret T-SQL:
Langkah rekam jepret tengah mengharuskan Anda untuk memulai rekam jepret pada penyimpanan yang mendasar. Diagram berikut menunjukkan contoh bagaimana skrip cadangan dapat bekerja dengan SQL Server untuk menyelesaikan proses pencadangan rekam jepret:
Demikian pula, skrip pemulihan dapat berfungsi sebagai berikut:
Batasan
Jumlah maksimum database yang dapat Anda cadangkan dengan fitur ini adalah 64. Jika ada lebih dari 64 database di server, Anda akan melihat kesalahan berikut:
Error message:
Msg 925, Level 19, State 1, Line 4
Maximum number of databases used for each query has been exceeded. The maximum allowed is 64.
Contoh
Bagian berikut menunjukkan perintah T-SQL yang berbeda yang digunakan untuk melakukan pencadangan rekam jepret ke disk. Saat cadangan rekam jepret ditulis ke disk, hanya metadata yang terhubung ke cadangan rekam jepret yang ditulis ke file. Output tidak berisi konten database apa pun kecuali untuk header dan konten file. File shell yang dibuat sebagai bagian dari melakukan pencadangan rekam jepret harus digunakan dengan URI rekam jepret aktual untuk membuat cadangan lengkap. Database RESTORE
dari file ini mengharuskan pengguna menyalin file database dari URI rekam jepret ke titik pemasangan, sebelum mengeluarkan RESTORE
perintah. Pengguna dapat menjalankan semua perintah T-SQL tradisional, seperti RESTORE HEADERONLY
dan RESTORE FILELISTONLY
, pada file metadata cadangan rekam jepret ini, bersama dengan RESTORE DATABASE
. Sintaks mendukung penulisan metadata cadangan rekam jepret ke DISK
atau URL
. Kumpulan cadangan rekam jepret juga dapat ditambahkan seperti set cadangan streaming ke dalam satu file.
Catatan
Untuk cadangan ke URL, blob blok lebih disukai, meskipun blob halaman didukung untuk SQL Server di Windows. Untuk SQL Server di Linux dan kontainer, hanya blob blok yang didukung.
J. Menangguhkan database pengguna tunggal untuk pencadangan rekam jepret dan merekam cadangan database
ALTER DATABASE testdb1
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON;
BACKUP DATABASE testdb1
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;
B. Menangguhkan beberapa database pengguna untuk pencadangan rekam jepret
Jika beberapa database berada pada disk dasar yang sama, Anda dapat menangguhkan beberapa database dengan perintah berikut.
ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(GROUP = (testdb1, testdb2));
BACKUP GROUP testdb1, testdb2
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;
C. Menangguhkan semua database pengguna di server untuk pencadangan rekam jepret
Jika semua database pengguna di server perlu ditangguhkan, gunakan perintah berikut.
ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON;
BACKUP SERVER
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;
Catatan
Tidak ada perintah ini yang mendukung penangguhan database sistem (master
, , model
dan msdb
) untuk pencadangan rekam jepret.
D. Menangguhkan beberapa database pengguna dengan satu perintah
Rekam rekam jepret semua database pengguna di server ke dalam satu set cadangan:
ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(GROUP = (testdb1, testdb2));
BACKUP GROUP testdb1, testdb2
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;
Catatan
Secara default, SUSPEND_FOR_SNAPSHOT_BACKUP
perintah menghapus bitmap diferensial. Jika Anda lebih suka melakukan pencadangan salin saja, gunakan COPY_ONLY
kata kunci seperti yang ditunjukkan dalam contoh berikut.
E. Melakukan pencadangan rekam jepret khusus salinan
Karena bitmap diferensial dibersihkan sebelum pembekuan, SUSPEND_FOR_SNAPSHOT_BACKUP
berikan opsi (COPY_ONLY
) untuk tidak menghapus bitmap diferensial sebelum membeku.
ALTER DATABASE testdb1
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(MODE = COPY_ONLY);
BACKUP DATABASE testdb1
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;
ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(GROUP = (testdb1, testdb2), MODE = COPY_ONLY);
BACKUP GROUP testdb1, testdb2
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;
ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
(MODE = COPY_ONLY);
BACKUP SERVER
TO DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FORMAT;
Catatan
Tidak perlu digunakan COPY_ONLY
pada BACKUP
perintah, karena sudah ditentukan saat menangguhkan database untuk pencadangan rekam jepret.
F. Mencadangkan database dengan file data dan log pada drive yang berbeda
Jika Anda memiliki database dengan file data (.mdf
dan .ndf
) di beberapa drive, dan file log transaksi (.ldf
) pada drive yang berbeda, Anda dapat melakukan pencadangan rekam jepret sebagai berikut:
Tangguhkan database (yang membekukan I/O tulis pada file data dan log).
ALTER SERVER CONFIGURATION SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON;
Ambil rekam jepret semua disk yang mendasar tempat data database dan file log ada. Langkah ini tergantung pada perangkat keras.
Lakukan pencadangan menggunakan
METADATA_ONLY
opsi , yang membuat output yang berisi metadata cadangan rekam jepret (.bkm
).BACKUP DATABASE testdb1 TO DISK = 'D:\Temp\db.bkm' WITH METADATA_ONLY;
Untuk memulihkan cadangan ini di tahap selanjutnya, ikuti langkah-langkah berikut:
Pasang atau lampirkan disk rekam jepret pada VM tempat Anda ingin memulihkan.
.bkm
Gunakan file (dari langkah 3 di daftar sebelumnya) saat Anda melakukan pemulihan database.Jika drive berbeda selama pemulihan, gunakan
MOVE
opsi untuk file logis untuk menempatkannya di tujuan yang diperlukan. Misalnya, lihat Contoh N.
G. Menandai set cadangan
Anda dapat menggunakan MEDIANAME
opsi dan MEDIADESCRIPTION
dalam perintah cadangan untuk menandai URI yang terkait dengan rekam jepret. Penggunaan ini memungkinkan file cadangan untuk membawa informasi rekam jepret yang mendasar bersama dengan metadata database. Anda juga dapat menggunakan NAME
opsi dan DESCRIPTION
untuk menandai URI dengan rekam jepret set cadangan individual.
SQL Server tidak menginterpretasikan informasi dengan LABEL
cara apa pun. Namun, ini membantu pengguna untuk melihat URI yang terkait dengan cadangan rekam jepret dengan RESTORE LABELONLY
perintah .
Anda kemudian dapat melampirkan disk rekam jepret yang terletak di URI ke VM untuk memulihkan rekam jepret. URI rekam jepret yang disimpan di MEDIANAME
dan MEDIADESCRIPTION
juga kemudian tersedia untuk ditampilkan dalam msdb
tabel dbo.backupmediaset
database .
H. Output cadangan rekam jepret dengan RESTORE HEADERONLY
Output dengan RESTORE HEADERONLY
terlihat seperti sampel berikut, jika database, grup, dan server dijalankan secara berurutan dan ditulis ke file output yang sama:
RESTORE HEADERONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY;
I. Output cadangan rekam jepret dengan RESTORE FILELISTONLY
Output dengan RESTORE FILELISTONLY
menampilkan cadangan pertama yang ditetapkan secara default:
RESTORE FILELISTONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY;
j. Memfilter output RESTORE FILELISTONLY ke kumpulan cadangan
Untuk secara khusus memilih kumpulan cadangan tertentu dari beberapa set cadangan dengan RESTORE FILELISTONLY
, gunakan FILE
klausul yang sudah didukung pada RESTORE FILELISTONLY
.
RESTORE FILELISTONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3;
K. Memfilter output RESTORE FILELISTONLY ke database
Untuk lebih memilih database tunggal dari beberapa database dalam kumpulan cadangan yang dipilih dengan RESTORE FILELISTONLY
, gunakan FILE
klausa dengan DBNAME
klausa . Klausa DBNAME
hanya dapat digunakan pada kumpulan cadangan rekam jepret.
RESTORE FILELISTONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb3';
L. Memulihkan database rekam jepret
Memulihkan database dari cadangan rekam jepret seperti melampirkan database. Jalankan perintah pemulihan tanpa RECOVERY
opsi , jika database perlu dilampirkan tanpa pemulihan. Secara default, RESTORE
memilih database pertama dalam kumpulan cadangan rekam jepret. Contoh berikut memulihkan testdb1
. Jika testdb1
sudah ada di server, sertakan REPLACE
klausa. Anda perlu memasang file database sebelum menjalankan RESTORE
.
RESTORE DATABASE testdb1
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, REPLACE, --> no DBNAME clause - restore first database in backup set
MOVE 'testdb1' TO 'D:\Temp\snap\testdb1.mdf',
MOVE 'testdb1_log' TO 'D:\Temp\snap\testdb1_log.ldf';
M. Memulihkan database rekam jepret yang tercantum di tengah
Jika database yang perlu RESTORED
berada di tengah, tentukan database yang akan dipulihkan dengan DBNAME
klausa. Sintaks berikut memulihkan database yang ditentukan dalam DBNAME
klausa.
RESTORE DATABASE testdb3
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb3', --> restores testdb3 database
MOVE 'testdb3' TO 'D:\Temp\snap\testdb3.mdf',
MOVE 'testdb3_log' TO 'D:\Temp\snap\testdb3_log.ldf',
NORECOVERY;
N. Memulihkan database dengan nama yang berbeda
Anda bisa memulihkan database dengan nama yang berbeda. Jika database yang perlu RESTORED
berada di tengah, tentukan database yang akan dipulihkan dengan DBNAME
klausa. Sintaks berikut memulihkan database yang ditentukan dengan DBNAME
klausul dan mengganti namanya menjadi testdb33
.
RESTORE DATABASE testdb33 --> renames the specified database testdb3 to testdb33.
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb3', --> original name specified here
MOVE 'testdb3' TO 'D:\Temp\snap\testdb3.mdf',
MOVE 'testdb3_log' TO 'D:\Temp\snap\testdb3_log.ldf',
NORECOVERY;
O. Gunakan RESTORE BACKUPSETONLY untuk mengekstrak database dari kumpulan cadangan yang berisi beberapa database
Kumpulan cadangan rekam jepret yang berisi beberapa database dari rekam jepret grup atau server dapat dipisahkan dengan RESTORE BACKUPSETONLY
perintah . Perintah ini menghasilkan satu set cadangan per database.
Jika rekam jepret server berisi tiga database dalam file cadangan yang berisi satu set cadangan, perintah berikut menghasilkan tiga set cadangan, satu untuk setiap database. Ini membuat direktori dengan <file_name_prefix>_<unique_time_stamp>
untuk file output.
RESTORE BACKUPSETONLY
FROM DISK = 'D:\Temp\db1.bkm'
WITH METADATA_ONLY;
P. Gunakan RESTORE BACKUPSETONLY untuk mengekstrak database tertentu dalam kumpulan cadangan yang berisi beberapa database
RESTORE BACKUPSETONLY
DBNAME
mendukung parameter jika pengguna ingin menghasilkan satu database dari tiga database dalam kumpulan cadangan. Ini juga mendukung FILE
parameter untuk memfilter beberapa set cadangan dalam file cadangan.
RESTORE BACKUPSETONLY
FROM DISK = 'D:\Temp\db.bkm'
WITH METADATA_ONLY, FILE = 3, DBNAME = 'testdb2';
T. Memantau status tangguhan dan kunci yang diperoleh
Anda dapat menggunakan tampilan manajemen dinamis (DMV) berikut:
sys.dm_server_suspend_status
(lihat status ditangguhkan)sys.dm_tran_locks
(lihat kunci yang diperoleh)
R. Mencantumkan detail set cadangan
Contoh skrip berikut mencantumkan informasi set cadangan untuk cadangan rekam jepret Transact-SQL.
SELECT database_name,
type,
backup_size,
backup_start_date,
backup_finish_date,
is_snapshot
FROM msdb.dbo.backupset
WHERE is_snapshot = 1;
S. Periksa apakah database ditangguhkan untuk pencadangan rekam jepret
Contoh skrip berikut menghasilkan properti tingkat database untuk database yang ditangguhkan untuk pencadangan rekam jepret.
SELECT SERVERPROPERTY('SuspendedDatabaseCount');
SELECT SERVERPROPERTY('IsServerSuspendedForSnapshotBackup');
SELECT DATABASEPROPERTYEX('db1', 'IsDatabaseSuspendedForSnapshotBackup');
T. Sampel skrip pemecahan masalah T-SQL
Contoh skrip berikut mendeteksi database yang ditangguhkan di server, dan membatalkan penggunaannya jika perlu.
IF (SERVERPROPERTY('IsServerSuspendedForSnapshotBackup') = 1)
BEGIN
--full server suspended, requires server level thaw
PRINT 'Full server is suspended, requires server level thaw'
ALTER SERVER CONFIGURATION
SET SUSPEND_FOR_SNAPSHOT_BACKUP = OFF
END
ELSE
BEGIN
IF (SERVERPROPERTY('SuspendedDatabaseCount') > 0)
BEGIN
DECLARE @curdb SYSNAME
DECLARE @sql NVARCHAR(500)
DECLARE mycursor CURSOR FAST_FORWARD
FOR
SELECT db_name
FROM sys.dm_server_suspend_status;
OPEN mycursor
FETCH NEXT
FROM mycursor
INTO @curdb
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'unfreezing DB ' + @curdb
SET @sql = 'ALTER DATABASE ' + @curdb + ' SET SUSPEND_FOR_SNAPSHOT_BACKUP = OFF'
EXEC sp_executesql @SQL
FETCH NEXT
FROM mycursor
INTO @curdb
END
PRINT 'All DB unfrozen'
CLOSE mycursor;
DEALLOCATE mycursor;
END
ELSE
-- no suspended database, thus no user action needed.
PRINT 'No database/server is suspended for snapshot backup'
END