স্থায়ীভাবে একটি ডাটাবেস পৃথকীকরণ


10

যদি কোনও উদাহরণস্বরূপ কোনও ডাটাবেস স্থায়ীভাবে পৃথক করা হয়, তবে সেখানে কোনও পরিষ্কার-পরিচ্ছন্নতার কাজ করা উচিত?


1
স্থায়ীভাবে কোনও ডাটাবেস বিচ্ছিন্ন করার জন্য আপনি কি ইউজ কেসটি ব্যাখ্যা করতে পারেন? কেন শুধু এটিকে বাদ দিই না?
জো ওবিশ

উত্তর:


13

আপনি যদি কোনও উদাহরণ থেকে কোনও ডাটাবেস আলাদা করেন তবে আপনাকে ফাইলের একটি ওএস-স্তরের মোছা করতে হবে। নিরাপদ পদ্ধতির পরিবর্তে ডাটাবেস ফেলে দেওয়া হয়।

আমার পরামর্শ অনুসারে আপনি কেবলমাত্র পঠন মোডে রাখার পরে এটি ডাটাবেসের চূড়ান্ত ব্যাকআপ নেবে (যেমন এটি নিশ্চিত করবে যে ব্যাকআপের সময় কোনও ক্রিয়াকলাপ হচ্ছে না), এর পরে এটি ড্রপ ডাটাবেস কমান্ডের মাধ্যমে আপনার সিস্টেম থেকে সরিয়ে ফেলবে ।

কমান্ডগুলির সম্পূর্ণ সেটটি নিম্নলিখিতগুলির মতো দেখাবে:

-- Use master db to ensure you don't have an active connection to the db you wish to affect
USE [master]
GO

-- This will kill any active transactions, but will force the database into a Read-Only state
ALTER DATABASE [db_name] SET READ_ONLY WITH ROLLBACK IMMEDIATE
GO

BACKUP DATABASE [db_name] -- Fill in more options here or use the UI to take a backup if you chooose
GO

-- This will kick out all connections from the database allowing you to drop it.
ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Drop the database (which automatically removes the files from the OS)
DROP DATABASE [db_name]
GO

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

অবশেষে, আপনি যে কোনও ব্যবহারকারীকে কেবলমাত্র এই ডাটাবেসটিতে অ্যাক্সেস দিয়েছিলেন তা থেকে সরিয়ে ফেলতে চাইবেন। এই স্ক্রিপ্টটিতে চিহ্নিত হওয়া উচিত যে ব্যবহারকারীরা কারা, যদিও ম্যাক্সের সংস্করণটি অনেক বেশি পরিচ্ছন্ন (আমি বুঝতে পারি নি যে তিনি আমার উত্তর সম্পাদনা করার পরে এটি অন্তর্ভুক্ত করার আগে পর্যন্ত তিনি একটি পদ্ধতির পোস্ট করেছিলেন):

DECLARE @ExecString NVARCHAR (4000)

-- Create Empty Table in a very lazy manner
SELECT  name, principal_id, CAST('' AS NVARCHAR(128)) as database_name
INTO ##tmp_AllDBUsers
FROM sys.server_principals
WHERE 1 = 2

-- Declare Cursor to iterate through all DBs on the instance
DECLARE dbCursor CURSOR
FOR
        SELECT name
        FROM sys .databases


DECLARE @name NVARCHAR (128)
OPEN dbCursor
FETCH NEXT FROM dbCursor
INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @ExecString = 
    'USE [' + @name + '];
    INSERT INTO ##tmp_AllDBUsers
    SELECT sp.name, sp.principal_id, DB_NAME()
    FROM sys.server_principals sp INNER JOIN sys.database_principals dp
        ON sp.sid = dp.sid'

    EXEC(@ExecString)

    FETCH NEXT FROM dbCursor
    INTO @name
END

-- Close and deallocate the cursor because you've finished traversing all it's data
CLOSE dbCursor
DEALLOCATE dbCursor

-- Show all logins that do not belong to a server-level role nor have access to any databases
SELECT sp.*
FROM sys.server_principals sp LEFT JOIN ##tmp_AllDBUsers adu
    ON sp.principal_id = adu.principal_id
WHERE adu.principal_id IS NULL
    AND sp.principal_id NOT IN (SELECT member_principal_id
                            FROM sys.server_role_members)
    AND TYPE IN ('S', 'U', 'G')

-- cleanup
DROP TABLE ##tmp_AllDBUsers

13

আমি জন এর উত্তর upvated করেছি; আপনি যে আইটেমগুলি পরিষ্কার করতে চাইবেন সে সম্পর্কে আমি কিছু বিশদ যুক্ত করতে চাই।

  1. এসকিউএল সার্ভার এজেন্ট কাজ এবং সতর্কতা ডেটাবেস রেফারেন্স হতে পারে। এগুলি পরিষ্কার করা অপ্রয়োজনীয় ত্রুটিগুলি প্রতিবেদন করা আটকাবে।

  2. ডাটাবেসের জন্য বিশেষভাবে তৈরি হওয়া যে কোনও লগইনগুলি সরান। নিম্নলিখিত টি-এসকিউএল সম্ভাব্য প্রার্থীদের লগিনগুলি সনাক্ত করবে যা আপনি তদন্ত করতে পারেন সেগুলি ব্যবহার করা হচ্ছে কিনা তা দেখার জন্য। কোড লগইনগুলি সনাক্ত করে যা কোনও ডাটাবেস দ্বারা রেফারেন্স করা হয় না।

    DECLARE @cmd nvarchar(max);
    SET @cmd = '    SELECT sp.sid
        FROM master.sys.server_principals sp
    ';
    SELECT @cmd = @cmd + '  EXCEPT 
        SELECT dp.sid
        FROM ' + QUOTENAME(d.name) + '.sys.database_principals dp
    '
    FROM sys.databases d
    WHERE d.[state] <> 6; --ignore offline DBs
    
    SET @cmd = 'SELECT spr.*
    FROM (
    ' + @cmd + '
    ) src
        INNER JOIN master.sys.server_principals spr
            ON src.sid = spr.sid
    WHERE spr.type <> ''R''
        AND spr.name NOT LIKE ''%##MS_%''
        AND spr.name NOT LIKE ''NT %''
        AND NOT EXISTS (
            SELECT 1
            FROM sys.server_role_members srm
            WHERE srm.member_principal_id = spr.principal_id
                )
    ORDER BY spr.name;
    ';
    EXEC sys.sp_executesql @cmd;
  3. ব্যাকআপ ডিভাইসগুলি সেই ডাটাবেসের জন্য উপস্থিত থাকতে পারে। এগুলি অপসারণ কঠোরভাবে প্রয়োজন হয় না, যদি সেগুলি ব্যবহার না করা হয় তবে তাদের ভবিষ্যতের সম্ভাব্য বিভ্রান্তি দূর করতে হবে go

  4. সার্ভার-স্তরের ট্রিগারগুলি ডাটাবেসটিকে রেফারেন্স করতে পারে।

  5. ডাটাবেসগুলির উল্লেখ করে রক্ষণাবেক্ষণের পরিকল্পনাগুলি সন্ধান করুন - অনুপস্থিত ডাটাবেসগুলি অপসারণ করতে আপডেট করা না হলে এগুলি ব্যর্থ হবে।


এছাড়াও ডিবি থেকে ওএস ফাইলগুলি এখনও আছে। এসকিউএল সার্ভারের পরিবেশে কোনও প্রভাব ফেলবে না, তবে ডিস্কের স্থান খালি করতে তাদের মুছে ফেলা বা সংরক্ষণাগারভুক্ত হতে পারে
CaM

@ ক্যাম: এটি জনর জবাব দিয়ে গেছে। জনের পরামর্শ হ'ল ডাটাবেসটিকে আলাদা করার পরিবর্তে ড্রপ করা, এবং এসকিউএল সার্ভারে একটি ডিবি বাদ দেওয়ার অর্থ ফাইল সিস্টেম থেকে ডিবি ফাইলগুলি মুছে ফেলা।
অ্যান্ড্রি এম

1

সমস্ত বড় পয়েন্ট ইতিমধ্যে কভার করা হয়েছে। নীচে আমার 2 সেন্ট রয়েছে:

ডেটাবেস আলাদা করা কখনই স্থায়ী সমাধান হয় না কারণ এটি সার্ভারের মধ্যে বা অন্য সার্ভারে ডাটাবেস ফাইলগুলি সরানোর জন্য ব্যবহার করা হয়েছিল। স্থায়ীভাবে একটি ডাটাবেস অপসারণ করা এসএসএমএসে মুছে ফেলা বিকল্প বা DROP ডাটাবেস কমান্ড দ্বারা উল্লিখিত হিসাবে করা যেতে পারে।

সাধারণত যে ডেটাবেসগুলি ইচ্ছাকৃতভাবে অফলাইনে রাখা হয় এবং সতর্কতাগুলি উত্পন্ন করা থাকে সেগুলি হ'ল আমরা আলাদা করে রেখেছি এবং এটি স্থায়ীভাবে অপসারণ না হওয়া অবধি এটি মুছে ফেলা (মুছে ফেলা)।

প্রাক বিচ্ছিন্ন টাস্ক: sp_helpdb dbnameফাইলের অবস্থানগুলি জানতে রান করুন Run

পরিষ্কারের কাজগুলি:

  1. তারা যে অবস্থানগুলিতে থাকে সেগুলি থেকে ডাটাবেসের mdf, ndf এবং ldf ফাইলগুলি মুছুন।
  2. ডাটাবেসগুলির জন্য পুরানো ব্যাকআপ ফাইলগুলি আপনার ধারণার সময় বিবেচনা করে মুছে ফেলা বা অন্য সার্ভারে সরানো দরকার।

লগিনস, এজেন্ট জবস, ট্রিগার এবং ম্যাক্স দ্বারা ইতিমধ্যে উল্লিখিত পয়েন্টগুলি বাদে এই 2 টিও লক্ষ্য করা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.