Kapan database SQL Server siap menerima permintaan?

11

Dalam file log galat SQL Server saya menemukan baris berikut:

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'.

Jika saya memeriksa status database XYZ sebelum waktu ini, itu ONLINEmenggunakan pernyataan berikut:

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

... tetapi ketika saya mencoba untuk terhubung ke database ini menggunakan aplikasi C #, itu tidak dapat terhubung ke database.

Kesalahannya adalah:

Gagal masuk untuk pengguna 'asd'.
Alasan: Gagal membuka basis data yang ditentukan secara eksplisit.

Saya mencoba tiga pengguna yang berbeda (pengguna Windows, sa, pengguna SQL Server yang ditentukan untuk aplikasi). Masalahnya terjadi ketika saya menjalankan aplikasi di start up OS, tetapi jika saya memulai secara manual setelah start up, tidak ada kesalahan terjadi, jadi saya pikir semua pengaturan SQL Server dan pengaturan firewall sudah benar.

Saya juga memeriksa sebelum ini bahwa status layanan sedang berjalan.

Apa lagi yang harus saya periksa untuk memastikan bahwa basis data benar-benar online dan siap untuk pertanyaan?

Saya mencari kunci yang memberitahu saya tidak apa-apa untuk query database, daripada menunda untuk sementara waktu (bahkan tidak didasarkan pada alasan yang jelas).

Saya berpikir untuk memindai log kesalahan untuk teks "Memulai database 'XYZ'", tetapi ini berarti saya harus menambahkan pengaturan untuk aplikasi untuk jalur log kesalahan SQL Server. Itu juga berarti membaca file berkali-kali sampai saya menemukan frasa ini.

Ahmed
sumber

Jawaban:

23

Database SQL Server siap menerima permintaan segera:

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

tidak kembali NULL.

Dari dokumentasi untuk DATABASEPROPERTYEX(Transact-SQL) :

Catatan: ONLINEStatus dapat dikembalikan saat database sedang dibuka dan belum dipulihkan. Untuk mengidentifikasi kapan database dapat menerima koneksi, permintaan properti Collation dari DATABASEPROPERTYEX. Basis data dapat menerima koneksi ketika pemeriksaan basis data mengembalikan nilai yang bukan nol. Untuk database Selalu Di, kueri kolom database_stateatau .database_state_descsys.dm_hadr_database_replica_states

Paul White 9
sumber
3

Database SQL Server mulai, tetapi kemudian mereka perlu menganalisis log transaksi untuk menggulung transaksi maju & mundur. Proses ini dapat berlangsung dari milidetik hingga berjam-jam (bahkan berhari-hari!) Dalam hal transaksi yang telah berjalan lama, banyak (pikirkan ribuan) basis data pengguna, atau basis data dengan banyak (pikirkan puluhan ribu) file log virtual.

Jika Anda hanya ingin aplikasi masuk ketika pemulihan selesai dan database sudah siap, minta aplikasi mencoba kembali koneksinya.

Jika Anda ingin aplikasi dapat segera masuk ke SQL Server, tetapi mungkin belum dapat menjalankan kueri apa pun, tetapkan database default-nya ke TempDB, bukan database pengguna. Kemungkinan akan online segera bahkan ketika database pengguna tidak tersedia.

Brent Ozar
sumber