Bu makalede backup alırken Exclusive access could not be obtained because the database is in use. hatasına değinmiş olacağız. Bu hata, tail log backup işlemi sırasında SQL Server’ın veritabanına exclusive lock (özel erişim) alamadığını gösterir. Genellikle başka kullanıcılar veya uygulamalar veritabanını kullanıyorsa ortaya çıkar. Normal log backup işlemlerinde bu sorunla karşılaşılmaz.

SQL Server, tail log backup işlemi için veritabanına exclusive lock almak ister. Eğer başka bir kullanıcı veya uygulama (örneğin SSMS, bir yazılım veya açık bir transaction) veritabanını kullanıyorsa, bu kilit alınamaz ve hata oluşur.
Hata:
Exclusive access could not be obtained because the database is in use.
Bu hata mesajıyla karşılaşmamak için veritabanı üzerindeki tüm bağlantıların kesilmesi gerekmektedir. Active monitör veya sp_who2 veya single user mod komutlarını kullanarak yapılabilir. Ama bu şekilde yapılması ilk gelen oturumun bağlantıyı almasına sebebiyete verecektir dikkat edilmesi gerekmektedir.
ALTER DATABASE [FILEGROUP] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
--BACKUP KOMUTU
ALTER DATABASE [FILEGROUP] SET MULTI_USER;
Not: Yukarıdaki komutu kullanmayıp DBCC OPENTRAN komutuyla aktif bağlantılar kill edilebilir.
Bu bağlantı ile diğer bağlantıların hepsini kapatmış oluyoruz.

Hatayı hala almaya devam ediyorsak ilgili database’in tüm oturumları kapatılır. Oturumların hepsi kapatıldıktan sonra en son oturumumuz single user modunu alır. Dikkat edilmesi gereken bir konu olarak karşımıza çıkmaktadır.
single_user mod’a veritabanını alırken sıkıntı yaşama ihtimaline karşılık veritabanımızı RESTRICTED_USER moduna alınır. Bu mod ile sadece sysadmin,db_owner ve db_creater yetkisi olan kullanıcıların bağlanması sağlanması sağlanmaktadır. Bu moda alındıktan sonra backup işleminde herhangi bir sorun ile karşılaşmayız.
alter database FILEGROUPset restricted_user with rollback immediate
BACKUP LOG [FILEGROUP] TO DISK = N'E:\YEDEK\taillogbackup.trn' WITH NOFORMAT, NOINIT, NAME = N'FILEGROUP-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, NORECOVERY , STATS = 10
RESTRICTED_USER modundan çıkmak için aşağıdaki komut kullanılır.
alter database FILEGROUP set multi_user with rollback immediate
Aşağıdaki komut ile bağlı olan session’lar kill edilmektedir.
select 'kill '+CAST(spid AS varchar(50)) from sys.sysprocesses where dbid=DB_ID('DB_Name')
Backup işlemimiz başarılı bir şekilde gerçekleşmiş oldu. Başka bir makalede görüşmek dileğiyle.
“O’nun varlığının delillerinden biri de, göğün ve yerin O’nun emir ve kanunları sayesinde mevcut halleriyle ayakta durmasıdır. Sonra ölü olarak yatmakta olduğunuz yerden sizi çağırıverdiğinde, işte o anda hepiniz hemen dirilip kabirlerinizden çıkacaksınız” Rûm-25
2 thoughts on “MSSQL Server ‘Exclusive access could not be obtained because the database is in use.’ Solution to the error”