Log Dosyası Olmayan Veritabanını Attach Etme

Log Dosyası Olmayan Veritabanını Attach Etme

Transaction Log'u olmayıp açık transaction'ı kalmış bir veritabanını attach etmek için bir yöntem.

Log dosyası olmayan bir veritabanını normalde bu şekilde attach edebiliriz:

USE master 
GO 

EXEC sys.sp_attach_single_file_db @dbname = 'TestDB', 
    @physname = N'E:TestDB.mdf' 
GO

Ancak ilgili veritabanı beklenmedik şekilde kapandıysa ve veritabanında açık bir transaction kaldıysa bu ve benzeri yöntemler aşağıdaki gibi bir hata fırlatır:

"The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure."

Eğer elimizde backup dosyası da yoksa böyle bir durumdan ancak data kaybını göze alarak kurtulabiliriz. O halde gözümüzü karartıp ilk adıma geçelim:

1- Öcelikle attach etmek istediğimiz veritabanının aynısını oluşturalım:

USE [master]
GO

CREATE DATABASE [TestDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TestDB_Repair_file1', 
			FILENAME = N'M:TestDB_Repair_1.mdf',
			SIZE = 20920MB , 
			MAXSIZE = UNLIMITED, 
			FILEGROWTH = 64MB) 
 LOG ON 
( NAME = N'TestDB_Repair_log_file1',
			 FILENAME = N'M:TestDB_Repair_1.ldf',
			 SIZE = 5120MB,
			 MAXSIZE = 2048GB,
			 FILEGROWTH = 32MB)
GO

2- Oluşturduğumuz veritabanını OFFLINE'a çekip mdf dosyasının yolunu attach etmek istediğimiz dosya olarak değiştirelim ve tekrar ONLINE'a alalım:

USE master
GO

ALTER DATABASE [TestDB] SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

USE master
GO

ALTER DATABASE [TestDB] MODIFY FILE(NAME='TestDB_Repair_file1', FILENAME= 'M:testdb.mdf')

ALTER DATABASE [TestDB] MODIFY FILE(NAME='TestDB_Repair_log_file1', FILENAME= 'M:TestDB_Repair_1.ldf')
GO

USE master
GO

ALTER DATABASE [TestDB] SET ONLINE
GO

Son adımda log dosyasının farklı olması sebebiyle veritabanı ONLINE olmadı. Alınan hata:

 Ancak artık veritabanımızı attach ettiğimize göre son adıma geçebiliriz:

3- Veritabanını onarmak için DBCC CHECKDB komutunu çalıştıralım:

USE master
GO

DBCC TRACEON(3604)
GO

ALTER DATABASE [TestDB] SET EMERGENCY
GO

ALTER DATABASE [TestDB] SET SINGLE_USER
GO

DBCC CHECKDB('TestDB', REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS
GO

ALTER DATABASE [TestDB] SET MULTI_USER
GO

 

Son adımda veritabanını SINGLE_USER'a çekip data kaybını göze alarak CHECKDB'yi çalıştırdıktan sonra veritabanımızı tüm kullanıcılar için erişilebilir hale getiriyoruz.

İyi Çalışmalar

Kaynak

Enes Kütük
1991 yılında İstanbul'da doğdum. 2014 Namık Kemal Üniversitesi Bilgisayar Mühendisliği bölümünden mezun oldum. Kariyerime veritabanı yöneticisi olarak devam ediyorum.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git