İşlem günlüğü dosyasının içeriği daha ayrıntılı olarak


11

İşlem günlüğü ile ilgili bir sorum var (sadece kısaca LDF diyelim). Ben tam kurtarma modeli ile bir veritabanı varsayıyorum.

Ben LDF dosyası (günlükleri) her işlem veritabanına (tam kurtarma modunda) içerdiğini okudum. Sırasında oturum açmaktan farkı BEGIN TRAN; COMMAND(s); COMMITnedir? Soruyorum çünkü görünüşe göre işlemleri geri alabilirsiniz, ancak standart komutları (tam kurtarma modunda) geri alamazsınız.

İşlem sırasında LDF dosyasına kaydedilen içeriklerin normal tam kurtarma günlüğünden farklı olduğunu düşünüyorum. Bu doğru mu? Nasıl farklı? Her eylem için yalnızca “geri al” işlemlerinin dahil edilmesi mi?

İlgili bir not, tam kurtarma LDF dosyasını kullanarak standart sorguları "geri alma / geri alma" için ticari araçlar olduğunu duydum. Nasıl yapıyorlar? LDF içeriğini analiz ediyorlar ve ters / geri alma işlemleriyle gelmeye çalışıyorlar mı?


Yanıtlar:


11

Fark, "standart komutlar" olarak adlandırdığınız şeyin örtük işlemlere sahip olması ("açık değil" ve farklı bir şey anlamına gelen gerçek örtülü işlemler değil ), bu nedenle INSERTaçık bir işlem olmadan her komut verdiğinizde, bir işlem açar, verileri girin ve otomatik olarak taahhüt edin. Buna otomatik taahhüt işlemi denir.

Bu yüzden bunu geri alamazsınız INSERT: zaten taahhütlü. Dolayısıyla kural açık işlemlerle aynıdır: taahhüt edildikten sonra geri alamazsınız .

Ne demek istediğimi doğrudan SQL Server içinden görebilirsiniz.

Microsoft, SQL Server'ı, sys.fn_dblogverilen bir veritabanının işlem günlüğüne bakmak için kullanılabilen bir DMF ile gönderir .

Bu basit deneme için AdventureWorks veritabanını kullanacağım:

USE AdventureWorks2008;
GO

SELECT TOP 10 *
FROM dbo.Person;
GO

INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;

BEGIN TRAN;
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
GO

SELECT *
FROM sys.fn_dblog(NULL, NULL);
GO

Burada iki ekleme yapıyorum: biri açık ve biri açık bir işlem olmadan.

Günlük dosyasında, ikisi arasında kesinlikle hiçbir fark olmadığını görebilirsiniz:

Otomatik İşlem ve Açık İşlemler

Kırmızı INSERTolan otomatik bir işlem içinde ve mavi olan ise INSERTaçık bir işlemdir .

Bahsettiğiniz 3. taraf araçlara gelince, evet veritabanı günlüğünü analiz eder ve işlemleri "geri almak" veya "yeniden yapmak" için normal T-SQL kodu oluştururlar. Normal olarak, günlük dosyasında tam tersi bir etki yaratacak bir komut dosyası oluşturmak dışında özel bir şey yapmazlar.


7

ApexSQL Log örneğinde ticari araçların nasıl çalıştığını açıklayacağım

Ve ilgili notta, tam kurtarma LDF dosyasını kullanarak standart sorguları “geri alma / geri alma” için ticari araçlar olduğunu duydum. Nasıl yapıyorlar? LDF içeriğini analiz ediyorlar ve ters / geri alma işlemleriyle gelmeye çalışıyorlar mı?

Evet, LDF dosyasını (çevrimiçi veya ayrılmış) ve trn dosyalarını (işlem günlüğü yedekleri) okurlar, hangi işlemin gerçekleştiğini bulurlar ve aynı veya tersini yapacak bir komut dosyası oluştururlar.

Bununla birlikte, geri al ve yinele komut dosyasının yürütülen komutlarla tamamen aynı olması gerekmediğini, ancak etkinin tamamen aynı olacağını unutmayın.

Örneğin, yürütülen komut dosyası:

DELETE FROM [Person].[AddressType] WHERE Name  = 'New Loc22'

İşlem günlüğü tablodaki satır 9, 'Yeni Konum22', '41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6' ve '2002/06/01 00: 00: 00.000' değerlerine sahip satırın silindiğini kaydeder. Tablo yapısından, araç Birincil anahtarın AddressType sütunu olduğunu okuyacak ve aşağıdaki yineleme komut dosyasını oluşturacaktır:

DELETE FROM [Person].[AddressType] WHERE [AddressTypeID] = 9

İşlemin, birincil where yan tümcesinde kullanılan sütuna değil, Birincil anahtar sütununa bağlı olduğunu unutmayın. Benzer şekilde, geri al komut dosyası:

INSERT INTO [Person].[AddressType] ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) VALUES (9, N'New loc22' COLLATE SQL_Latin1_General_CP1_CI_AS, '41bc2ff6-f0fc-475f-8eb9-cec1805aa0f6', '20020601 00:00:00.000')

resim açıklamasını buraya girin

Feragatname: ApexSQL için Destek Mühendisi olarak çalışıyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.