লগ ব্যাকআপ ফাইলগুলি জিজ্ঞাসা করার জন্য আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন এবং সারণীর একটি কলামের একটি নির্দিষ্ট মান এখনও / সর্বশেষ উপস্থিত ছিল তা লগ ব্যাকআপ ফাইল (গুলি) খুঁজে পেতে পারেন।
ব্যবহারকারীর সন্ধানের জন্য, লগ ব্যাকআপের মানটি সর্বশেষে উপস্থিত থাকার পরে আপনি সেই লগ ব্যাকআপ না হওয়া পর্যন্ত একটি ডাটাবেস পুনরুদ্ধার করতে পারেন এবং তারপরে মার্ক স্টোর-স্মিথের উত্তর অনুসরণ করতে পারেন ।
কিছু পূর্বশর্ত
- কোন মানগুলি থেকে কলামগুলি মোছা হয়েছে তা জানুন
- সম্পূর্ণ পুনরুদ্ধারের মডেলের অধীনে এবং লগ ব্যাকআপ নিচ্ছে
- আপনার লগ ব্যাকআপগুলিতে আপনার তারিখ বা শনাক্তকারী রয়েছে, যেমন ওলা হ্যালেনগ্রেনের সমাধান ব্যবহার করার সময়
দাবি পরিত্যাগী
এই সমাধানটি জলরোধী থেকে অনেক দূরে এবং আরও অনেক কাজ এটিতে প্রবেশ করা প্রয়োজন।
এটি বড় আকারের পরিবেশে বা কয়েকটি ছোট পরীক্ষা ছাড়াও কোনও পরিবেশে পরীক্ষা করা হয়নি। বর্তমান রান এসকিউএল সার্ভারে ছিল 2017।
আপনি মুহাম্মদ ইমরানের কাছ থেকে নীচের পদ্ধতিটি ব্যবহার করতে পারেন যে আমি কোনও লাইভ ডাটাবেসের লগের বিষয়বস্তুর পরিবর্তে লগ ব্যাকআপের বিষয়বস্তু নিয়ে কাজ করতে সংশোধন করেছি ।
এইভাবে আপনি প্রযুক্তিগতভাবে পুনরুদ্ধার করছেন না, পরিবর্তে অস্থায়ী সারণীতে লগ সামগ্রীগুলি ডাম্প করছেন। এটি সম্ভবত এখনও ধীর থাকবে এবং বাগ এবং সমস্যাগুলির জন্য এটি খুব উন্মুক্ত। তাত্ত্বিকভাবে এটি কাজ করতে পারে ™।
সঞ্চিত পদ্ধতি fn_dump_dblog
লগ ফাইলগুলি পড়ার জন্য অননুমোদিত ফাংশনটি ব্যবহার করে ।
পরীক্ষার পরিবেশ
এই ডাটাবেসটি বিবেচনা করুন, যেখানে আমরা কয়েকটি সারি সন্নিবেশ করি, 2 লগ ব্যাকআপ নিই এবং তৃতীয় লগ ব্যাকআপে আমরা সমস্ত সারি মুছি।
CREATE DATABASE WrongDeletesDatabase
GO
USE WrongDeletesDatabase
GO
BACKUP DATABASE WrongDeletesDatabase TO DISK ='c:\temp\Full.bak'
ALTER DATABASE WrongDeletesDatabase SET RECOVERY FULL
GO
CREATE TABLE dbo.WrongDeletes(ID INT, val varchar(255))
INSERT INTO dbo.WrongDeletes(ID,val)
VALUES (1,'value1')
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log1.trn'
GO
INSERT INTO dbo.WrongDeletes(ID,val)
VALUES (2,'value2')
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log2.trn'
GO
DELETE FROM dbo.WrongDeletes
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log3.trn'
GO
INSERT INTO dbo.WrongDeletes(ID,val)
VALUES (3,'value3')
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log4.trn'
GO
কার্যপ্রণালী
আপনি সঞ্চিত পদ্ধতিটি এখানে ডাউনলোড এবং ডাউনলোড করতে পারেন ।
আমি এটি এখানে যুক্ত করতে পারি না কারণ এটি চরিত্রের সীমা চেয়ে বড়, এবং এই উত্তরটি এর চেয়ে কম পরিষ্কার করে তুলতে পারি।
এগুলি ছাড়াও, আপনার পদ্ধতিটি চালানো উচিত।
প্রক্রিয়া চলছে
এর উদাহরণ, যখন আমি আমার সমস্ত লগ ফাইল ( 4
) সঞ্চিত পদ্ধতিতে যুক্ত করি এবং মান 1 সন্ধানের পদ্ধতিটি চালিত করি
EXEC dbo.Recover_Deleted_Data_Proc @Database_Name= 'WrongDeletesDatabase',
@SchemaName_n_TableName= 'dbo.WrongDeletes',
@SearchString = 'value1',
@SearchColumn = 'val',
@LogBackupFolder ='C:\temp\Logs\'
এটি আমাকে পেয়েছে:
ID val LogFileName
1 value1 c:\temp\Logs\log3.trn
1 value1 c:\temp\Logs\log1.trn
কোথায় শেষ কবে উপর একটি অপারেশন আমরা জানতে পারেন value1
ঘটেছে, মুছতে log3.trn
।
বিভিন্ন কলাম সহ একটি টেবিল যুক্ত করে আরও কিছু পরীক্ষার ডেটা
CREATE TABLE dbo.WrongDeletes2(Wow varchar(255), Anotherval varchar(255),Val3 int)
INSERT INTO dbo.WrongDeletes(ID,val)
VALUES (1,'value1')
INSERT INTO dbo.WrongDeletes2(wOw,Anotherval,Val3)
VALUES ('b','value1',1)
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log1_1.trn'
GO
INSERT INTO dbo.WrongDeletes(ID,val)
VALUES (2,'value2')
INSERT INTO dbo.WrongDeletes2(wOw,Anotherval,Val3)
VALUES ('c','value2',2)
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log2_1.trn'
GO
DELETE FROM dbo.WrongDeletes
DELETE FROM dbo.WrongDeletes2
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log3_1.trn'
GO
INSERT INTO dbo.WrongDeletes(ID,val)
VALUES (3,'value3')
INSERT INTO dbo.WrongDeletes2(wOw,Anotherval,Val3)
VALUES ('d','value3',3)
GO
BACKUP LOG WrongDeletesDatabase TO DISK = 'c:\temp\Logs\log4_1.trn'
GO
লগ ফাইলের নাম পরিবর্তন করে আবার প্রক্রিয়া চালাচ্ছে
EXEC dbo.Recover_Deleted_Data_Proc @Database_Name= 'WrongDeletesDatabase',
@SchemaName_n_TableName= 'dbo.WrongDeletes',
@SearchString = 'value1',
@SearchColumn = 'val',
@LogBackupFolder ='C:\temp\Logs\'
ফল
ID val LogFileName
1 value1 c:\temp\Logs\log1_1.trn
1 value1 c:\temp\Logs\log3_1.trn
1 value1 c:\temp\Logs\log3_1.trn
একটি নতুন রান, 2
এর val3
কলামে পূর্ণসংখ্যা ( ) অনুসন্ধান করছেdbo.WrongDeletes2
EXEC dbo.Recover_Deleted_Data_Proc @Database_Name= 'WrongDeletesDatabase',
@SchemaName_n_TableName= 'dbo.WrongDeletes2',
@SearchString = '2',
@SearchColumn = 'Val3',
@LogBackupFolder ='C:\temp\Logs\'
ফল
Anotherval Val3 Wow LogFileName
value2 2 c c:\temp\Logs\log2.trn
value2 2 c c:\temp\Logs\log3.trn
মার্ক স্টোর-স্মিথের উত্তর প্রয়োগ করা
আমরা এখন জানি যে এটি তৃতীয় লগ ফাইলে ঘটেছে, আসুন সেই বিন্দু পর্যন্ত পুনরুদ্ধার করুন:
USE master
GO
ALTER DATABASE WrongDeletesDatabase SET OFFLINE WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE WrongDeletesDatabase SET ONLINE
GO
RESTORE DATABASE WrongDeletesDatabase FROM DISK = 'c:\temp\Logs\Full.bak' WITH NORECOVERY,REPLACE
RESTORE LOG WrongDeletesDatabase FROM DISK = 'c:\temp\Logs\log1.trn' WITH NORECOVERY
RESTORE LOG WrongDeletesDatabase FROM DISK = 'c:\temp\Logs\log2.trn' WITH NORECOVERY
RESTORE LOG WrongDeletesDatabase FROM DISK = 'c:\temp\Logs\log3.trn' WITH RECOVERY
GO
USE WrongDeletesDatabase
GO
তার উত্তরে সর্বশেষ ক্যোয়ারী চালাচ্ছি
SELECT
u.[name] AS UserName
, l.[Begin Time] AS TransactionStartTime
FROM
fn_dblog(NULL, NULL) l
INNER JOIN
(
SELECT
[Transaction ID]
FROM
fn_dblog(NULL, NULL)
WHERE
AllocUnitName LIKE @TableName + '%'
AND
Operation = 'LOP_DELETE_ROWS'
) deletes
ON deletes.[Transaction ID] = l.[Transaction ID]
INNER JOIN
sysusers u
ON u.[sid] = l.[Transaction SID]
আমার জন্য ফলাফল (সিসাদমিন)
UserName TransactionStartTime
dbo 2019/08/09 17:14:10:450
dbo 2019/08/09 17:14:10:450