Delphi Can
SQL Server veritabanını Suspect & Emergency modundan kurtarmak - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Veri Tabanı (https://www.delphican.com/forumdisplay.php?fid=4)
+--- Forum: MS SQL Server (https://www.delphican.com/forumdisplay.php?fid=103)
+--- Konu Başlığı: SQL Server veritabanını Suspect & Emergency modundan kurtarmak (/showthread.php?tid=1580)



SQL Server veritabanını Suspect & Emergency modundan kurtarmak - Abdullah ILGAZ - 28-11-2017

Merhaba,

Elektrik kesintisi veya donanım arızalarından kaynaklanan bazı problemler ister istemez çalışan sistemlere zarar verebiliyor. Sadece bilgisayar dosyaları ve işletim sistemi dosyaları değil, veritabanı üzerindeki MDF ve LDF dosyaları da nasibini alıyor.

Bu iki dosyanın birbirleriyle uyumsuz olmaları çeşitli uyarılar ve hatalar döndürüyor veya masterdb üzerinde bozulmalar yaşanabiliyor. Harddisk üzerine veri okuma yazma işlemlerini gerçekleştirememesi de bu sebeplerden birisidir. Bu gibi durumlarda veritabanınız SUSPECT moduna geçebiliyor.

Çözüm:

  1. Sql Management Studio'yu çalıştırın ve master db seçiliyken new query'e basın.
  2. Veritabanı üzerinde el ile ayarlar yapmanız için durum bilgisini sıfırlamanız gerekiyor. >>> EXEC sp_resetstatus 'DelphiCan_2017'
  3. Şimdi veritabanı dosyalarını emergency moduna çekelim. >>> alter database DelphiCan_2017 set emergency
  4. Veri bozukluklarını tespit edelim. (bu işlem 15gb boyutundaki db için 5~10dk civarında sürüyor) >>> dbcc checkdb ('DelphiCan_2017')
  5. Veritabanı üzerinde düzenlemeleri aktif edebilmemiz için emergency modundan çıkartıp bir tek bizim erişeceğimiz hale getiriyoruz. >>> ALTER DATABASE DelphiCan_2017 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  6. Şimdi yarım oluşan veya oluşamayan log ve veri dosyalarını kaldırıyoruz. >>> DBCC CHECKDB ('DelphiCan_2017', REPAIR_ALLOW_DATA_LOSS)
  7. Artık normal moda döndürebilir ve kullanıcıların erişimine açabiliriz. >>> ALTER DATABASE DelphiCan_2017 SET MULTI_USER



SQL Server veritabanını Suspect & Emergency modundan kurtarmak - adelphiforumz - 22-12-2017

selamlar
bende sizinkine benzer bir yapıyı script haline getirmiştim
Belki birinin işine yarar
    Declare @veritabani as nvarchar(max),
            @sql as nvarchar(max);
 
    set @veritabani='XXXXX'; --  XXXXX ile belitilen yeri kendi veritabanı adınızı yazınız
 
    set @sql='USE master;
              
              EXEC sp_resetstatus ''' + @veritabani + ''';
              
              alter database ' + @veritabani + ' set Emergency;
              
              USE ' + @veritabani + ';
              dbcc checkdb (''' + @veritabani + ''');
              
              ALTER DATABASE ' + @veritabani + ' SET EMERGENCY;
              
              ALTER DATABASE ' + @veritabani  + ' SET SINGLE_USER WITH ROLLBACK Immediate;
              
              DBCC CHECKDB(' + @veritabani + ', REPAIR_ALLOW_DATA_LOSS);
              
              USE ' + @veritabani + ';
              
              ALTER DATABASE ' + @veritabani + ' SET Multi_User
             '
    exec (@sql);



Cvp: SQL Server veritabanını Suspect & Emergency modundan kurtarmak - Abdullah ILGAZ - 23-12-2017

(22-12-2017, Saat: 15:31)adelphiforumz Adlı Kullanıcıdan Alıntı: selamlar
bende sizinkine benzer bir yapıyı script haline getirmiştim
Belki birinin işine yarar
    Declare @veritabani as nvarchar(max),
            @sql as nvarchar(max);
 
    set @veritabani='XXXXX'; --  XXXXX ile belitilen yeri kendi veritabanı adınızı yazınız
 
    set @sql='USE master;
              
              EXEC sp_resetstatus ''' + @veritabani + ''';
              
              alter database ' + @veritabani + ' set Emergency;
              
              USE ' + @veritabani + ';
              dbcc checkdb (''' + @veritabani + ''');
              
              ALTER DATABASE ' + @veritabani + ' SET EMERGENCY;
              
              ALTER DATABASE ' + @veritabani  + ' SET SINGLE_USER WITH ROLLBACK Immediate;
              
              DBCC CHECKDB(' + @veritabani + ', REPAIR_ALLOW_DATA_LOSS);
              
              USE ' + @veritabani + ';
              
              ALTER DATABASE ' + @veritabani + ' SET Multi_User
             '
    exec (@sql);

Katkılarınız için teşekkür ederim.

Ben yine de acil'e çekme ve checkdb işlemlerinin beklemeli yapılması gerektiğine inanıyorum. Bu kadar riskli bir duruma giren riskli veritabanındaki tüm veriler bizler için çok kıymetli. O yüzden gerek tüm donanımı yoran checkdb fonksiyonu, gerekse yapılan kritik hamleler bu işlemin parça parça yapılmasını öngörmeme neden oluyor. Fonksiyonunuz verdiğim anlatımın kod üzerinde vücut bulmuş hali olmuş, elinize sağlık Shy