Bagikan melalui


Gunakan Transaksi yang Ditandai 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 akan kehilangan semua transaksi yang telah selesai setelah tanda yang digunakan sebagai titik pemulihan. Menandai transaksi hanya cocok ketika Anda menguji database terkait atau ketika Anda bersedia kehilangan transaksi yang baru saja dikonfirmasi.

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 dikonfirmasi, 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 dari tanda. Nama penanda untuk transaksi diperlukan. Nama merek dapat digunakan kembali. Log transaksi mencatat nama penanda, deskripsi, database, pengguna, informasi tanggal dan waktu, serta 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 pada pernyataan BEGIN TRAN dan gunakan klausa WITH MARK

    Anda dapat menggandengkan pernyataan BEGIN TRAN new_mark_name WITH MARK dalam transaksi yang ada. Nilai new_mark_name adalah nama penanda untuk transaksi, bahkan jika transaksi memiliki nama transaksi.

    Catatan

    Jika Anda mengeluarkan perintah BEGIN TRAN bersarang kedua dengan 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 pernyataan BEGIN TRAN...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 titik yang telah ditandai dalam transaksi 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 Penanda 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, harus ditulis sebuah prosedur tersimpan yang mengandung statement 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 yang disimpan yang berisi transaksi yang menempatkan tanda pada setiap basis data. sp_MarkAll dapat dijalankan dari instance mana pun.

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 sebagai terkomitmen dalam satu log, tetapi tidak terkomitmen di log lain.

Langkah-langkah berikut melaksanakan ini selama proses pengikatan transaksi yang ditandai:

  1. Fase persiapan dari transaksi penandaan menghentikan semua persiapan dan penyelesaian baru.

  2. Hanya komit transaksi yang sudah disiapkan yang diperbolehkan.

  3. Menandakan transaksi kemudian menunggu semua transaksi yang disiapkan untuk diselesaikan (dengan batas waktu).

  4. Transaksi yang ditandai disiapkan dan dikonfirmasi.

  5. Kios persiapan dan penerapan baru dihapus.

Hambatan yang dihasilkan oleh transaksi yang ditandai yang mencakup beberapa database dapat mengurangi kinerja pemrosesan transaksi server.

Kami menyarankan agar Anda tidak menjalankan transaksi bertanda bersamaan. Hal ini jarang terjadi tetapi mungkin bagi komitmen transaksi terdistribusi yang ditandai untuk mengalami kebuntuan dengan transaksi bertanda terdistribusi lainnya yang sedang dikomitmenkan 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 hingga atau tepat sebelum tanda tertentu, lihat Pemulihan Database Terkait yang Berisi Transaksi yang Bertanda.

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