Log Dosyası Olmayan Veritabanını Attach Etme

- Enes Kütük
- 2.764
- İleri
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
Yorum yazabilmek için üye girişi yapmanız gerekiyor!