كيف يمكنك قتل جميع الاتصالات الحالية إلى قاعدة بيانات SQL Server 2005?

StackOverflow https://stackoverflow.com/questions/11620

  •  08-06-2019
  •  | 
  •  

سؤال

أريد إعادة تسمية قاعدة البيانات ، ولكن يبقى الحصول على الخطأ الذي 'لا يمكن الحصول على تأمين للاستخدام خاص على قاعدة البيانات ، مما يعني أن هناك بعض اتصال(ق) لا تزال نشطة.

كيف يمكنني قتل جميع اتصالات قاعدة البيانات بحيث لا يمكن تسمية ذلك ؟

هل كانت مفيدة؟

المحلول

انظر قتل جميع الاتصالات النشطة إلى قاعدة البيانات.

والسبب أن النهج الذي آدم اقترح لن يعمل هو أنه خلال الوقت الذي كنت حلقات على اتصالات نشطة واحدة جديدة يمكن أن تنشأ ، سوف تفوت هذه.المادة الأولى مرتبطة يستخدم النهج التالي الذي ليس لديه هذا العيب:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

نصائح أخرى

السيناريو لإنجاز هذا محل 'DB_NAME' مع قاعدة البيانات إلى قتل جميع الاتصالات:

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END

قتله و قتله بالنار:

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END

باستخدام SQL server Management Studio Express:

في "مستكشف كائن" شجرة أسفل تحت إدارة "مراقبة النشاط" (إذا كنت لا يمكن العثور عليه هناك ثم انقر على الحق في خادم قاعدة البيانات ثم حدد "مراقبة النشاط").افتتاح مراقبة النشاط ، يمكنك عرض جميع معلومات عملية.يجب أن تكون قادرة على العثور على تأمين قاعدة البيانات كنت مهتما في قتل تلك الأقفال التي سوف تقتل أيضا الاتصال.

يجب أن تكون قادرة على إعادة تسمية بعد ذلك.

لقد استعملت دائما:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO 
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE

تأخذ حاليا يأخذ بعض الوقت و أحيانا تواجه بعض المشاكل مع هذا..

أقوى طريقة في رأيي:

فصل حق انقر DB -> المهام -> فصل...تحقق من "إسقاط اتصالات" طيب

أعد الحق انقر فوق قواعد بيانات -> نعلق..إضافة...-> حدد قاعدة البيانات الخاصة بك, وتغيير إرفاق مثل العمود المطلوب اسم قاعدة البيانات.طيب

Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'

Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((                              
            select '  ' + KillCommand from #temp
            FOR XML PATH('')),1,1,'') 
Execute sp_executesql @query 
Drop table #temp

استخدام 'سيد' قاعدة البيانات و تشغيل هذا الاستعلام تقتل كل الاتصالات النشطة من قاعدة البيانات الخاصة بك.

وعادة ما تعمل في هذا الخطأ عندما أحاول استعادة قاعدة البيانات وعادة ما يذهب فقط إلى أعلى الشجرة في إدارة Studio انقر بزر الماوس الأيمن ثم قم بإعادة تشغيل خادم قاعدة البيانات (لأنه على تطوير آلة, هذا قد لا يكون مثاليا في الإنتاج).هذا هو بإغلاق كافة اتصالات قاعدة البيانات.

في MS SQL Server إدارة Studio على كائن explorer, انقر بزر الماوس الأيمن فوق قاعدة البيانات.في قائمة السياق الذي يلي تحديد المهام -> تأخذ حاليا'

آخر "قتل مع النار" النهج هو مجرد إعادة تشغيل خدمة MSSQLSERVER.أود أن تفعل الأشياء من سطر الأوامر.لصق هذا بالضبط في CMD سوف نفعل ذلك:NET STOP MSSQLSERVER & NET START MSSQLSERVER

أو فتح "الخدمات.msc" والعثور على "ملقم SQL (MSSQLSERVER)" ثم انقر بزر الماوس الأيمن وحدد "إعادة تشغيل".

هذا سوف "بالتأكيد, بالتأكيد" قتل جميع وصلات إلى جميع قواعد البيانات التي تعمل على هذا المثال.

(أنا أحب هذا أفضل من كثير من نهج التغيير و تغيير تكوين على ملقم/قاعدة البيانات)

هنا كيفية موثوق هذا النوع من شيء في MS SQL Server إدارة Studio 2008 (قد تعمل الإصدارات الأخرى أيضا):

  1. في "مستكشف كائن" الشجرة ، الأيمن فوق جذر ملقم قاعدة البيانات (مع السهم الأخضر) ، ثم انقر فوق مراقبة النشاط.
  2. فتح علامة التبويب العمليات في مراقبة النشاط ، حدد 'قواعد البيانات في القائمة المنسدلة تصفية حسب قاعدة البيانات التي تريدها.
  3. حق انقر على ديسيبل في "مستكشف كائن" وبدء 'المهام -> تأخذ حاليا مهمة.اترك هذا قيد التشغيل في الخلفية أثناء...
  4. إيقاف بأمان كل ما تستطيع.
  5. قتل جميع العمليات المتبقية من عملية التبويب.
  6. جلب DB العودة على الانترنت.
  7. إعادة تسمية ديسيبل.
  8. تحقيق الخدمة على النقطة الجديدة ديسيبل.

خيار العمل بالنسبة لي في هذا السيناريو على النحو التالي:

  1. بدء "فصل" العملية على قاعدة البيانات في السؤال.هذا فيل فتح نافذة (في SQL 2005) عرض الاتصالات النشطة التي تمنع الإجراءات على ديسيبل.
  2. قتل الاتصالات النشطة إلغاء فصل العملية.
  3. قاعدة البيانات يجب أن تكون متاحة الآن على استعادة.

جرب هذا:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

انقر بزر الماوس الأيمن فوق اسم قاعدة البيانات, انقر على الممتلكات للحصول على الممتلكات نافذة فتح علامة التبويب خيارات وتغيير "تقييد الوصول إلى" الملكية متعددة من مستخدم إلى مستخدم واحد.عندما تضغط على زر موافق سيطلب منك أن تغلق كل اتصال مفتوح ، حدد "نعم" يتم تعيين إلى إعادة تسمية قاعدة البيانات....

هذه لم يكن العمل بالنسبة لي (SQL2008 المؤسسة), أنا أيضا لا أرى أي عمليات التشغيل أو المستخدمين المتصلين إلى DB.إعادة تشغيل الملقم (انقر على الحق في Sql Server إدارة Studio ثم اختيار إعادة التشغيل) سمح لي لاستعادة ديسيبل.

أنا باستخدام SQL Server 2008 R2 ، DB تم بالفعل تعيين مستخدم واحد و كان هناك اتصال محظورة أي العمل على قاعدة البيانات.وبالتالي أوصت SQLMenace هو الحل وردت خطأ. هنا هو واحد التي عملت في حالتي.

يمكنني استخدام sp_who للحصول على قائمة من كل عملية في قاعدة البيانات الخاصة بنا.هذا هو أفضل لأنك قد تحتاج إلى مراجعة أي عملية قتل.

declare @proc table(
    SPID bigint,
    Status nvarchar(255),
    Login nvarchar(255),
    HostName nvarchar(255),
    BlkBy nvarchar(255),
    DBName nvarchar(255),
    Command nvarchar(MAX),
    CPUTime bigint,
    DiskIO bigint,
    LastBatch nvarchar(255),
    ProgramName nvarchar(255),
    SPID2 bigint,
    REQUESTID bigint
)

insert into @proc
exec sp_who2

select  *, KillCommand = concat('kill ', SPID, ';')
from    @proc

نتيجة
يمكنك استخدام الأوامر في KillCommand عمود لقتل عملية تريد.

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;

يمكنك استخدام SP_Who الأوامر وقتل كل عملية استخدام قاعدة البيانات الخاصة بك ثم إعادة تسمية قاعدة البيانات الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top