Thời gian chờ cực cao khi lấy cơ sở dữ liệu SQL Server ngoại tuyến


278

Tôi đang cố gắng thực hiện một số bảo trì ngoại tuyến (khôi phục cơ sở dữ liệu dev từ bản sao lưu trực tiếp) trên cơ sở dữ liệu dev của tôi, nhưng lệnh 'Take Offline' thông qua SQL Server Management Studio đang thực hiện rất chậm - theo thứ tự 30 phút cộng với bây giờ. Tôi chỉ sắp hết thời gian và dường như tôi không thể tìm thấy bất kỳ tài liệu tham khảo trực tuyến nào về những gì có thể gây ra vấn đề tốc độ, hoặc cách khắc phục nó.

Một số trang web đã đề xuất rằng các kết nối mở tới cơ sở dữ liệu gây ra sự chậm chạp này, nhưng ứng dụng duy nhất sử dụng cơ sở dữ liệu này là phiên bản IIS của máy dev của tôi và dịch vụ bị dừng - không còn kết nối mở nào nữa.

Điều gì có thể gây ra sự chậm lại này, và tôi có thể làm gì để tăng tốc nó?

Câu trả lời:


408

Sau một số tìm kiếm bổ sung (cụm từ tìm kiếm mới lấy cảm hứng từ câu trả lời của gbn và nhận xét của u07ch về câu trả lời của KMike) Tôi đã tìm thấy điều này, đã hoàn thành thành công trong 2 giây:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Cập nhật)

Khi điều này vẫn không thành công với lỗi sau, bạn có thể sửa nó theo cảm hứng từ bài đăng trên blog này :

THAY ĐỔI CƠ SỞ thất bại vì không thể đặt khóa trên cơ sở dữ liệu 'dbname' Hãy thử lại sau.

bạn có thể chạy lệnh sau để tìm ra ai đang giữ khóa trên cơ sở dữ liệu của bạn:

EXEC sp_who2

Và sử dụng bất cứ thứ gì SPIDbạn tìm thấy trong lệnh sau:

KILL <SPID>

Sau đó chạy lại ALTER DATABASElệnh. Nó sẽ hoạt động.


35
Nếu điều này không hoạt động (không thể đặt khóa), hãy thử giải pháp trong stackoverflow.com/questions/4673065 .
nalply

3
Nếu quá trình Take DB Offline vẫn đang chạy, đối với các máy dev, bạn có thể tắt nó từ Trình quản lý tác vụ và chạy lệnh trên.
Đầu Null

1
Nếu bạn chạy lệnh KILL và nhận được thông báo "Không thể sử dụng KILL để giết tiến trình của riêng bạn.", Hãy đảm bảo bạn đang sử dụng cơ sở dữ liệu chính để chạy lệnh
Jarrod

129

Rất có thể có một kết nối đến DB từ một nơi nào đó (một ví dụ hiếm gặp: cập nhật thống kê không đồng bộ )

Để tìm kết nối, sử dụng sys.sys Processes

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

Để buộc ngắt kết nối, sử dụng ROLLBACK NGAY LẬP TỨC

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

7
+1 vì truy vấn quy trình cho phép bạn biết những gì được kết nối với cơ sở dữ liệu này. trong trường hợp của tôi, đó là một nhân viên lừa đảo với SSMS mở :)
MikeMurko

3
Trong trường hợp của tôi, tôi là kẻ bất hảo với cửa sổ phân tích truy vấn mở
dellyjm

1
Trong trường hợp của tôi các nhà phát triển đã có một trang web sản xuất chính cho một trỏ ngân hàng rất nổi tiếng tại một cơ sở dữ liệu lebelled OLD
ZZ9

3
Nếu nó nói ALTER DATABASE failed because a lock could not be placed on databaselệnh KILL <SPID>sẽ giúp
Muflix

28

Bạn có cửa sổ SQL Server Management Studio mở nào được kết nối với DB này không?

Đặt nó trong chế độ người dùng duy nhất, và sau đó thử lại.


2
THAY ĐỔI CƠ SỞ <DBNAME> THIẾT LẬP SINGLE_USER VỚI Rollback ngay lập tức
u07ch

KMike - kết nối duy nhất tôi có được mở cho cơ sở dữ liệu Master, không phải cơ sở dữ liệu tôi đang cố gắng ngoại tuyến.
Erik Forbes

17

Trong trường hợp của tôi, sau khi chờ đợi quá nhiều để nó kết thúc, tôi không còn kiên nhẫn và chỉ đơn giản là đóng cửa phòng quản lý. Trước khi thoát, nó hiển thị thông báo thành công, db đang ngoại tuyến. Các tập tin đã có sẵn để đổi tên.


7

thực hiện thủ tục lưu trữ sp_who2

Điều này sẽ cho phép bạn xem nếu có bất kỳ khóa chặn .. giết họ nên sửa nó.


5

Trong SSMS: nhấp chuột phải vào biểu tượng máy chủ SQL, Trình giám sát hoạt động. Quy trình mở. Tìm kết nối được xử lý. Nhấp chuột phải vào quá trình, Kill.


4

bất cứ khi nào bạn gặp phải loại điều này, bạn nên luôn nghĩ về nhật ký giao dịch của mình. Việc thay đổi thống kê db với rollback ngay lập tức cho thấy đây là trường hợp. Hãy xem điều này: http://msdn.microsoft.com/en-us/l Library / ms189085.aspx

Xem xét các điểm kiểm tra, v.v. Bạn cần quyết định xem các giao dịch trong nhật ký của bạn có đáng lưu hay không và sau đó chọn chế độ để chạy db của bạn theo đó. Thực sự không có lý do gì để bạn phải chờ đợi nhưng cũng không có lý do gì để bạn mất dữ liệu - bạn có thể có cả hai.


2
Lời khuyên hiền - cảm ơn bạn - nhưng trong trường hợp này dữ liệu có thể sử dụng được vì đây là cơ sở dữ liệu phát triển đang được khôi phục.
Erik Forbes

3

Đóng phiên bản SSMS (Trình quản lý dịch vụ SQL) từ đó yêu cầu được đưa ra đã giải quyết vấn đề cho tôi .....


3

Trong trường hợp của tôi, tôi đã xem xét một số bảng trong DB trước khi thực hiện hành động này. Tài khoản người dùng của tôi đang giữ một kết nối hoạt động với DB này trong SSMS. Khi tôi ngắt kết nối với máy chủ trong SSMS (để hộp thoại 'Lấy cơ sở dữ liệu ngoại tuyến' mở), thao tác đã thành công.


Giống tôi. Sau đó, tôi đã kết nối lại, thay đổi cơ sở dữ liệu hoạt động thành chủ và chạy lệnh sau: ALTER DATABASE XXX SET OFFLINE VỚI ROLLBACK IMMEDIATE
cskwg

2

Để giải quyết vấn đề này, tôi đã dừng trang web được kết nối với db trong IIS và ngay lập tức bảng điều khiển 'đóng băng' ngoại tuyến 'trở nên không đóng băng.


2

Tôi đã thử tất cả các đề xuất dưới đây và không có gì làm việc.

  1. EXEC sp_who
  2. Giết <SPID>

  3. THAY ĐỔI CÀI ĐẶT THIẾT LẬP SINGLE_USER VỚI Rollback ngay lập tức

    THAY ĐỔI THIẾT LẬP TUYỆT VỜI VỚI ROLLBACK NGAY LẬP TỨC

    Kết quả: Cả hai lệnh trên cũng bị kẹt.

4 . Nhấp chuột phải vào cơ sở dữ liệu -> Thuộc tính -> Tùy chọn Đặt chỉ đọc cơ sở dữ liệu thành True Nhấp vào 'Có' trong hộp thoại cảnh báo SQL Server sẽ đóng tất cả các kết nối với cơ sở dữ liệu.

Kết quả: Cửa sổ bị kẹt khi thực hiện.

Như một phương sách cuối cùng, tôi đã khởi động lại dịch vụ máy chủ SQL từ trình quản lý cấu hình và sau đó chạy ALTER DATABASE SET OFFLINE VỚI ROLLBACK NGAY LẬP TỨC. Nó làm việc như một say mê


1

Ngoài ra, đóng bất kỳ cửa sổ truy vấn nào bạn có thể đã mở được kết nối với cơ sở dữ liệu được đề cập;)


1

Trong SSMS, đặt cơ sở dữ liệu thành chỉ đọc rồi quay lại. Các kết nối sẽ được đóng lại, giải phóng các ổ khóa.

Trong trường hợp của tôi, có một trang web có kết nối mở tới cơ sở dữ liệu. Phương pháp này đã đủ dễ dàng:

  1. Nhấp chuột phải vào cơ sở dữ liệu -> Thuộc tính -> Tùy chọn
  2. Đặt Database Read-Onlythành Đúng
  3. Nhấp vào 'Có' trong hộp thoại cảnh báo SQL Server sẽ đóng tất cả các kết nối với cơ sở dữ liệu.
  4. Mở lại Tùy chọn và tắt chỉ đọc lại
  5. Bây giờ hãy thử đổi tên cơ sở dữ liệu hoặc lấy nó ngoại tuyến.

0

Đối với tôi, tôi chỉ cần vào Trình theo dõi hoạt động công việc và dừng hai việc đang xử lý. Sau đó, nó đã ngoại tuyến ngay lập tức. Trong trường hợp của tôi mặc dù tôi biết 2 quá trình đó là gì và việc dừng chúng lại là ổn.


0

Trong trường hợp của tôi, cơ sở dữ liệu có liên quan đến bản cài đặt Sharepoint cũ. Dừng và vô hiệu hóa các dịch vụ liên quan trong trình quản lý máy chủ "gỡ bỏ" hành động ngoại tuyến, đã chạy trong 40 phút và hoàn thành ngay lập tức.

Bạn có thể muốn kiểm tra nếu có bất kỳ dịch vụ nào hiện đang sử dụng cơ sở dữ liệu.


1
Chạy sp_who2để xem những quy trình đang sử dụng cơ sở dữ liệu và sử dụng kill <PID>để ngăn chặn chúng.
Eric Kigathi

0

Lần tới, từ hộp thoại Take Offline, hãy nhớ chọn hộp kiểm 'Thả tất cả các kết nối hoạt động'. Tôi cũng đã sử dụng SQL_EXPRESS trên máy cục bộ không có kết nối, nhưng sự chậm chạp này đã xảy ra với tôi trừ khi tôi chọn hộp kiểm đó.


-1

Trong trường hợp của tôi, tôi đã dừng máy chủ Tomcat. sau đó ngay lập tức DB đi offline.

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.