- #1
Konu Sahibi
: serkankacan
[REHBER] vSRO Veritabanı (Database) SQL Query ile Restore Etme
Bağlantı Çakışmalarını Önleyerek .BAK Yedek Dosyalarını T-SQL ile Geri Yükleme
Bağlantı Çakışmalarını Önleyerek .BAK Yedek Dosyalarını T-SQL ile Geri Yükleme
Merhaba değerli forum sakinleri,
Silkroad Online sunucu kurulumunda veya geri yükleme (rollback) işlemlerinde SQL Server Management Studio (SSMS) arayüzü bazen *"Database is in use"* veya izin hataları verebilir.
Aşağıda paylaşılan optimize edilmiş T-SQL sorgusu; açık kalan tüm modül/kullanıcı bağlantılarını otomatik olarak sonlandırır (
SINGLE_USER), yedeği geri yükler ve ardından veritabanını tekrar genel kullanıma açar (MULTI_USER).Önemli Uyarı' Alıntı:DİKKAT:
- Geri yükleme işlemine başlamadan önce Server modüllerini (GlobalManager, ShardManager, GameServer vb.) ve web sitesi/IIS servislerini durdurmanız önerilir.
- Restore işlemi mevcut veritabanının üzerine yazacağı için, geri döneceğiniz güncel verilerin kaybolmaması adına mevcut durumun yedeğini aldığınızdan emin olun.
1. YÖNTEM: Standart ve Güvenli Restore Sorgusu (Önerilen)
Bu sorgu, veritabanına bağlı olan tüm açık oturumları derhal düşürerek
REPLACE parametresiyle sorunsuz bir geri yükleme sağlar:
SQL:
USE master
GO
-- 1. ADIM: Açık olan tüm oturumları kapat ve DB'yi tek kullanıcı moduna al
ALTER DATABASE [SRO_VT_SHARD]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- 2. ADIM: .BAK dosyasından yedeği geri yükle
RESTORE DATABASE [SRO_VT_SHARD]
FROM DISK = N'C:\SRO_VT_SHARD201901071238.bak'
WITH FILE = 1,
REPLACE,
NOUNLOAD,
STATS = 10
GO
-- 3. ADIM: Veritabanını tekrar çoklu kullanıcı moduna aç
ALTER DATABASE [SRO_VT_SHARD]
SET MULTI_USER
GO
2. YÖNTEM: Farklı Sunucudan Alınan Yedekler İçin (Fiziksel Dosya Yolu Taşıma - MOVE)
Eğer elinizdeki `.bak` dosyası başka bir sunucudan alınmışsa, SQL Server veri dosyalarının (`.mdf` ve `.ldf`) kurulacağı dizinler uyuşmayabilir. Bu durumda `WITH MOVE` parametresi kullanılmalıdır:
Önce Yedek Dosyasının Mantıksal (Logical) İsimlerini Öğrenin:
SQL:
RESTORE FILELISTONLY
FROM DISK = N'C:\SRO_VT_SHARD201901071238.bak'
SRO_VT_SHARD ve SRO_VT_SHARD_log isimleri çıkar.Dosya Konumlarını Belirterek Restore Edin:
SQL:
USE master
GO
ALTER DATABASE [SRO_VT_SHARD]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
RESTORE DATABASE [SRO_VT_SHARD]
FROM DISK = N'C:\SRO_VT_SHARD201901071238.bak'
WITH FILE = 1,
MOVE 'SRO_VT_SHARD' TO 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SRO_VT_SHARD.mdf',
MOVE 'SRO_VT_SHARD_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SRO_VT_SHARD_log.ldf',
REPLACE,
STATS = 10
GO
ALTER DATABASE [SRO_VT_SHARD]
SET MULTI_USER
GO
Parametrelerin Anlamları
STATS = 10: Geri yükleme ilerlemesini alt kısımdaki Messages sekmesinde %10'luk adımlarla gösterir.REPLACE: Aynı isimde mevcut bir veritabanı varsa onay istemeden üzerine yazar.ROLLBACK IMMEDIATE: Veritabanını meşgul eden tüm arka plan işlemlerini beklemeden iptal edip bağlantıyı anında koparır.
Sık Karşılaşılan Hata ve Çözümü:
Eğer restore işlemi sırasında
Exclusive access could not be obtained hatası alırsanız, `ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE` adımını çalıştırdığınızdan emin olun.Takıldığınız yerleri konu altından belirtebilirsiniz. Herkese iyi forumlar!

