Sayfalar

mssql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
mssql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

6 Kasım 2020 Cuma

How to move SQL Server database files (LDF and MDF) to another location (path)

DatabaseName: CND    (example)

NewPathNameData: C:\DATA1\

NewPathNameLog: C:\LOG\


checking to Database PathLocation:

SELECT name, physical_name AS CurrentLocation, state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'CND');

 

use master

go

ALTER DATABASE CND

    MODIFY FILE ( NAME = CND,   

                  FILENAME = 'C:\DATA1\CND.mdf');  

GO

 

ALTER DATABASE CND

    MODIFY FILE ( NAME = CND_log,   

                  FILENAME = 'C:\LOG\CND_Log.ldf');  

GO


 

ALTER DATABASE CND SET OFFLINE;  

GO


move data (*.mdf and *.ldf ) to new location (as phisical) "like copy and past to new location etc."


ALTER DATABASE CND SET ONLINE;  

GO


checking to New Database PathLocation: 

SELECT name, physical_name AS NewLocation, state_desc AS OnlineStatus

FROM sys.master_files  

WHERE database_id = DB_ID(N'CND')  

GO

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/

14 Şubat 2019 Perşembe

AlwaysOndan çıkarılmış database'i second (ikinci) note da AlwayOn'a alma

Merhabalar,

Eğer Database'iniz daha önceden ikinci yada diğer notlarda ise çıkartmışsanız yada bir şekilde AlwaysOn listenerdan cıkarmışsanız. Aşağıdaki adımlarla ve benim gibi görsel değilde komutlarla çalışmaya alışmışsanız hızlı bir şekilde alwayson'a alabilirsiniz..


1Adım:
A) eğer Dblerinizin sürekli full ve log backupları alınıyorsa aşağıdaki komutla backuplarınız alındığı pathleri çıkarın..

SELECT          physical_device_name,
                backup_start_date,
                backup_finish_date,
                backup_size/1024.0 AS BackupSizeKB
FROM msdb.dbo.backupset b
JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
WHERE database_name = 'DATABASE_NAME'
ORDER BY backup_finish_date DESC
 
 Çıkan sonuc ".bak" ile biten dosya pathlerinden itibaren full backuptan sıra ile yukarıya restore edilecek(şuanki zamana kadar alınan backupları).
  
B)Eğer hazırda backupınız yoksa bu komutlarla full ve log backuplar alınır..(ilk note da çalıştırılacak.)
BACKUP DATABASE DATABASE_NAME 
   FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME.bak'
WITH COPY_ONLY;
GO

BACKUP LOG DATABASE_NAME 
   FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME.trn'
WITH COPY_ONLY;
GO

2Adım: ikinci notda çalıştırılacak restore işlemleri(elimizde backuplar var şimdi eşitlemeye geldi)
RESTORE DATABASE DATABASE_NAME 
   FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME.bak' 
  WITH NORECOVERY, REPLACE, 
   MOVE 'vdk' TO 'W:\DATA\DATABASE_NAME.mdf',
   MOVE 'vdk_log' TO 'X:\LOG\DATABASE_NAME_log.ldf';
GO

RESTORE LOG DATABASE_NAME 
   FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME4.trn' WITH NORECOVERY;
GO
   
RESTORE LOG DATABASE_NAME 
   FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME3.trn' WITH NORECOVERY;
GO
RESTORE LOG DATABASE_NAME 
   FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME2.trn' WITH NORECOVERY;
GO
RESTORE LOG DATABASE_NAME 
   FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME1.trn' WITH NORECOVERY;
GO


3ADIM:Eşitleme tamamlandı şimdi sıra lsn'eri eşitlemek kaldı..
--->>eğer daha önce hiç gruba alınmadısya alttaki komuıtla gruba alabilirsin.
  ALTER AVAILABILITY GROUP [AO_GROUPNAME] ADD DATABASE [DATABASE_NAME]
go

--gruba alınmışsa zaten aşagıdaki komutla eşitlemeyi başlatabilir ve AlwaysOna alabilirsin.
ALTER DATABASE [vdk] SET HADR AVAILABILITY GROUP = AO_GROUPNAME;
go
 
4.ADIM:Eğer backupı alınmış db içeriğine bakmak istersen  aşağıdaki komutla detaylarını listeleyebilirsin.
RESTORE FILELISTONLY FROM DISK = '\\10.10.10.12\backupfile\DATABASE_NAME1.bak'


MSSQL,SQL,SQL SERVER, SQL BACKUP, ALWAYSON

17 Mart 2017 Cuma

BACKUP detected corruption in the database log hatası

Veri Tabanlarınızdan birinde eğer log corruption olmuşsa aşağıdaki yöntemi uygulayabilirsiniz.

 hata

BACKUP detected corruption in the database log. Check the errorlog for more information.
 Msg: 3049, Level: 16, State: 1, Procedure: , Line: 1

>[Error] Script lines: 1-2 --------------------------
 BACKUP DATABASE is terminating abnormally.
 Msg: 3013, Level: 16, State: 1, Procedure: , Line: 1



çözüm
  trun back-up' ı alıyoruz CONTINUE_AFTER_ERROR option'u ile

BACKUP LOG [MyDb]
 TO  DISK = N'C:\\MyDb.trn'
 WITH NOFORMAT, NOINIT, NAME = N'MyDb', SKIP, NOREWIND,
 NOUNLOAD, COMPRESSION, STATS = 10, NO_CHECKSUM, CONTINUE_AFTER_ERROR
 GO



 sonra full back-up alarak devam edebilirsiniz her ihtimale karşı elimizde bulunsun

BACKUP DATABASE [MyDb] TO  DISK = N'C:\\MyDb.bak' WITH NOFORMAT, NOINIT,  NAME = N'VDK-DRIVE', SKIP, REWIND, NOUNLOAD,  STATS = 10
 



kolay gelsin..