Öncelikle Merhaba Arkadaşlar Ufak bir bilgim vardı aslında bu konuda ama birazdaha detaylı araştırma sonucu birazdaha bilgime bilgi kattım sizlere bu bilgiyi paylaşırken bazı bölümleri daha farklı yerlerden aldığım bilgiler ile sizlere elimden geldiği kadarı ile aktarmaya çalışacağım ...
veritabanından hata sonucu silinen verilerin size nasıl yapılacağı hakkında bilgi aktaracağım. Bu işlemi yapabilmek için veritabanında recovery model bilgisi FULL yada Bulk-Logged olmalıdır.. Simple modda olan bir veritabanı transaction logs backupI desteklemediği için bu işlemi yapamazssınız.
Öncelikle demomuzu hazırlamak için bir veritabanı ve varsayılan değerler barındıran tablo oluşturalım. ( Demo ortamımız Windows Server 2012 R2 üzerinde SQL Server 2016 Developer Editiondır. )
-- E:\\RecoverDeletedData dosya yolunda RecoverDeletedData isiminde veritabanı oluşturuyoruz. Recovery Mode bilgisi FULL
Kod:
CREATE DATABASE [RecoverDeletedData]
ON PRIMARY
( NAME = NRecoverDeletedData, FILENAME = NE:\\RecoverDeletedData\\RecoverDeletedData.mdf , SIZE = 8192KB , FILEGROWTH = 524288KB )
LOG ON
( NAME = NRecoverDeletedData_log, FILENAME = NE:\\RecoverDeletedData\\RecoverDeletedData_log.ldf , SIZE = 8192KB , FILEGROWTH = 1048576KB )
GO
ALTER DATABASE [RecoverDeletedData] SET RECOVERY FULL
-- Oluşturduğumuz Veritabanı üzerinde Orders isimli bir tablo oluşturuyoruz.
Kod:
use RecoverDeletedData
go
create table Orders
(
OrderId int not null primary key identity(1,1),
OrderDate DATETIME DEFAULT GETDATE ( ) ,
OrderItem VARCHAR ( 25 ) DEFAULT MyItem ,
LineItem VARCHAR ( 25 ) DEFAULT MyLineItem
)
Demo için kullanacağınız veritabanını oluşturdunuz . İçinde Orders adubda tablonuz da var. Şimdi bunların aşağıdaki kod ile Full Backup ve Transaction Log Backup alın
-- E:\\RecoverDeletedData diskine RecoverDeletedData_FULL.bak isiminde Full Backup Alıyoruz.
Kod:
BACKUP DATABASE [RecoverDeletedData]
TO DISK = NE:\\RecoverDeletedData\\RecoverDeletedData_FULL.bak WITH INIT
--E:\\RecoverDeletedData diskine RecoverDeletedData_FULL.bak isiminde Transaction Log Backup Alıyoruz.
Kod:
BACKUP LOG [RecoverDeletedData]
TO DISK = NE:\\RecoverDeletedData\\RecoverDeletedData_LOG_1.trn WITH INIT
GO
RecoverDeletedData isimli veritabanında bazı insert işlemler gerçekleştirmeyi deneyelim . Aşağıdaki gibi benzer sorgular ile belirli zaman aralıklar sorgu çalıştırıp data oluşturdum.
Kod:
INSERT INTO Orders DEFAULT VALUES ;
GO 100
waitfor delay 00:00:10′
GO
Oluşan demo datası üzerinde Delete işlemi gerçekleştiriyorum.
delete from Orders where OrderId in ( 2,10,11,5,7,30)
Şimdi Aşağıdaki fn_dblog sorgusu ile delete işlemin LSN bilgisini ve işlem zamanı bilgisini öğrenelim.
delete from Orders where OrderId in ( 2,10,11,5,7,30)
Şimdi Aşağıdaki fn_dblog sorgusu ile delete işlemin LSN bilgisini ve işlem zamanı bilgisini öğrenelim.
Yukarıdaki TransactionID bilgisini yedekleyelim, aşağıdaki sorguda kullanıp hangi kayıtların silindiği bilgisine ulaşacağız. Yukarıda kullandığım Delete sorgusu sonucunda 6 kayıt silinmişti, aşağıdaki sorgunun sonucuda 6 kayıt dönüyor.
Kod:
SELECT [Current LSN], [Transaction ID], [Operation], [AllocUnitName]
FROM fn_dblog(NULL, NULL)
WHERE 1=1
and [Transaction ID] = 0000:00000398
and [Operation] = LOP_BEGIN_XACT
Yukarıdaki gördğümüz Current LSN numarasını bir yere not almamızda fayda var, ihtiyacımız olacaktır. Aşağıdaki sorgu ile mevcut veritabanı farklı isim ile aldığımız full backupdan restore ediyoruz.
Kod:
USE RecoverDeletedData
GO
RESTORE DATABASE RecoverDeletedData_COPY FROM
DISK = E:\\RecoverDeletedData\\RecoverDeletedData_FULL.bak
WITH
MOVE RecoverDeletedData TO E:\\RecoverDeletedData\\COPY\\RecoverDeletedData.mdf,
MOVE RecoverDeletedData_log TO E:\\RecoverDeletedData\\COPY\\RecoverDeletedData_log.ldf,
REPLACE, NORECOVERY;
GO
Transaction Log Backup restore ederken STOPBEFOREMARK işlemini kullanacağız. STOPBEFOREMARK kullanbilmek için daha önce aldığımız Current LSN numarasının onluk sayı sistemine çevirmemiz gerekiyor. Örneğimizdeki Current LSN numarası ( 00000022:00000193:0001 ) 3 parça olarak alıglıyoruz. Birinci Kısım ( 00000022 ), İkinci Kısım ( 00000193 ) ve üçüncü kısım ( 0001 ) dır. Bu değerleri şimdi bu web sitesi aracılığı ile 10luk sayı sistemine çeviriyoruz.
Kod:
00000022 -> 34
00000193 -> 403
0001 -> 1
Yukarıdaki değerleri birleştirip kendimize STOPBEFOREMARKın Kabul edeceği decimal bir değer elde ediyoruz. ( 3400000004030000000001 )
STOPBEFOREMARK özelliği için decimal değeri oluşturmak için web sitesini kullanmadan da aşağıdaki sorguyu kullanıp STOPBEFOREMARKın decimal değerini elde edebiliriz.
STOPBEFOREMARK özelliği için decimal değeri oluşturmak için web sitesini kullanmadan da aşağıdaki sorguyu kullanıp STOPBEFOREMARKın decimal değerini elde edebiliriz.
Kod:
SELECT CAST(CAST(CONVERT(VARBINARY, LEFT([Current LSN], 8), 2 ) AS INT) AS VARCHAR) + RIGHT(0000000000 + CAST(CAST(CONVERT(VARBINARY, SUBSTRING([Current LSN], 10, 8), 2) AS INT) AS VARCHAR), 10 ) + RIGHT(00000′ + CAST(CAST(CONVERT(VARBINARY, RIGHT([Current LSN], 4), 2 ) AS INT) AS VARCHAR), 5) AS [Decimal LSN] , [Transaction Name], [Begin Time] FROM fn_dump_dblog (NULL, NULL, NDISK, 1, NE:\\RecoverDeletedData\\RecoverDeletedData_LOG_2.trn,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)
WHERE [Transaction Name] IN (DELETE)
Öncelikli olarak ilk aldığımız Transaction Logu restore edelim.
Kod:
RESTORE LOG [RecoverDeletedData_COPY] FROM DISK = NE:\\RecoverDeletedData\\RecoverDeletedData_LOG_1.trn WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
Şimdi ise e lde ettiğimiz Decimal LSN numarasını nihayet STOPBEFOREMARK ile kullanabilir durumdayız.
Kod:
USE RecoverDeletedData
GO
RESTORE LOG RecoverDeletedData_COPY FROM DISK = NE:\\RecoverDeletedData\\RecoverDeletedData_LOG_2.trn WITH STOPBEFOREMARK = lsn:34000000040300001
Bir yazımızın daha sonuna geldik başta belirttiğim gibi farklı 2-3 forumdan da konuyu hazırlarken destek aldım . umarım işinize yarar..
Tekrar görüşmek Dileğiyle.iYi Forumlar Dilerim...
Tekrar görüşmek Dileğiyle.iYi Forumlar Dilerim...





