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:

  1. Buat cadangan database lengkap atau diferensial dari setiap database terkait.

  2. Tandai blok transaksi di semua database.

  3. Cadangkan log transaksi untuk semua database.

  4. Memulihkan cadangan database DENGAN NORECOVERY.

  5. 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:

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

  2. 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:

  1. Siapkan fase penandaan transaksi stalls semua persiapan dan penerapan baru.

  2. Hanya penerapan transaksi yang sudah disiapkan yang diizinkan untuk melanjutkan.

  3. Menandai transaksi kemudian menunggu semua transaksi yang disiapkan untuk dikosongkan (dengan waktu habis).

  4. Transaksi yang ditandai disiapkan dan diterapkan.

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