Gunakan Transaksi Bertanda untuk Memulihkan Database Terkait Secara Konsisten
Berlaku untuk: SQL Server
Topik ini hanya relevan untuk database SQL Server yang menggunakan model pemulihan penuh atau dicatat secara massal.
Saat Anda membuat pembaruan terkait ke dua database atau lebih, database terkait, Anda dapat menggunakan tanda transaksi untuk memulihkannya ke titik yang konsisten secara logis. Namun, pemulihan ini kehilangan transaksi apa pun yang dilakukan setelah tanda yang digunakan sebagai titik pemulihan. Menandai transaksi hanya cocok ketika Anda menguji database terkait atau ketika Anda bersedia kehilangan transaksi yang baru-baru ini diterapkan.
Secara rutin menandai transaksi terkait di setiap database terkait menetapkan serangkaian titik pemulihan umum dalam database. Tanda transaksi dicatat dalam log transaksi dan disertakan dalam cadangan log. Jika terjadi bencana, Anda dapat memulihkan setiap database ke tanda transaksi yang sama untuk memulihkannya ke titik yang konsisten.
Catatan
Pencadangan log pada database yang berbeda dapat dibuat secara independen satu sama lain dan tidak harus bersamaan.
Memulihkan database terkait dalam skenario berikut mengharuskan Anda telah menandai transaksi di setiap database terkait:
Satu atau beberapa log transaksi dihancurkan. Anda harus memulihkan kumpulan database ke status konsisten pada saat pencadangan log terakhir Anda.
Anda harus memulihkan seluruh kumpulan database ke status yang saling konsisten pada beberapa titik waktu sebelumnya.
Penting
Anda hanya dapat memulihkan database terkait ke transaksi yang ditandai, bukan ke titik waktu tertentu.
Untuk informasi tentang cara membuat transaksi penandaan, lihat "Membuat Transaksi yang Ditandai," nanti dalam topik ini.
Skenario Umum untuk Menggunakan Transaksi yang Ditandai
Skenario umum untuk menggunakan transaksi yang ditandai mencakup langkah-langkah berikut:
Buat cadangan database lengkap atau diferensial dari setiap database terkait.
Tandai blok transaksi di semua database.
Cadangkan log transaksi untuk semua database.
Memulihkan cadangan database DENGAN NORECOVERY.
Pulihkan log DENGAN STOPATMARK.
Pertimbangan untuk Menggunakan Transaksi Yang Ditandai
Sebelum menyisipkan tanda bernama ke dalam log transaksi, pertimbangkan hal berikut:
Karena tanda transaksi menggunakan ruang log, gunakan hanya untuk transaksi yang memainkan peran penting dalam strategi pemulihan database.
Setelah transaksi yang ditandai diterapkan, baris disisipkan dalam tabel logmarkhistory dalam msdb.
Jika transaksi yang ditandai mencakup beberapa database di server database yang sama atau di server yang berbeda, tanda harus direkam dalam log semua database yang terpengaruh.
Membuat Transaksi yang Ditandai
Untuk membuat transaksi yang ditandai, gunakan pernyataan BEGIN TRANSACTION dan klausa WITH MARK [description]. Deskripsi opsional adalah deskripsi tekstual tanda. Nama tanda untuk transaksi diperlukan. Nama tanda dapat digunakan kembali. Log transaksi mencatat nama tanda, deskripsi, database, pengguna, informasi tanggalwaktu, dan nomor urutan log (LSN). Informasi tanggalwaktu digunakan bersama dengan nama tanda untuk mengidentifikasi tanda secara unik.
Untuk membuat transaksi yang ditandai dalam sekumpulan database:
Beri nama transaksi dalam pernyataan BEGIN TRAN dan gunakan klausa WITH MARK
Anda dapat menumpuk pernyataan BEGIN TRAN new_mark_name WITH MARK dalam transaksi yang ada. Nilai new_mark_name adalah nama tanda untuk transaksi, bahkan jika transaksi memiliki nama transaksi.
Catatan
Jika Anda mengeluarkan TRAN BEGIN berlapis kedua... WITH MARK, pernyataan tersebut dilewati tetapi menyebabkan pesan peringatan.
Jalankan pembaruan terhadap semua database dalam set.
Tanda untuk transaksi tertentu dimasukkan ke dalam log transaksi hanya pada instans server tempat BEGIN TRAN... Pernyataan WITH MARK dijalankan. Tanda transaksi ditempatkan dalam log transaksi setiap database yang diperbarui oleh transaksi yang ditandai pada instans server tersebut. Jika database berada di instans server yang berbeda, tanda identik harus dibuat pada setiap instans server.
Contoh
Contoh berikut memulihkan log transaksi ke tanda dalam transaksi yang ditandai bernama ListPriceUpdate
.
USE AdventureWorks2022;
GO
BEGIN TRANSACTION ListPriceUpdate
WITH MARK 'UPDATE Product list prices';
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
COMMIT TRANSACTION ListPriceUpdate;
GO
-- Time passes. Regular database
-- and log backups are taken.
-- An error occurs in the database.
USE master
GO
RESTORE DATABASE AdventureWorks
FROM AdventureWorksBackups
WITH FILE = 3, NORECOVERY;
GO
RESTORE LOG AdventureWorks
FROM AdventureWorksBackups
WITH FILE = 4,
RECOVERY,
STOPATMARK = 'UPDATE Product list prices';
Memaksa Tanda untuk Menyebar ke Server Lain
Nama tanda transaksi tidak didistribusikan secara otomatis ke server lain karena transaksi menyebar di sana. Untuk memaksa tanda menyebar ke server lain, prosedur tersimpan harus ditulis yang berisi pernyataan BEGIN TRAN name WITH MARK. Prosedur tersimpan itu kemudian harus dijalankan di server jarak jauh di bawah cakupan transaksi di server asal.
Misalnya, pertimbangkan database yang dipartisi yang ada di beberapa instans SQL Server. Pada setiap instans adalah database bernama coyote
. Pertama, di setiap database, buat prosedur tersimpan, misalnya, sp_SetMark
.
CREATE PROCEDURE sp_SetMark
@name nvarchar (128)
AS
BEGIN TRANSACTION @name WITH MARK
UPDATE coyote.dbo.Marks SET one = 1
COMMIT TRANSACTION;
GO
Selanjutnya, buat prosedur sp_MarkAll
tersimpan yang berisi transaksi yang menempatkan tanda di setiap database. sp_MarkAll
dapat dijalankan dari salah satu instans.
CREATE PROCEDURE sp_MarkAll
@name nvarchar (128)
AS
BEGIN TRANSACTION
EXEC instance0.coyote.dbo.sp_SetMark @name
EXEC instance1.coyote.dbo.sp_SetMark @name
EXEC instance2.coyote.dbo.sp_SetMark @name
COMMIT TRANSACTION;
GO
Penerapan Dua Fase
Melakukan transaksi terdistribusi terjadi dalam dua fase: persiapan dan penerapan. Ketika transaksi yang ditandai dilakukan, catatan log penerapan untuk setiap database dalam transaksi yang ditandai ditempatkan di log pada titik di mana tidak ada transaksi yang ragu di salah satu log. Pada titik ini, dijamin bahwa tidak ada transaksi yang muncul seperti yang dilakukan dalam satu log, tetapi tidak dilakukan di log lain.
Langkah-langkah berikut menyelesaikan ini selama penerapan transaksi yang ditandai:
Siapkan fase penandaan transaksi stalls semua persiapan dan penerapan baru.
Hanya penerapan transaksi yang sudah disiapkan yang diizinkan untuk melanjutkan.
Menandai transaksi kemudian menunggu semua transaksi yang disiapkan untuk dikosongkan (dengan waktu habis).
Transaksi yang ditandai disiapkan dan diterapkan.
Kios persiapan dan penerapan baru dihapus.
Kios yang dihasilkan oleh transaksi bertanda yang mencakup beberapa database dapat mengurangi performa pemrosesan transaksi server.
Kami menyarankan agar Anda tidak menjalankan transaksi bertanda bersamaan. Hal ini jarang terjadi tetapi mungkin untuk penerapan transaksi yang ditandai terdistribusi untuk kebuntuan dengan transaksi bertanda terdistribusi lainnya yang berkomitmen pada saat yang sama. Ketika ini terjadi, transaksi penandaan dipilih sebagai korban kebuntuan dan digulung balik. Ketika kesalahan ini terjadi, aplikasi dapat mencoba kembali transaksi yang ditandai. Ketika beberapa transaksi yang ditandai mencoba untuk melakukan secara bersamaan, ada kemungkinan kebuntuan yang lebih tinggi.
Memulihkan ke Transaksi yang Ditandai
Untuk informasi tentang cara memulihkan database yang berisi transaksi bertanda ke atau tepat sebelum tanda tertentu, lihat Pemulihan Database Terkait yang Berisi Transaksi Yang Ditandai.
Lihat Juga
MULAI TRANSAKSI TERDISTRIBUSI (T-SQL)
Pencadangan dan Pemulihan Database Sistem (SQL Server)
BEGIN TRANSACTION (Transact-SQL)
Menerapkan Pencadangan Log Transaksi (SQL Server)
Pencadangan Database Lengkap (SQL Server)
RESTORE (Transact-SQL)
Pemulihan Database Terkait yang Berisi Transaksi Yang Ditandai