Khi nào cơ sở dữ liệu SQL Server sẵn sàng chấp nhận truy vấn?


11

Trong tệp nhật ký lỗi Máy chủ SQL, tôi tìm thấy các dòng sau:

2018-02-22 14:10:58.95 spid17s     Starting up database 'msdb'.
2018-02-22 14:10:58.95 spid16s     Starting up database 'ReportServer'.
2018-02-22 14:10:58.95 spid18s     Starting up database 'ReportServerTempDB'.
2018-02-22 14:10:58.95 spid19s     Starting up database 'XYZ'.

Nếu tôi kiểm tra trạng thái của cơ sở dữ liệu XYZ trước thời điểm này, thì nó đang ONLINEsử dụng câu lệnh sau:

SELECT state_desc FROM sys.databases WHERE name='XYZ'

... nhưng khi tôi cố gắng kết nối với cơ sở dữ liệu này bằng ứng dụng C #, nó không thể kết nối với cơ sở dữ liệu.

Lỗi là:

Đăng nhập thất bại cho người dùng 'asd'.
Lý do: Không thể mở cơ sở dữ liệu được chỉ định rõ ràng.

Tôi đã thử ba người dùng khác nhau (người dùng Windows, sa, người dùng SQL Server được xác định cho ứng dụng). Sự cố xảy ra khi tôi chạy ứng dụng khi khởi động HĐH, nhưng nếu tôi khởi động thủ công sau khi khởi động thì không có lỗi xảy ra, vì vậy tôi nghĩ rằng tất cả các cài đặt SQL Server và cài đặt tường lửa đều đúng.

Tôi cũng đã kiểm tra trước rằng trạng thái dịch vụ đang chạy.

Những gì khác tôi nên kiểm tra để đảm bảo cơ sở dữ liệu thực sự trực tuyến và sẵn sàng cho các truy vấn?

Tôi đang tìm một khóa cho tôi biết rằng bạn có thể truy vấn cơ sở dữ liệu, thay vì trì hoãn một thời gian (thậm chí không dựa trên một lý do rõ ràng).

Tôi đã nghĩ đến việc quét nhật ký lỗi cho văn bản "Khởi động cơ sở dữ liệu 'XYZ'", nhưng điều này có nghĩa là tôi phải thêm một cài đặt cho ứng dụng cho đường dẫn của nhật ký lỗi SQL Server. Nó cũng có nghĩa là đọc tệp nhiều lần cho đến khi tôi tìm thấy cụm từ này.

Câu trả lời:


23

Cơ sở dữ liệu SQL Server sẵn sàng chấp nhận các truy vấn ngay khi:

SELECT DATABASEPROPERTYEX(N'database name', 'Collation')

không trở về NULL.

Từ tài liệu cho DATABASEPROPERTYEX(Transact-SQL) :

Lưu ý: ONLINETrạng thái có thể được trả về trong khi cơ sở dữ liệu đang được mở và chưa được khôi phục. Để xác định khi nào cơ sở dữ liệu có thể chấp nhận kết nối, hãy truy vấn thuộc tính Collation của DATABASEPROPERTYEX. Cơ sở dữ liệu có thể chấp nhận các kết nối khi đối chiếu cơ sở dữ liệu trả về giá trị khác null. Đối với cơ sở dữ liệu Luôn Trên, truy vấn database_statehoặc database_state_desccột của sys.dm_hadr_database_replica_states.


3

Cơ sở dữ liệu SQL Server khởi động, nhưng sau đó họ cần phân tích nhật ký giao dịch để chuyển giao dịch tiến & lùi. Quá trình này có thể mất từ ​​mili giây đến hàng giờ (thậm chí vài ngày!) Trong trường hợp giao dịch dài hạn, nhiều (hàng ngàn) cơ sở dữ liệu người dùng hoặc cơ sở dữ liệu có rất nhiều (hàng chục nghìn) tệp nhật ký ảo.

Nếu bạn chỉ muốn ứng dụng vào trong khi quá trình khôi phục hoàn tất và cơ sở dữ liệu đã sẵn sàng, hãy để ứng dụng thử lại kết nối của nó.

Nếu bạn muốn ứng dụng có thể truy cập SQL Server ngay lập tức, nhưng có thể chưa thể chạy bất kỳ truy vấn nào, hãy đặt cơ sở dữ liệu mặc định của nó thành TempDB thay vì cơ sở dữ liệu người dùng. Nó có thể sẽ trực tuyến ngay cả khi cơ sở dữ liệu người dùng không có sẵ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.