Đặt cơ sở dữ liệu từ chế độ SINGLE USER thành MULTI USER


188

Tôi cần trợ giúp với việc thiết lập cơ sở dữ liệu đã được khôi phục trong SINGLE_USERchế độ MULTI_USER. Mỗi khi tôi chạy

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Tôi nhận được lỗi này:

Thay đổi trạng thái hoặc tùy chọn của cơ sở dữ liệu 'BARDABARD' không thể được thực hiện tại thời điểm này.

Cơ sở dữ liệu ở chế độ một người dùng và người dùng hiện đang kết nối với nó.

Nó cần ở SINGLE_USERchế độ không ở chế độ để đặt nó sang chế độ khác, nhưng tôi không thể đặt cơ sở dữ liệu ở bất kỳ chế độ nào khác trong khi nó ở SINGLE_USERchế độ.

Câu trả lời:


113

Người dùng hiện đang được kết nối với nó. Có thể chính cửa sổ SQL Server Management Studio. Hãy thử chọn cơ sở dữ liệu chủ và chạy lại ALTERtruy vấn.


1
Thêm vào đây: Dường như một cửa sổ truy vấn có thể được gắn vào cơ sở dữ liệu mặc dù một số cơ sở dữ liệu khác (như master) được chọn trong trình đơn thả xuống của thanh công cụ Cơ sở dữ liệu có sẵn khi cửa sổ truy vấn được kích hoạt. Nếu nó tiếp tục khiến bạn đau đầu, hãy đóng tất cả các cửa sổ truy vấn khác và chọn một số cơ sở dữ liệu hệ thống vô tội như masterhoặc tempdbtrong trình đơn thả xuống trong một cửa sổ bạn còn lại.
một CVn

Cố gắng ngắt kết nối DB và kết nối lại trong studio quản lý máy chủ microsoft SQL. Sau đó chạy lại lệnh.
Isuru Madusanka

Nhận xét đầu tiên rất hữu ích và thực sự có thể được thêm vào câu trả lời. Tôi không thể chạy truy vấn trước khi tôi đóng tất cả các truy vấn khác.
dùng2216

87

Thông báo lỗi đó thường có nghĩa là có các quá trình khác được kết nối với DB. Hãy thử chạy cái này để xem cái nào được kết nối:

exec sp_who

Điều đó sẽ trả lại cho bạn quá trình và sau đó bạn sẽ có thể chạy:

kill [XXX]

Trong đó [xxx] là spidquá trình bạn đang cố giết.

Sau đó, bạn có thể chạy tuyên bố trên của bạn.

Chúc may mắn.


giết [xxx] để thoát khỏi quá trình, nhưng khi tôi cố gắng chạy lệnh của mình, nó sẽ quay trở lại!
colmde

73

Bạn có thể thêm tùy chọn để khôi phục thay đổi của bạn ngay lập tức.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
Không gì ROLLBACK IMMEDIATElàm chính xác?
dakab

3
@dakab Buộc tất cả các giao dịch đang chờ xử lý phải được khôi phục ngay lập tức kể từ khi bắt đầu ALTER DATABASEgiao dịch của tuyên bố, trái ngược với việc WITH ROLLBACK X SECONDSchờ giao dịch kết thúc trước khi buộc chúng quay lại hoặc chờ vô thời hạn cho đến khi không có giao dịch đang chờ xử lý (mà tôi tin là mặc định nhưng dường như không thể tìm thấy trong tài liệu tại thời điểm này). Nó tương đương với "dừng mọi thứ bạn đang làm ngay bây giờ và làm điều này."
Bacon Bits

39

Máy chủ SQL 2012:

nhấp chuột phải vào DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_uservà nhấp vào OK.

Voila!


5
Không thực sự, đây là những gì tôi nhận được khi dùng thử giải pháp của bạn: / "Cơ sở dữ liệu 'XXX' đã mở và chỉ có thể có một người dùng tại một thời điểm. (Microsoft SQL Server, Error: 924)"
Krzysztof Wolny

1
Ngoài ra được xác nhận trong SQL 2008R2.
codo-sapien

Câu trả lời hay nhất, hoạt động ngay cả trong trường hợp bạn không được phép sử dụng câu lệnh KILL
Marco Marsala

22

Tôi đã có cùng một vấn đề và nó đã được khắc phục bằng các bước sau - tham khảo: http://giladka8.blogspot.com.au/2011/11/database-is-in-single-user-mode-and.html

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 56 --=> kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

13

Điều này làm việc tốt cho tôi.

Bước 1. Nhấp chuột phải vào công cụ cơ sở dữ liệu, nhấp vào màn hình hoạt động và xem quá trình nào đang có kết nối. Giết người dùng cụ thể đó và thực hiện truy vấn ngay lập tức.

Bước 2.

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

và làm mới cơ sở dữ liệu.


9

Tôi thực sự gặp vấn đề khi db của tôi bị khóa khá nhiều bởi các quy trình và điều kiện chạy đua với chúng, vào lúc tôi nhận được một lệnh được làm mới và chúng đã bị khóa lại ... Tôi phải chạy các lệnh sau để quay lại trong SSMS và đưa tôi ngoại tuyến và từ đó tôi đã khôi phục và trở lại trực tuyến tốt, hai truy vấn trong đó:

Lần chạy đầu tiên:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

Sau đó ngay sau (trong cửa sổ truy vấn thứ hai):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

Đã làm những gì tôi cần và sau đó đưa nó trở lại trực tuyến. Cảm ơn tất cả những người đã viết những bài này để tôi kết hợp và giải quyết vấn đề của mình.


7

Có thể tốt nhất là đăng nhập trực tiếp vào máy chủ thay vì sử dụng SQL Management Studio

Đảm bảo rằng tài khoản bạn đăng nhập dưới dạng dbowner cho cơ sở dữ liệu bạn muốn đặt thành MULTI_USER. Đăng nhập như sa (sử dụng xác thực máy chủ SQL) nếu bạn có thể

Nếu cơ sở dữ liệu của bạn được IIS sử dụng, hãy dừng trang web và nhóm ứng dụng sử dụng nó - đây có thể là quá trình được kết nối và chặn bạn cài đặt thành MULTI_USER

USE MASTER
GO

-- see if any process are using *your* database specifically

SELECT * from master.sys.sysprocesses
WHERE spid > 50 -- process spids < 50 are reserved by SQL - we're not interested in these
AND dbid=DB_ID ('YourDbNameHere')

-- if so, kill the process:

KILL n -- where 'n' is the 'spid' of the connected process as identified using query above

-- setting database to read only isn't generally necessary, but may help:

ALTER DATABASE YourDbNameHere
SET READ_ONLY;
GO

-- should work now:

ALTER DATABASE Appswiz SET MULTI_USER WITH ROLLBACK IMMEDIATE

Tham khảo tại đây nếu bạn vẫn gặp sự cố:

http://www.sqlservercentral.com/bloss/pearlknows/2014/04/07/help-im-stuck-in-single-user-mode-and-can-t-get-out/

NHƯ MỘT THAY ĐỔI CUỐI CÙNG - Nếu bạn đã thử mọi thứ ở trên và bạn đang tuyệt vọng, bạn có thể thử dừng phiên bản máy chủ SQL và khởi động lại nó


5

Tôi vừa sửa bằng các bước sau, Nó có thể giúp bạn.

Bước 1

nhấp chuột phải vào cơ sở dữ liệu người dùng


Bước 2

gặp trực tiếp


Bước 3

Thả kết nối và ngoại tuyến


Bước 4

Lên mạng


Bước: 5

Sau đó chạy truy vấn sau.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Thưởng thức...!


2

Mã dưới đây đã hoạt động với tôi khi tôi không biết SPID cụ thể đã được sử dụng để thay đổi thành singleuserchế độ.

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 52 -- kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO

1
  1. Đã thử mọi thứ không hoạt động
  2. Đăng nhập vào máy chủ đó từ xa vì chúng tôi sẽ giết tất cả các kết nối
  3. chạy mã dưới đây nhiều hơn một lần cho đến khi nó hoàn thành và không còn kiểm tra "quá trình tiêu diệt" nữa
  4. kích hoạt lại nó một lần nữa bằng cách sử dụng mã dưới đây

sử dụng master GO khai báo @sql là varchar (20), @spid là int

chọn @spid = min (spid) từ master..sys Processes trong đó dbid = db_id ('DB_NAME') và spid! = @@ spid

while (@spid không phải là null) bắt đầu in 'Quá trình giết chết' + cast (@spid là varchar) + '...' set @sql = 'kill' + cast (@spid as varchar) exec (@sql)

select 
    @spid = min(spid)  
from 
    master..sysprocesses  
where 
    dbid = db_id('DB_NAME') 
    and spid != @@spid end

sau đó mang nó trở lại sống

THAY ĐỔI DBAB SET MULTI_USER; ĐI


1

Điều này làm việc tốt cho tôi

  1. Sao lưu
  2. Tạo cơ sở dữ liệu mới và khôi phục bản sao lưu cho nó
  3. Sau đó, Thuộc tính> Tùy chọn> [Cuộn xuống] Trạng thái> RestrictAccess> chọn Multi_user và nhấp OK
  4. Xóa cơ sở dữ liệu cũ

Hy vọng công việc này cho tất cả Cảm ơn bạn Ramesh Kumar


1

Nếu cách trên không hoạt động, hãy tìm tên đăng nhập của spid và tắt nó trong Bảo mật - Đăng nhập


1

Bạn không thể làm cơ sở dữ liệu đó trong chế độ đơn. Trên hết, nhưng bạn nên biết rằng: khi bạn mở studio quản lý sql, nó không biết bất kỳ người dùng nào trên cơ sở dữ liệu nhưng khi bạn nhấp vào cơ sở dữ liệu, nó sẽ coi bạn là người dùng duy nhất và lệnh của bạn không hoạt động. Chỉ cần làm điều đó: Đóng studio quản lý và mở lại. cửa sổ truy vấn mới mà không chọn bất kỳ cơ sở dữ liệu nào viết tập lệnh.

USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO 

làm f5 wolla mọi thứ ok!


0

Tôi đã giải quyết vấn đề dễ dàng

  1. Nhấp chuột phải vào tên cơ sở dữ liệu đổi tên nó

  2. Sau khi thay đổi, nhấp chuột phải vào tên cơ sở dữ liệu -> thuộc tính -> tùy chọn -> đi đến cuối cuộn RestrictAccess (SINGLE_USER sang MULTI_USER)

  3. Bây giờ một lần nữa bạn có thể đổi tên cơ sở dữ liệu như tên cũ của bạn.


0

Trong hơn 3 lần làm việc với SQL Server 2014, tôi đã chuyển đổi cơ sở dữ liệu sang chế độ Người dùng đơn mà không thay đổi gì. Nó đã xảy ra trong quá trình tạo cơ sở dữ liệu bằng cách nào đó. Tất cả các phương pháp trên không bao giờ hoạt động vì tôi luôn nhận được lỗi rằng cơ sở dữ liệu ở chế độ người dùng và không thể kết nối với.

Điều duy nhất tôi có để làm việc là khởi động lại SQL Server Windows Service. Điều đó cho phép tôi kết nối với cơ sở dữ liệu và thực hiện các thay đổi cần thiết hoặc xóa cơ sở dữ liệu và bắt đầu lại.


0

chỉ cần đi đến thuộc tính cơ sở dữ liệu và thay đổi chế độ SINGLE USER thành MULTI USER

nhập mô tả hình ảnh ở đây

LƯU Ý: nếu nó không hoạt động với bạn thì hãy sao lưu Db và khôi phục lại và thực hiện lại phương pháp trên

* Độc thân = SINGLE_USER

Nhiều = MULTI_USER

Bị hạn chế = RESTRICTED_USER


Điều này khác với truy vấn mà OP đang sử dụng như thế nào?
Squazz

vâng, cả hai sẽ hoạt động giống nhau, điều này giống như thay vì sử dụng truy vấn CREATE Table, chúng tôi đã sử dụng Trình thiết kế bảng GUI của máy chủ sql để tạo Bảng, cả hai BTS sẽ hoạt động như nhau, một là phương thức truy vấn và khác là phương thức GUI. sử dụng những gì bạn thích
Hassan Saeed

OP nói rõ rằng truy vấn ngần ngại dẫn đến lỗi. Như bạn đang nói đây là chính xác giống như sử dụng truy vấn mà bạn không đưa ra câu trả lời nào cả, bạn chỉ đang lộn xộn và thêm vào nhiều câu trả lời sai ở đây
Squazz

0

Sau khi chuyển sang chế độ Một người dùng, khách hàng chỉ có thể thiết lập MỘT kết nối với Máy chủ SQL, hãy nhớ rằng "Object Explorer" chiếm một kết nối (riêng), vì vậy nếu bạn đang thử chạy một câu lệnh Nhiều người dùng trong một truy vấn cửa sổ, bạn sẽ gặp lỗi khi ở chế độ Người dùng đơn, bạn không thể thiết lập kết nối khác.

Đối với tôi đây không phải là vấn đề, trong trường hợp của tôi, có một vài quy trình tự động liên tục (trong vài giây) thiết lập kết nối, vì vậy ngay khi tôi đưa DB vào chế độ Người dùng đơn và tự ngắt kết nối, một trong những các quy trình được thiết lập / chiếm kết nối (trước khi tôi có thể bắt đầu hoạt động Khôi phục). Ngay sau khi tôi giết các kết nối đó - chúng sẽ kết nối lại và khi tôi chạy lệnh Khôi phục, tôi sẽ nhận được lỗi rằng kết nối đã bị chiếm dụng.

Để giải quyết vấn đề này, tôi đã phải viết các killcâu lệnh, thay đổi tất cả các User-Modecâu lệnh và Restorethao tác trong một cửa sổ truy vấn và khi tôi chạy tất cả chúng trong một lần, thì đấy !!! nó đã làm việc.

Hy vọng điều này sẽ giúp những người khác.


0

Tôi đã gặp rắc rối với một DB địa phương.

Tôi đã có thể giải quyết vấn đề này bằng cách dừng máy chủ SQL, sau đó khởi động máy chủ SQL và sau đó sử dụng UI SSMS để thay đổi các thuộc tính DB thành Multi_User.

DB chuyển sang Chế độ "Người dùng đơn" khi tôi đang cố khôi phục bản sao lưu. Tôi đã không tạo bản sao lưu cơ sở dữ liệu đích trước khi thử khôi phục (SQL 2017). điều này sẽ giúp bạn mọi lúc

Dừng SQL Server, Khởi động SQL Server, sau đó chạy các Script trên hoặc sử dụng UI.


0

Tôi đã tìm kiếm giải pháp trong một thời gian và cuối cùng đã đưa ra giải pháp dưới đây,

SSMS nói chung sử dụng một số kết nối đến cơ sở dữ liệu đằng sau hậu trường.

Bạn sẽ cần phải hủy các kết nối này trước khi thay đổi chế độ truy cập. (Tôi đã thực hiện nó với EXEC (@kill); trong mẫu mã bên dưới.)

Sau đó,

Chạy SQL sau để đặt cơ sở dữ liệu ở chế độ MULTI_USER.

USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);

GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

Để chuyển về chế độ Người dùng đơn, bạn có thể sử dụng:

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Điều này nên làm việc. Chúc mừng mã hóa !!

Cảm ơn!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.