আপনি কীভাবে একটি এসকিউএল সার্ভার ২০০৮ ডাটাবেস থেকে ব্যবহারকারীদের লাথি মারবেন?


22

আমাদের একটি পুনরুদ্ধার করতে হবে, এবং অন্য ব্যবহারকারীরা সংযুক্ত থাকার কারণে তা করতে পারে না। আমরা ভেবেছিলাম আমরা প্রতিটি প্রক্রিয়া সংযোগ বিচ্ছিন্ন করেছি, তবে দৃশ্যত তা হয়নি।

আমরা কীভাবে, ম্যানেজমেন্ট স্টুডিও থেকে, অন্য সবাইকে সরিয়ে দিতে পারি যাতে আমরা এই ব্যাকআপটি করতে পারি?

উত্তর:


25

এটি করার দুটি উপায় রয়েছে:

  1. অবজেক্ট এক্সপ্লোরার ডাটাবেসে ডান ক্লিক করুন টাস্কগুলি> বিযুক্তিতে যান। ড্রপ সংযোগগুলি চেকবক্সটি নির্বাচন করুন।

  2. এখানে বর্ণিত হিসাবে একক-ব্যবহারকারী মোডে ডাটাবেস সেট করুন :

    -- hit Ctrl+Shift+M in SSMS to fill in the template parameter
    USE master;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET SINGLE_USER
    WITH ROLLBACK IMMEDIATE;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET READ_ONLY;
    GO
    
    ALTER DATABASE N'<Database Name, sysname,>'
    SET MULTI_USER;
    GO
    

বুঝতে পারিনি যে আমার কাছে অনেকগুলি মন্তব্য ছিল। মারিয়ান সঠিক, আসল বিচ্ছেদটি চালানোর দরকার নেই, কেবল ব্যবহারকারীদের হত্যা করার জন্য স্ক্রিপ্টটি পান। @ নিকচ্যামাস হ্যাঁ, এটি পড়ার ফলে কেবল ব্যবহারকারীদের পুনরায় সংযোগ স্থাপন থেকে বিরত রয়েছে। আপনি যখন এটি মাল্টি-ব্যবহারকারী সেট করেন আপনি পুনরুদ্ধারটি করতে পারেন। এছাড়াও ডিবি নামগুলি একটি টেম্পলেট থেকে এবং যেমন << ডেটাবেস নাম, সিসনাম> 'এর মতো ট্যাগগুলি সিটিআরএল + শিফট + এম ব্যবহারের মাধ্যমে প্রতিস্থাপনের উদ্দেশ্যে করা হয়। একটি অ-তাত্পর্যপূর্ণ স্ক্রিপ্টে, ডিবনেমগুলির চারপাশে কোনও উদ্ধৃতি থাকবে না।
Wil

43

আমি সর্বদা নিম্নলিখিতটি ব্যবহার করি:

USE master; -- get out of dbname myself
GO
-- kick all other users out:
ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- prevent sessions from re-establishing connection:
ALTER DATABASE [dbname] SET OFFLINE;

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

যখন আমি সেই ডাটাবেসের কনফিগারেশনে আমার পরিবর্তনগুলি করি, আমি কেবল:

ALTER DATABASE [dbname] SET ONLINE;
ALTER DATABASE [dbname] SET MULTI_USER;

যদিও, কখনও কখনও, সেই ডাটাবেসে আমার যে জিনিসটি করা দরকার তা জন্য ডাটাবেসটি অনলাইনে থাকা দরকার, তাই কখনও কখনও আমাকে এটি একক-ব্যবহারকারী মোডে রেখে এই কাজটি করতে হয়:

ALTER DATABASE [dbname] SET ONLINE;
GO
USE [dbname];

এখন আমি আমার পরিবর্তনগুলি করতে পারি এবং তারপরে আমি যখন অন্য ব্যবহারকারীদের সাথে সংযোগ স্থাপনের জন্য প্রস্তুত থাকি তখন কেবল:

ALTER DATABASE [dbname] SET MULTI_USER;

2

আমি সাধারণত সিঙ্গল_উসারে ডাটাবেস সেট করি এবং তারপরে বিলম্বের জন্য অপেক্ষা করি এবং তারপরে ডাটাবেসটিকে মাল্টিউজারে আবার নীচের মত সেট করে রেখেছি:

-- to kill all connections for particular db ... otherwise the restore will fail as exclusive lock cannot be obtained for the db being restored.

    alter database db_name
    set single_user with rollback immediate
    waitfor delay '00:00:05'  -- wait for 5 secs
    alter database db_name
    set multi_user
    restore database db_name from disk = 'D:\restore\db_name.bak'
    with replace, stats = 10, recovery -- if you want to recover your database online
    -- optional if you dont have the same directory/file structure
    move 'datafile logical name' to 'E:\data\physical_name.mdf',
    move 'logfile logical name' to 'F:\log\physical_name_log.ldf'

আসলে, "মাল্টি_উজার সেট" করার দরকার নেই, যেহেতু আপনি পুনরুদ্ধার বিবৃতি দিয়ে একটি একক স্ক্রিপ্ট (লেনদেন) চালাচ্ছেন। পুনরুদ্ধারের সাথে পুনরুদ্ধারটি ডাটাবেসটিকে মাল্টি-ব্যবহারকারী মোডে ফিরিয়ে আনার যত্ন নেবে।
স্বেইন তেরে গপ

1

উপরের কোনও বিকল্প আমার পক্ষে কাজ করে নি কারণ একাধিক দূরবর্তী সংযোগের চেষ্টা করে সার্ভারটি হামার হয়ে পড়েছে।

আমি যখন উইন্ডোজ ফায়ারওয়ালে নির্দিষ্ট ডাটাবেস পোর্টটি বন্ধ করে দিয়েছিলাম, তখন সাধারণ পরিবর্তন হয় .. সেট মাল্টি_ইউসার প্রথম প্রয়াসের মধ্যেই কাজ করে।


-1

নিম্নলিখিতটি আসলে সমস্ত সংযোগকে হত্যা করে। একক ব্যবহারকারী মোডে সেটিংস ব্যর্থ হওয়ার ক্ষেত্রে বেশ কার্যকর

declare @execSql varchar(1000), @databaseName varchar(100)
-- Set the database name for which to kill the connections
set @databaseName = 'databasename'
set @execSql = '' 
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '
from    master.dbo.sysprocesses
where   db_name(dbid) = @databaseName
     and
     DBID <> 0
     and
     spid <> @@spid
exec(@execSql)

1
এটি কার্যকর হয় না কারণ sysprocessesসবসময় যে সমস্ত অধিবেশনগুলিতে সেই ডাটাবেসে তালাবন্ধ থাকতে পারে তার জন্য অ্যাকাউন্ট থাকে না (এমন সাধারণ দৃশ্যের কথা চিন্তা করুন যেখানে ডাটাবেস A এর প্রসঙ্গে একটি কোয়েরি চালানো হয় তবে A তে একটি টেবিল এবং বিতে একটি টেবিলের সাথে যোগ দেয়) ।
অ্যারন বার্ট্র্যান্ড

-1

আপনি নীচের স্ক্রিপ্টটি ব্যবহার করতে পারেন হয় সবাইকে নাক করে, বা একটি নির্দিষ্ট ডিবি-র জন্য পরিবর্তন করতে পারেন।

যে কিছু মেরে ফেলা যায়, তা হবে! এসকিউএল পরিষেবা এসপিআইডিগুলি তবে প্রভাবিত হবে না।

Drop table #who

go 

Create table #who(  [spid] int,
                    [ECID] int,
                    [Status] varchar(100),
                    [Loginname] varchar(200),
                    [Hostname] varchar(200),
                    [blk] bit,
                    dbname varchar(200),
                    cmd varchar(1000),
                    requestID int
                  )

go

Insert into #who (Spid, ECID, Status, Loginname, hostname,blk, dbname, cmd, requestid)
exec sp_who

Declare cursKillUsers Cursor for Select 'Kill ' + cast(spid as varchar(100)) + ';' [SQL] from #who where dbname like '%'
Declare @sql varchar(200)
Open cursKillUsers
Fetch next from cursKillUsers into @sql
While @@fetch_status = 0 
begin

    print @sql
    Exec (@sql)
    Fetch next from cursKillUsers into @sql

end

close cursKillUsers
deallocate cursKillUsers

-3

আমি এই কোডটি ব্যবহার করি:

ALTER DATABASE [Dbname] set offline with rollback immediate
GO
ALTER DATABASE [Dbname] set online
GO

তবে আমি দেখতে পাচ্ছি একক ব্যবহারকারীর উদাহরণটি টাইপ করা কম।


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