كيف يمكنك قتل جميع الاتصالات الحالية إلى قاعدة بيانات SQL Server 2005?
-
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 (قد تعمل الإصدارات الأخرى أيضا):
- في "مستكشف كائن" الشجرة ، الأيمن فوق جذر ملقم قاعدة البيانات (مع السهم الأخضر) ، ثم انقر فوق مراقبة النشاط.
- فتح علامة التبويب العمليات في مراقبة النشاط ، حدد 'قواعد البيانات في القائمة المنسدلة تصفية حسب قاعدة البيانات التي تريدها.
- حق انقر على ديسيبل في "مستكشف كائن" وبدء 'المهام -> تأخذ حاليا مهمة.اترك هذا قيد التشغيل في الخلفية أثناء...
- إيقاف بأمان كل ما تستطيع.
- قتل جميع العمليات المتبقية من عملية التبويب.
- جلب DB العودة على الانترنت.
- إعادة تسمية ديسيبل.
- تحقيق الخدمة على النقطة الجديدة ديسيبل.
خيار العمل بالنسبة لي في هذا السيناريو على النحو التالي:
- بدء "فصل" العملية على قاعدة البيانات في السؤال.هذا فيل فتح نافذة (في SQL 2005) عرض الاتصالات النشطة التي تمنع الإجراءات على ديسيبل.
- قتل الاتصالات النشطة إلغاء فصل العملية.
- قاعدة البيانات يجب أن تكون متاحة الآن على استعادة.
جرب هذا:
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 الأوامر وقتل كل عملية استخدام قاعدة البيانات الخاصة بك ثم إعادة تسمية قاعدة البيانات الخاصة بك.