Cum ucizi toate conexiunile curente la o bază de date SQL Server 2005?

Vreau să redenumesc o bază de date, dar să continuu să aflu eroarea care "nu a putut fi blocată exclusiv" în baza de date, ceea ce înseamnă că există o conexiune activă.

Cum pot ucide toate conexiunile la baza de date, astfel încât să o pot redenumi?

0
fr hi bn

19 răspunsuri

Întotdeauna am folosit:


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 
0
adăugat

Incearca asta:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
0
adăugat

De obicei, întâlnesc această eroare când încerc să restaurez o bază de date, de obicei mă duc în partea de sus a arborelui în Management Studio și dă click dreapta și repornește serverul bazei de date (pentru că e pe o mașină de dezvoltare, acest lucru nu ar fi ideal în producție ). Acest lucru este aproape toate conexiunile bazei de date.

0
adăugat
Multumesc, acest lucru a functionat (comenzile ALTER DATABASE ... SET SINGLE_USER in alte raspunsuri au returnat aceeasi eroare "nu a putut obtine blocarea exclusiva").
adăugat autor Tinister, sursa

In MS SQL Server Management Studio on the object explorer, right click on the database. In the context menu that follows select 'Tasks -> Take Offline'

0
adăugat
Nu puteți face acest lucru dacă există o conexiune activă.
adăugat autor alirobe, sursa

Script pentru a realiza acest lucru, înlocuiți "DB_NAME" cu baza de date pentru a ucide toate conexiunile la:

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
0
adăugat
Acest lucru a funcționat pentru mine, am adăugat și spid <> @@ SPID la instrucțiunea SELECT @sKillConnection astfel încât să nu încerce să-mi omoare conexiunea curentă, mesaj de eroare.
adăugat autor Luis Perez, sursa
mateuscb - singurul mod în care nu va funcționa pe mssql 10.00 este dacă aveți un nume de bază de date care necesită [] și nu îl utilizați. ALTER DATABASE [Baza dvs. de date] SET SINGLE_USER cu ROLLBACK IMMEDIATE funcționează la 10, 10.5, 11 și 12.
adăugat autor Jeremy, sursa
Numai procesele de utilizator pot fi ucise ... încă blocate și nu pot restabili modul multi_user din cauza blocajului.
adăugat autor rainabba, sursa
Salvator de vieti. Ar trebui să fie răspunsul de top.
adăugat autor gls123, sursa

Puteți utiliza comanda SP_Who și ucideți toate procesele care utilizează baza de date și apoi redenumiți baza de date.

0
adăugat

Vedeți Ucideți toate conexiunile active către o bază de date .

Motivul pentru care abordarea Adam a sugerat nu va funcționa este faptul că în timpul în care vă sunt looping peste conexiunile active noi se poate stabili, și veți fi dor de acestea. Articolul pe care l-am asociat folosește următoarea abordare care nu are acest dezavantaj:

-- 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
0
adăugat
Tocmai am rulat acest lucru pe 2008 fără probleme ALTER DATABASE aspnetdb SET SINGLE_USER CU ROLLBACK IMMEDIATE selectați GETDATE() ALTER DATABASE aspnetdb SET MULTI_USER ce aveți în loc de codul comentat?
adăugat autor SQLMenace, sursa
@Wagner dacă baza de date are un '-' în numele de care aveți nevoie să utilizați paranteze în jurul acestuia: ALTER DATABASE [foo-bar] SET SINGLE_USER CU ROLLBACK IMMEDIATE
adăugat autor Ben Challenor, sursa
Asta nu pare să funcționeze pentru SQL Server 2008 ... Iată eroarea pe care am primit-o: Consola: Msg 102, Level 15, State 1, Line 4 Sintaxă incorectă lângă '-'. Msg 319, Level 15, State 1, Line 4 Sintaxă incorectă în apropierea cuvântului cheie "cu". Dacă această instrucțiune este o expresie de masă comună, o clauză xmlnamespaces sau o clauză de context de urmărire a modificării, instrucțiunea anterioară trebuie terminată cu punct și virgulă. Mesaj 102, Nivel 15, Statul 1, Linia 4 Sintaxă incorectă lângă "IMMEDIATE". Comandă: ALTER DATABASE ASMR-wdanda SET SINGLE_USER CU ROLLBACK IMMEDIATE
adăugat autor wdanda, sursa
Lucrat pentru mine cu instanțele SQL Server 2008 și SQL Express.
adăugat autor Tim Murphy, sursa
Bună ziua tuturor, am încercat asta. Acum nu pot să mă conectez la DB pentru a seta multi_user. Utilizarea Squirrel SQL cu driverul microsoft sqljdbc. Te rog ajuta-ma.
adăugat autor RuntimeException, sursa
Vă rugăm să rețineți - NU încercați acest lucru pe serverul SQL găzduit pe Amazon RDS. Nu veți putea reseta DB în modul MULTI_USER. Asigurați-vă că aveți un alt set de acreditări DBA înainte de a încerca acest lucru. Am fixat acest lucru prin revenirea la una din fotografiile anterioare. Ai pierdut niște date. Din fericire, datele nu au fost critice.
adăugat autor RuntimeException, sursa

Eu folosesc sp_who pentru a obține lista tuturor proceselor din baza de date. Acest lucru este mai bine pentru că ați putea dori să examinați ce proces să omorâți.

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

Result
You can use command in KillCommand column to kill the process you want to.

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;
0
adăugat

Utilizarea SQL Management Studio Express:

În arborele Object Explorer trageți în jos sub Management la "Activity Monitor" (dacă nu îl puteți găsi acolo, faceți clic dreapta pe serverul de bază de date și selectați "Activity Monitor"). Dacă deschideți Monitorul de activitate, puteți vedea toate informațiile despre proces. Ar trebui să găsiți încuietori pentru baza de date care vă interesează și să ucizi aceste încuietori, ceea ce va ucide și conexiunea.

Ar trebui să puteți redenumi după aceea.

0
adăugat
Aparent trebuie să ucizi procesul de blocare unul câte unul, dar este o metodă simplă care nu necesită autentificare locală sau aducerea serverului de baze de date complet în jos.
adăugat autor Álvaro González, sursa
Am găsit un "Activity Montior" dacă faceți clic dreapta pe SERVER, nu pe DB. Apoi, puteți selecta fila "Procese" și filtrați după baza de date.
adăugat autor alirobe, sursa
Nu văd acest articol "Activity Monitor" în Management ... Din nou, poate pentru că folosesc SQL 2008?
adăugat autor wdanda, sursa

Acestea nu au funcționat pentru mine (SQL2008 Enterprise), de asemenea, nu am putut vedea procese sau utilizatori conectați la DB. Repornirea serverului (faceți clic dreapta pe Serverul Sql din Management Studio și selectați Restart) mi-a permis să restaurez DB.

0
adăugat

Another "kill it with fire" approach is to just restart the MSSQLSERVER service. I like to do stuff from the commandline. Pasting this exactly into CMD will do it: NET STOP MSSQLSERVER & NET START MSSQLSERVER

Sau deschideți "services.msc" și găsiți "SQL Server (MSSQLSERVER)" și faceți clic dreapta, selectați "reporniți".

Acest lucru va "sigur, sigur" va ucide TOATE conexiunile la TOATE bazele de date care rulează pe acea instanță.

(Îmi place mai mult decât multe abordări care schimbă și schimba configurația de pe server/baza de date)

0
adăugat
nu se recomandă mai ales în mediile LIVE :)
adăugat autor Mohammed ElSayed, sursa
Aș merge pentru orice care ar trebui să afecteze DOAR obiectivul meu DB. abordarea dvs. de ucidere a tuturor DB-urilor pe serverul țintă nu este atât de inteligentă. dar pentru a fi sincer, în medii de pregătire, poate cel mai simplu mod așa cum ați spus.
adăugat autor Mohammed ElSayed, sursa
Ce vrei să spui "nu este recomandat"? Dacă nu sunteți preocupat de conexiunile cu serverul respectiv (de exemplu: medii de depanare sau stadializare, de exemplu - sau un server de producție cu temporizare temporară), acest lucru poate fi cel mai simplu mod. Pentru producție - nu doriți să fiți confortabil cu configurația dacă puteți reporni serviciul. Ce ai face?
adăugat autor aikeru, sursa
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

utilizați baza de date "master" și executați această interogare, aceasta va ucide toate conexiunile active din baza de date.

0
adăugat
Functioneaza cu adevarat :) As recomanda, insa, sa pastrez partea de executie a acestui script comentat si sa trimit un @query in loc de tipar, doar pentru a fi sigur ca nu rulati acest lucru pe un server de productie din greseala.
adăugat autor marcello miorelli, sursa

Omoară-o și ucide-o cu foc:

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
0
adăugat
Am păstrat acest cod într-un scenariu. Util!
adăugat autor Josep Alacid, sursa

Iată cum puteți face acest lucru în mod credibil în MS SQL Server Management Studio 2008 (poate funcționa și pentru alte versiuni):

  1. In the Object Explorer Tree, right click the root database server (with the green arrow), then click activity monitor.
  2. Open the processes tab in the activity monitor, select the 'databases' drop down menu, and filter by the database you want.
  3. Right click the DB in Object Explorer and start a 'Tasks -> Take Offline' task. Leave this running in the background while you...
  4. Safely shut down whatever you can.
  5. Kill all remaining processes from the process tab.
  6. Bring the DB back online.
  7. Rename the DB.
  8. Bring your service back online and point it to the new DB.
0
adăugat

Faceți clic dreapta pe numele bazei de date, faceți clic pe Proprietăți pentru a obține fereastra de proprietăți, Deschideți fila Opțiuni și modificați proprietatea "Restricționați accesul" de la Multi User la un singur utilizator. Când apăsați pe butonul OK, vă va cere să închideți toate conexiunile deschise, selectați "Da" și veți fi redenumiți baza de date ....

0
adăugat

Ia offline durează un timp și, uneori, am ceva probleme cu asta ..

Cel mai solid mod în opinia mea:

Detach Right click DB -> Tasks -> Detach... check "Drop Connections" Ok

Reattach Right click Databases -> Attach.. Add... -> select your database, and change the Attach As column to your desired database name. Ok

0
adăugat
Funcționează ca un farmec! Calea ușoară este calea bună. Mulțumiri.
adăugat autor Tug Strongly, sursa
Imi place. Cel mai rapid mod de a face acest lucru din GUI pentru sigur.
adăugat autor Whelkaholism, sursa

Opțiunea care lucrează pentru mine în acest scenariu este următoarea:

  1. Porniți operația "Detach" din baza de date în cauză. Aceasta va deschide o fereastră (în SQL 2005) care afișează conexiunile active care împiedică acțiunile din DB.
  2. Ucideți conexiunile active, anulați operația de detașare.
  3. Baza de date ar trebui să fie acum disponibilă pentru restaurarea.
0
adăugat
Poate nu este cel mai bun mod, dar funcționează, așa că sunt de acord cu tine!
adăugat autor RaM, sursa
În SQL 2008 Management Studio, din anumite motive nu mai puteți accesa conexiunea activă din ecranul "Detașare". Funcționează minunat în 2005 și așa am făcut-o mereu până am făcut upgrade-ul la 2008 și acum tot ce primești este un mesaj stupid care îți spune să închizi conexiunea, dar nu te lasă să deschizi detaliile conexiunii pentru a ucide fiecare conexiune .
adăugat autor Jim, sursa

Folosesc SQL Server 2008 R2, DB-ul meu a fost deja setat pentru un singur utilizator și a existat o conexiune care a restricționat orice acțiune în baza de date. Astfel, soluția recomandată SQLMenace a răspuns cu eroare. Iată unul care a lucrat în cazul meu .

0
adăugat
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE
0
adăugat