Yanıtlar:
Veritabanı dosyalarını taşımak için SQL Server hizmetini durdurmanız gerekmez, ancak belirli veritabanını çevrimdışına almanız gerekir. Bunun nedeni, erişilirken dosyaları taşıyamazsınız ve veritabanını çevrimdışı duruma getirmek, dosyaların SQL Server uygulaması tarafından kullanılmasını durdurur.
Onları taşıma süreci oldukça basittir. Ayırma / Ekleme zaten açıklandı, ancak neredeyse bu kadar karmaşık değil.
Dosya konumlarını bir ALTER DATABASE
komutla değiştirin:
USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location
Unutmayın, eski komutu bu komutta bildirmeniz gerekmez. Bu yolun değiştirilmesi hemen etkili olmaz, ancak veritabanının bir sonraki başlatılışında kullanılır.
Veritabanını çevrimdışı olarak ayarla
( WITH ROLLBACK IMMEDIATE
Herkesi kovmak ve şu anda açık olan tüm işlemleri geri almak için kullanıyorum)
ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;
Dosyaları yeni konuma taşıyın / kopyalayın
Sadece favori yönteminizi kullanarak dosyaları kopyalayın ('e Sürükle, XCopy, Kopyalama Öğesi, Robocopy)
Veritabanını çevrimiçi duruma getirin
ALTER DATABASE foo SET ONLINE;
Bunu burada daha ayrıntılı olarak tanımlanmış olarak görebilirsiniz .
MODIFY FILE
değişebilir. Önce MODIFY FILE komutunu çalıştırırsanız, komutun başarıyla çalıştığını ve çevrimdışı bir çevrimiçi işlemden sonra konumun değiştirileceğini söyler (ifadeler farklıdır ancak fikri anlarsınız). Çevrimdışı-> Dosyaları taşı-> Çevrimiçi sipariş, bariz bir nedenden dolayı önemlidir. Ayrıca Demonslay335'in notunu da işaretleyin. Dosya izni önemlidir.
MDF ve LDF dosyaları korunur ve veritabanı çevrimiçi durumdayken taşınamaz.
Veritabanının çalışmasını durdurma sakıncası yoksa, o zaman DETACH
, dosyaları ve sonra ATTACH
onu taşıyabilirsiniz .
Properties
Files
Sekmeye gitPath
ve FileName
MDF ve LDF dosyalarının . Eksik olan dosyaları aramak istemiyorsanız bu adım önemlidir ...Tasks -> Detach
Databases
Sunucunuzun düğümüne sağ tıklayınAttach
Add
tıklayınOK
Şimdi iyi olmalısın. DETACH
- ATTACH
İşlem hakkında bilgi burada bulunabilir .
Hakkında DETACH
- bağlantısında , veritabanını aynı SQL Server örneğinde tutarsanız ifadenin ATTACH
kullanılması önerilir ALTER DATABASE
. Kullanıcı Veritabanlarını Taşı bölümünde daha fazla başvuru .
Hareket halindeyken çalışmaya devam etmesini istiyorsanız, a BACKUP
- RESTORE
. Geri yükleme işleminde veritabanı dosyalarının yeni konumunu tanımlayabilirsiniz.
Sistem veritabanı dosyalarını taşımak için şu adımları izleyin:
SSMS’de kullanıcı olarak oturum açın.
Güvenlik için kullanıcının oluşturduğu veritabanının yedeğini alın.
Sunucuya bağlı olan tüm oturumları SSMS'den öldürün.
Sistem veritabanlarının geçerli dosya konumunu kontrol etmek için aşağıdaki komutu uygulayın:
USE master;
SELECT * FROM sys.master_files;
Yolu tanımlayın ve dosyaların geçerli yolunu not alın.
Master dışındaki tüm veritabanlarının dosya yolunu değiştirmek için TSQL kullanın:
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
Örneğin:
ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");
ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");
ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");
ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");
ALTER DATABASE msdb
MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");
ALTER DATABASE msdb
MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");
Şimdi dosya konumu değiştirildi.
Hem ldf hem de mdf dosyalarını taşıdığınızdan emin olun.
SSMS'de Sunucuya sağ tıklayın ve özellikleri seçin. İç özellikler veritabanı ayarlarına gider. Veri ve Günlük için veritabanı varsayılan konumlarını hedef yol olarak değiştirin. Sunucudan oturumu kapatın.
Ör: değişim C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\
içinE:\projects\DataBaseFiles\MSSQL\DATA\
SQL Server örneğini durdurun.
Dosyayı veya dosyaları yeni konuma kopyalayın. Erişim izinlerini hedef klasöre kopyalamak amacıyla dosyaları taşımak için Robocopy'yi kullanın. Cmd'yi açın ve yönetici olarak çalıştırın ve aşağıdaki komutu kullanın:
robocopy / sec sourceFolder hedefiFolder
Komutu çalıştırmak için kaynak konuma gitmek daha iyidir. Kopyalanan sistem veritabanı dosyaları dışındaki diğer dosyaları silin. Örneğin:
robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\
(Burada tüm sistem veritabanı dosyalarını yeni konuma taşıyoruz.)
SQL Server Konfigürasyon Yöneticisi'nde follwing adımlarını gerçekleştirin:
SQL Server Hizmetleri düğümünde, SQL Server örneğini (örneğin, SQL Server (MSSQLSERVER)) sağ tıklatın ve Özellikler'i seçin. SQL Server (örnek_adı) Özellikleri iletişim kutusunda, Başlangıç Parametreleri sekmesini tıklatın. Mevcut parametreler kutusunda, ana veri dosyasını taşımak için –d parametresini seçin. Değişikliği kaydetmek için Güncelle'yi tıklayın. Bir başlangıç parametresi belirtin kutusunda, parametreyi ana veritabanının yeni yoluna değiştirin. Mevcut parametreler kutusunda, ana günlük dosyasını taşımak için –l parametresini seçin. Değişikliği kaydetmek için Güncelle'yi tıklayın. Bir başlangıç parametresi belirtin kutusunda, parametreyi ana veritabanının yeni yoluna değiştirin.
Veri dosyasının parametre değeri -d parametresini izlemeli ve günlük dosyasının değeri -l parametresini izlemelidir. Aşağıdaki örnek, ana veri dosyasının varsayılan konumu için parametre değerlerini gösterir.
-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf
Ana veri dosyası için planlanan yer değiştirme E: \ SQLData ise, parametre değerleri aşağıdaki gibi değiştirilecektir:
-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf
Örnek adına sağ tıklayıp Durdur'u seçerek SQL Server örneğini durdurun. SQL Server örneğini yeniden başlatın.
sa
SSMS'de kullanıcı olarak oturum açın ve aşağıdaki sorguyu uygulayarak veritabanı dosyalarının konumunu doğrulayın:
USE master;
SELECT * FROM sys.master_files;
Hepsi tamam.
Adım adım:
tüm bağlantıları kapat
ALTER DATABASE MyDB SET SINGLE_USER ROLLBACK IMMEDIATE
veritabanını durum dışı olarak ayarla
ALTER DATABASE MyDB SET OFFLINE
Yeni yola
ALTER DATABASE MyDB MODIFY DOSYA (Ad = MyDB, Dosya adı = 'N: \ DATA \ MyDB.MDF')
durumunu çevrimiçi veritabanı ile ayarla
ALTER DATABASE MyDB SET ONLINE
çok kullanıcılı set
ALTER DATABASE MyDB SET MULTI_USER
Veritabanını çevrimdışına almadan veritabanı veri dosyalarını (henüz günlük dosyaları için yapmanın bir yolu olup olmadığından emin değilseniz) taşımanın bir yolu vardır.
Dejan Nakarada-Kordic'in bu yöntemle ilgili bir açıklaması + kodları var: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline
Kısa sürüm, yeni konuma başka bir veritabanı dosyası eklemeniz ve ardından verileri eski dosyadan yeni dosyaya taşımak için EMPTYFILE seçeneğiyle DBCC Shrinkfile kullanmanızdır. Bu yapıldığında eski veri dosyasını kaldırabilirsiniz.
Benim çözümüm değil, bu çözümü kendim arıyordum ve üretim ortamımız için çok faydalı buldum.
Thorfinn
Bu basit 4 adımı izleyin:
CurrentLocation
sütunda gösterdiğiniz yolu not edin .
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');
ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');
Bunun en iyi yol olduğundan emin değilim (bana nasıl olmadığını söylemek için herhangi bir yorumu memnuniyetle karşılayacağım), ama çok basit (ve küçük bir veritabanınız varsa hızlı):
İlk olarak, veritabanını bir .bak dosyasına yedekleyin. Ardından, geri yükleme görevi için dosya seçenekleri altındaki yeni .mdf ve .ldf dosya konumlarını seçerek veritabanını aynı .bak dosyasından geri yükleyin.
Geri yükleme sırasında veritabanına erişemediğiniz için bunu bir bakım penceresinin üretim ortamında ouside yapmazdım. Yukarıda gördüğüm diğer yöntemler de benzer dezavantajlara sahip olacak. Geri yükleme görevi tamamlandıktan sonra eski dosyayı silmeniz gerekmez. Otomatik olarak yapılır.
Mevcut cevapları desteklemek için: İşte ALTER DATABASE ... MOVE ...
tüm veritabanları için ifadeler oluşturacak bir script :
SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) +
' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
');'
FROM sys.master_files AS f
INNER JOIN sys.databases AS d ON f.database_id = d.database_id
WHERE d.name <> 'master';
Not:
REPLACE(f.physical_name, 'C:\', 'D:\')
Dosya yollarında yapmak istediğiniz dönüşümü değiştirin .
master
yolu SQL Server'ın başlangıç seçenekleriyle belirlendiğinden muaftır (örneğin, ayrıntılar için bu cevaba bakınız).
USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location