SQL SERVER DATABASE STATE

SQL Server’da bir veritabanı çeşitli durumlar (state) içinde olabilir. Bu durumlar, veritabanının işleyişini ve erişilebilirliğini belirler. SQL Server, veritabanlarının state durumlarını yöneterek veri bütünlüğünü, erişilebilirliğini ve performansını kontrol altına almaktadır.

Bu makalede, SQL Server’daki en yaygın veritabanı durumları hakkında detaylı bilgi vermeye çalışacağım: ONLINESUSPECTRESTORINGRECOVERINGRECOVERY PENDINGOFFLINE ve EMERGENCY.

SQL Server veritabanı durumunu kontrol etmek için aşağıdaki scripti kullanabiliriz:

SELECT name, state_desc FROM sys.databases;

ONLINE Durumu

ONLINE durumu, veritabanının tamamen çalışır durumda olduğunu, erişilebilir olduğunu ve normal şekilde kullanıldığını belirtir. Veritabanı bu durumda iken, veri okuma, yazma ve diğer işlemler kullanıcılar ve uygulamalar tarafından yapılabilir.

Özellikleri:

  • Veritabanına tam erişim sağlanabilir.
  • Kullanıcılar sorgularını çalıştırabilir ve veriye erişebilir.
  • Yedekleme ve bakım işlemleri yapılabilir.
  • Veritabanı bakımı veya diğer işlemler gerekmiyor.

Veritabanı ONLINE olduğunda:

  • SQL Server, veritabanının dosyalarını ve içeriğini düzgün şekilde yönetir.
  • Günlük (transaction log) dosyaları düzgün bir şekilde işlenir.
  • Veritabanı performansı normal seviyededir.

SUSPECT Durumu

SUSPECT durumu, veritabanının ciddi bir sorunla karşılaştığını ve erişilemez olduğunu belirtir. SQL Server, veritabanını SUSPECT olarak işaretlerse, veritabanı üzerinde yapılan işlemler, yedeklemeler veya veri kurtarma işlemleri genellikle başarısız olur.

Özellikleri:

  • Veritabanası sağlıklı bir şekilde başlatılamaz.
  • Veritabanında dosya bozulmaları, disk hataları veya sistem çökmesi gibi problemler olabilir.
  • Kullanıcılar veritabanına erişemez.

SUSPECT durumu genellikle şu nedenlerle meydana gelir:

  • Veritabanı dosyalarının kaybolması veya bozulması.
  • Disk alanının tükenmesi veya disk hataları.
  • Bir işlemin ortasında SQL sunucusu çöküyor veya yeniden başlatılıyor, bu da işlem günlük dosyasının bozuk veya erişilemez olmasına neden oluyor.
  • SQL Server bir veritabanını açmaya çalışır ve o veritabanına ait dosya zaten sisteminizde kurulu olan antivirüs yazılımı tarafından açıktır.
  • SQL Server’ın veritabanını düzgün şekilde başlatamaması.

Çözüm Yolları:

  • SQL Server hata günlüklerini kontrol ederek bozuk olan dosyaları tespit edebilir ve onarabilirsiniz.
  • Veritabanının yedeğini geri yüklemek.
  • DBCC CHECKDB komutu ile veritabanını onarmayı deneyebilirsiniz.
-- Veritabanı durumunu sıfırlama
EXEC SP_RESETSTATUS 'Database_Name';

-- Veritabanasını acil durum moduna al
ALTER DATABASE [Database_Name] SET EMERGENCY;

-- Veritabanını tek kullanıcı modunda aç
ALTER DATABASE [Database_Name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

-- Veritabanını hızlı onarma işlemi
DBCC CHECKDB ([Database_Name], REPAIR_FAST);

-- Veri kaybı riskiyle onarma işlemi (Veri kaybına yol açabilir)
DBCC CHECKDB ([Database_Name], REPAIR_ALLOW_DATA_LOSS);

-- Veritabanını çok kullanıcı moduna geri al
ALTER DATABASE [Database_Name] SET MULTI_USER;

SUSPECT modundaki veritabanını “Detach” etmeyin, çünkü bu işlem sonrasında veritabanını tekrar “Attach” edemezsiniz. Bu yüzden ilk olarak, .mdf ve .ldf (log) dosyalarının yedeğini almanız önemlidir. Ardından, aşağıdaki yöntemlerle çözüm denemelerini gerçekleştirebilirsiniz. Her denemeden sonra SQL Server’ı yeniden başlatmayı unutmayın.

RESTORING Durumu

RESTORING durumu, veritabanının geri yükleme (restore) işlemine devam ettiği anlamına gelir. SQL Server, veritabanının yedeklemesinin bir kısmını geri yüklerken veya bir tam geri yükleme işlemi sırasında bu durumda kalır.

Özellikleri:

  • Veritabanası geri yükleme işlemi sırasında kilitli ve erişilemezdir.
  • Bu durum, yedeklemenin henüz tamamlanmadığını ve veritabanının tam olarak kullanılabilir olmadığını gösterir.

RESTORING durumu genellikle şu nedenlerle meydana gelir:

  • Bir yedekten veri geri yükleme işlemi devam ediyor.
  • Yedeklemenin tamamlanabilmesi için birkaç adım daha gerekebilir (örneğin, başka bir yedekten geri yükleme işlemi).

Çözüm Yolları:

  • Geri yükleme işlemi tamamlandığında, veritabanı ONLINE durumuna döner.

Aşağıdaki scripti kullanarak veritabanının eski haline dönmesini sağlayabiliriz.

RESTORE DATABASE [Database_Name] WITH RECOVERY;

RECOVERING Durumu

RECOVERING durumu, SQL Server’ın veritabanını kurtarmaya çalıştığı, ancak işlemin tamamlanmadığı durumu ifade eder. Bu, SQL Server’ın bir veritabanını normal çalışır duruma getirmek için yaptığı işlemler sırasında görülen bir durumdur.

Özellikleri:

  • Veritabanası kurtarma sürecindedir ve kullanıcı erişimi geçici olarak kapalıdır.
  • Veritabanı, yeni işlemler yapabilmek için gereken iç süreçleri (örneğin, log uygulama, veri doğrulama) tamamlıyor.

RECOVERING durumu genellikle şu nedenlerle meydana gelir:

  • SQL Server başlatıldığında, bozulmuş veritabanları üzerinde kurtarma işlemleri yapılır.
  • Veritabanı, bir hata sonrası kendini kurtarmaya çalışıyordur.

Çözüm Yolları:

  • Bu süreç otomatik olarak devam eder, veritabanı birkaç dakika veya saat sürebilir.
  • Veritabanı sonunda ONLINE duruma geçer.

RECOVERY PENDING Durumu

RECOVERY PENDING durumu, SQL Server’ın veritabanasını kurtarmaya başlamış, ancak bir sorun nedeniyle bu işlem tamamlanamıyor ve SQL Server kurtarma işlemi için gerekli kaynaklara erişemiyor demektir.

Özellikleri:

  • Veritabanı ONLINE duruma geçememiştir.
  • SQL Server, veritabanasını kurtarmak için gerekli işlemleri başlatmış ancak bir sorun nedeniyle ilerleyememiştir.

RECOVERY PENDING durumu genellikle şu nedenlerle meydana gelir:

  • Disk alanı problemi veya bozuk disk.
  • Veri dosyalarının eksik veya hasarlı olması.
  • SQL Server’ın gerekli kaynaklara (log dosyası, veri dosyası vb.) erişememesi.

Çözüm Yolları:

1- Veritabanını Emergency Modunda Alarak Onarımı Başlatın

-- Acil durum moduna alınır, veritabanını yalnızca okuma/yazma ve sistem yöneticisi kullanıcıları için erişilebilir hale getirir.
ALTER DATABASE [Database_Name] SET EMERGENCY;
GO
-- Veritabanında yapılacak işlemler için yalnızca bir kullanıcının bağlanmasına izin verilir.
ALTER DATABASE [Database_Name] set single_user
GO
--Veritabanının kontrol edilerek bozuklukların onarılması sağlanır. Veri kaybı riski gözönüne alınmalıdır. 
DBCC CHECKDB ([Database_Name], REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS;
GO 
-- Veritabanı üzerinde yapılacak işlemler için çoklu kullanıcı bağlanmasına izin verilir. 
ALTER DATABASE [Database_Name] set multi_user 
GO

2- Veritabanını Emergency Modunda Alarak, Ana Veritabanını Ayırın ve Yeniden Ekleyin


-- Acil durum moduna alınır, veritabanını yalnızca okuma/yazma ve sistem yöneticisi kullanıcıları için erişilebilir hale getirir.
ALTER DATABASE [Database_Name] SET EMERGENCY;
-- Veritabanı üzerinde yapılacak işlemler için çoklu kullanıcı bağlanmasına izin verilir. 
ALTER DATABASE [Database_Name] SET multi_user
Exec sp_detach_db '[Database_Name]'
Exec sp_attach_db @DBName= '[Database_Name]', @physname =N'mdf_path';

OFFLINE Durumu

OFFLINE durumu, veritabanasının erişilemez olduğu ve SQL Server’ın veritabanasını kapattığı durumu belirtir. Bu, genellikle bakım veya veritabanının geçici olarak kapalı olması gerektiği durumlarda görülür.

Özellikleri:

  • Veritabanası fiziksel olarak kapalıdır ve kullanılamaz.
  • Veritabanı tekrar ONLINE duruma getirilebilir.

OFFLINE durumu genellikle şu nedenlerle meydana gelir:

  • Bir veritabanı yönetim işlemi sırasında (örneğin, bakım, taşıma veya başka bir işlem) veritabanası manuel olarak kapatılır.
  • SQL Server, bir veritabanını tamamen durdurmak ve erişimi engellemek için kapatabilir.

Çözüm Yolları:

  • SQL Server Management Studio (SSMS) kullanarak veritabanını yeniden ONLINE yapabilirsiniz.

EMERGENCY Durumu

EMERGENCY durumu, veritabanasında ciddi bir sorun olduğunda SQL Server’ın veritabanasını acil bir kurtarma moduna alması durumudur. Bu mod, veri kaybını önlemek amacıyla sınırlı erişimle veritabanını çalışır durumda tutmaya çalışır.

Özellikleri:

  • Veritabanası sadece sınırlı erişimle açılır.
  • Kullanıcılar, yalnızca sysadmin rolüne sahip kişiler veritabanına erişebilir.
  • Acil onarım ve kurtarma işlemleri yapılabilir.

EMERGENCY durumu genellikle şu nedenlerle meydana gelir:

  • Veritabanı bozulmuş olabilir veya kritik bir hata oluşmuş olabilir.
  • Sistem üzerinde ciddi veri kaybı riski vardır.

Çözüm Yolları:

  • Veritabanını EMERGENCY durumdan ONLINE duruma geri yüklemeye çalışmak, veritabanını SUPPECT moda döndürür. SQL veritabanı bozuksa, onu bilinen son iyi yedekten geri yüklemeyi deneyin.
  • Ancak, yedekleme güncellenmediyse veya hasar gördüyse, db’yi onarmak için veri tabanında REPAIR_ALLOW_DATA_LOSS seçeneğiyle DBCC CHECKDB’yi çalıştırın:
DBCC CHECKDB ([Database_Name], REPAIR_ALLOW_DATA_LOSS);

Sonuç olarak SQL Server’daki veritabanı durumları, yöneticilerin ve kullanıcıların veritabanının sağlık durumunu ve erişilebilirliğini anlamalarına yardımcı olan önemli araçlardır. Yukarıda bahsedilen durumlar, veritabanının farklı aşamalarını ve karşılaşılan sorunları yansıtır. Bu durumları anlamak, veritabanı yönetimini daha verimli hale getirebilir ve sorunları hızlıca çözmenize olanak tanır.

Kaynak

https://medium.com/kodportal/mssql-recovery-pending-hatas%C4%B1-%C3%A7%C3%B6z%C3%BCm%C3%BC-a72b85f7f561

https://www.stellarinfo.com/blog/fix-sql-database-recovery-pending-state-issue/?srsltid=AfmBOorRDpmLHS4j4ZT7VF2Ljqb82nFb0WhU___9sUqdNurW8rlFPb8W

https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/availability-groups/alwayson-availability-databases-recovery-pending-suspect

https://www.sqlservercentral.com/forums/topic/database-in-recovery-pending-state/page/3

Leave a Reply

Your email address will not be published. Required fields are marked *