Sayfalar

26 Eylül 2020 Cumartesi

attempt to fetch logical page (1:XXXXXX) in database XX failed. It belongs to allocation unit XXX not to XXX failed

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