কে কীভাবে কিছু ডেটা এসকিউএল সার্ভার মুছে ফেলে তা সন্ধান করবেন


29

আমার বসের কাছে গতকাল একজন গ্রাহকের কাছ থেকে একটি জিজ্ঞাসা ছিল যে তারা কীভাবে তাদের এসকিউএল সার্ভার ডাটাবেসে কিছু ডেটা মুছে ফেলেছে তা জানতে পারে (এটি যদি প্রকাশিত হয় তবে এটি এক্সপ্রেস সংস্করণ)।

আমি ভেবেছিলাম লেনদেনের লগ থেকে এটি পাওয়া যেতে পারে (সরবরাহ করে এটি কেটে ফেলা হয়নি) - এটি কি সঠিক? এবং যদি তাই হয় তবে আপনি কীভাবে এই তথ্যটি সন্ধান করবেন?

উত্তর:


35

আমি এক্সপ্রেসে fn_dblog চেষ্টা করি নি তবে এটি উপলভ্য থাকলে নিম্নলিখিতটি আপনাকে অপারেশনগুলি মুছে দেবে:

SELECT 
    * 
FROM 
    fn_dblog(NULL, NULL) 
WHERE 
    Operation = 'LOP_DELETE_ROWS'

আপনার আগ্রহী লেনদেনের জন্য লেনদেন আইডি নিন এবং লেনদেনের সূচনা হওয়া এসআইডি সনাক্ত করুন যার সাথে:

SELECT
    [Transaction SID]
FROM
    fn_dblog(NULL, NULL)
WHERE
    [Transaction ID] = @TranID
AND
    [Operation] = 'LOP_BEGIN_XACT'

তারপরে এসআইডি থেকে ব্যবহারকারীকে সনাক্ত করুন:

SELECT
    *
FROM 
    sysusers
WHERE
    [sid] = @SID

সম্পাদনা করুন: নির্দিষ্ট টেবিলে মুছে ফেলাগুলি সন্ধান করার জন্য সেগুলি একত্রে নিয়ে আসা:

DECLARE @TableName sysname
SET @TableName = 'dbo.Table_1'

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]

এটি সত্যই এসকিউএল এক্সপ্রেসের সাথে কাজ করে তবে আমার সিস্টেমে এটি কেবল আজই ঘটে যাওয়া লেনদেনগুলি দেখায়। আমি মনে করি না এসকিউএল এক্সপ্রেসের বাক্সের বাইরে লেনদেনের লগ কাটা আছে?
ম্যাট উইলকো

5
যদি আপনার ডাটাবেসটি সহজ পুনরুদ্ধারের মডেলটিতে থাকে তবে আপনি লগের মধ্যে কতক্ষণ নিষ্ক্রিয় লেনদেনের জন্য আটকে থাকবে সে সম্পর্কে কোনও ধারনা তৈরি করতে পারবেন না।
অ্যারন বারট্রান্ড

3
লেনদেন লগ alচ্ছিক না হয়ে মৌলিক। ডাটাবেসটির জন্য পুনরুদ্ধার মডেল কী (সহজ বা পূর্ণ) এবং ব্যাকআপ কীভাবে কনফিগার করা হয় (কেবলমাত্র সম্পূর্ণ বা লগ ব্যাকআপ + পূর্ণ)?
মার্ক স্টোরী-স্মিথ

আমি নিজের উত্তরের জন্য এটি এখানে চুরি করেছি যদিও স্ব-যোগদানের বিষয়টি এড়াতে কিছুটা রিফ্যাক্ট করা হয়েছেfn_dblog । একটি ক্ষতি হ'ল এটি USERNAME()অনেক বেশি দরকারী লগইন নামের চেয়ে ডাটাবেস ফিরিয়ে দেয় ।
মার্টিন স্মিথ

3

ডাটাবেসটি যদি পুরো পুনরুদ্ধার মোডে থাকে বা আপনার যদি লেনদেনের লগ ব্যাকআপ থাকে তবে আপনি তৃতীয় পক্ষের লগ রিডার ব্যবহার করে এগুলি পড়তে চেষ্টা করতে পারেন।

আপনি এপেক্সএসকিউএল লগ (প্রিমিয়াম তবে একটি বিনামূল্যে ট্রায়াল রয়েছে) বা এসকিউএল লগ রেসকিউ (ফ্রি তবে এসকিএল 2000 কেবল) ব্যবহার করতে পারেন।


3

কে কীভাবে তাদের এসকিউএল সার্ভার ডাটাবেসে কিছু ডেটা মুছে ফেলে তা তারা জানতে পারে

যদিও এর উত্তর দেওয়া হয়েছে, যুক্ত করতে চেয়েছিলেন যে এসকিউএল সার্ভারের একটি ডিফল্ট ট্রেস সক্ষম রয়েছে এবং এটি কীভাবে অবজেক্টগুলি ফেলেছে / পরিবর্তন করেছে তা খুঁজে বের করতে এটি ব্যবহার করা যেতে পারে।

ইভেন্ট ইভেন্ট

অবজেক্ট ইভেন্টগুলির মধ্যে রয়েছে: অবজেক্ট অলরেটেড, অবজেক্ট তৈরি এবং অবজেক্ট মোছা

দ্রষ্টব্য: ডিফল্টরূপে এসকিউএল সার্ভারে 5 টি ট্রেস ফাইল রয়েছে, প্রতিটি 20 এমবি এবং এটি পরিবর্তন করার কোনও ज्ञিত সমর্থিত পদ্ধতি নেই। আপনার যদি একটি ব্যস্ত সিস্টেম থাকে তবে ট্রেস ফাইলগুলি খুব দ্রুত গতিতে (এমনকি কয়েক ঘণ্টার মধ্যে) রোধ করতে পারে এবং আপনি কিছু পরিবর্তন করতে সক্ষম নাও হতে পারেন।

দুর্দান্ত উদাহরণটি পাওয়া যাবে: এসকিউএল সার্ভারে ডিফল্ট ট্রেস - কর্মক্ষমতা এবং সুরক্ষা নিরীক্ষণের শক্তি


1

লগ ব্যাকআপ ফাইলগুলি জিজ্ঞাসা করার জন্য আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন এবং সারণীর একটি কলামের একটি নির্দিষ্ট মান এখনও / সর্বশেষ উপস্থিত ছিল তা লগ ব্যাকআপ ফাইল (গুলি) খুঁজে পেতে পারেন।

ব্যবহারকারীর সন্ধানের জন্য, লগ ব্যাকআপের মানটি সর্বশেষে উপস্থিত থাকার পরে আপনি সেই লগ ব্যাকআপ না হওয়া পর্যন্ত একটি ডাটাবেস পুনরুদ্ধার করতে পারেন এবং তারপরে মার্ক স্টোর-স্মিথের উত্তর অনুসরণ করতে পারেন ।

কিছু পূর্বশর্ত

  • কোন মানগুলি থেকে কলামগুলি মোছা হয়েছে তা জানুন
  • সম্পূর্ণ পুনরুদ্ধারের মডেলের অধীনে এবং লগ ব্যাকআপ নিচ্ছে
  • আপনার লগ ব্যাকআপগুলিতে আপনার তারিখ বা শনাক্তকারী রয়েছে, যেমন ওলা হ্যালেনগ্রেনের সমাধান ব্যবহার করার সময়

দাবি পরিত্যাগী

এই সমাধানটি জলরোধী থেকে অনেক দূরে এবং আরও অনেক কাজ এটিতে প্রবেশ করা প্রয়োজন।

এটি বড় আকারের পরিবেশে বা কয়েকটি ছোট পরীক্ষা ছাড়াও কোনও পরিবেশে পরীক্ষা করা হয়নি। বর্তমান রান এসকিউএল সার্ভারে ছিল 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.