Merhabalar VeriTabanlarında index yada Non-Cluster index bozulmalarından dolayı aşağıdaki gibi bir hata alabilirsiniz? Bu index bakımlarının zamanında yapılmaması, yanlış index oluşturulması, tabloların datalarının bulunduğu disklerin corrupt olması yada sistem disklerinin crush olması gibi birçok sebebten kaynaklı olabilir. Peki bu hatayı aldık sonra herşey bitti mi? hayır. data kaybında önce veriyi kurtarmak için birçok yöntem vardır.
Örnek olarak aşağıdaki bir hatayı ele alalım.
attempt to fetch logical page (1:438927981) in database 14 failed. It belongs to allocation unit 72060409138315264 not to 72060409197035520
öncelikle tablomuzun yedeğini alalım. ve satır satır row row tüm sağlam veriyi ayrı bir tabloya alalım.
bunun için aşağıdaki scripti çalıştırabilirsiniz?
CODE:
set nocount on;
DECLARE @Counter INT = 1;
DECLARE @LastRecord INT = 10000000; --your table_count
WHILE @Counter < @LastRecord
BEGIN
BEGIN TRY
BEGIN
insert into your_table_new SELECT * FROM your_table WHERE your_column= @Counter --dont forget! create your_table_new before
END
END TRY
BEGIN CATCH
BEGIN
insert into error_code select @Counter,'error_number' --dont forget the create error_code table before.
END
END CATCH
SET @Counter += 1;
END;
-----------------------
tablomuzun yedeği alındı. şimdi tablo üzerinde hertürlü kurtarma senaryolarımızı uygulayabiliriz.
Öncelikle tablodaki cluster mı noncluster indexlerde mi bozluma var tespit etmeye çalışıyoruz. Eğer noncluster ise işimiz kolay tablomuzu kurtarabiliriz. Ancak cluster ise fiziki olarak diskimizde arıza var demek anlamına gelir ve onarma yöntemlerinin diğer adımlarına geçerek onarma yoluna gideceğiz.
DBCC TRACEON(3604)
DBCC PAGE('table_name',1, 438927981,3) WITH TABLERESULTS
DBCC TRACEOFF(3604)
Metadata: IndexId
0 (heap) yada 1 (clustered index) ise backupdan dönmeniz gerekir.
0 yada 1 den farklı bir değerse ise noncluster indexi rebuilt etmeniz yeterlidir.
bunların hiç biri işe yaramadı diyelim. tabloyu onarmayı deneyeceğiz.
DBCC CHECKTABLE(TabloAdi, REPAIR_REBUILD )
GO
bu da çzümolmazsa. Son bir seçenek Veri Kaybını da göze alarak onarma yoluna gideceğiz.
DBCC CHECKTABLE(TabloAdi, REPAIR_ALLOW_DATA_LOSS )
GO
şu sitede index datalarına göz atmak için bakabilirsiniz.
KAYNAK: https://www.mssqltips.com/sqlservertip/1578/using-dbcc-page-to-examine-sql-server-table-and-index-data/
Hiç yorum yok:
Yorum Gönder