SQL Server veritabanı dosyalarını nasıl taşırım?


103

Bir veritabanım var .mdfve .ldfdosyaları başka bir konuma taşımak istiyorum . Ancak MSSQLSERVERhizmeti durdurmak istemiyorum ve başka bir sunucuya vermek istemiyorum.

Bunu nasıl yapabilirim?

Yanıtlar:


154

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 DATABASEkomutla 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 IMMEDIATEHerkesi 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 .


13
Bu benim için çalıştı. Benim durumumda da ilk komutu kullanarak LDF dosyasını da taşımak zorunda kaldım: örneğin 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
Dewi Rees

1
Ayrıca, tam metin dizini dosyalarını yalnızca dosyalar iletişim kutusunda gördüğünüzle eşleşecek şekilde dosya adını güncelleyerek taşımak için de kullanılabilir.
DShook

24
Veritabanı dosyalarını taşıdıktan sonra, "NT SERVICE \ MSSQLSERVER" kullanıcısının izinlerine sahip olduğundan emin olun; aksi halde veritabanını tekrar çevrimiçi duruma getirmeye çalışırken hata alırsınız.
Demonslay335

Olması gereken "isim" nedir? Belgelerde "mantıksal_adı" var. Ne demek istiyorlar?
johnny

2
@mlhDev Aslında benim durumumda MODIFY FILEdeğ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.
Lionet Chen,

50

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 ATTACHonu taşıyabilirsiniz .

  • Veritabanının adına sağ tıklayın
  • seçmek Properties
  • FilesSekmeye git
  • Not edin Pathve FileNameMDF ve LDF dosyalarının . Eksik olan dosyaları aramak istemiyorsanız bu adım önemlidir ...
  • Veritabanı adına sağ tıklayın
  • seçmek Tasks -> Detach
  • Dosyaları istediğiniz yere taşıyın
  • DatabasesSunucunuzun düğümüne sağ tıklayın
  • seçmek Attach
  • Düğmesine Addtıklayın
  • Yeni konumu göster
  • Click OK

Ş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 ATTACHkullanı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.


3

6

Sistem veritabanı dosyalarını taşımak için şu adımları izleyin:

  1. SSMS’de kullanıcı olarak oturum açın.

  2. Güvenlik için kullanıcının oluşturduğu veritabanının yedeğini alın.

  3. Sunucuya bağlı olan tüm oturumları SSMS'den öldürün.

  4. 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.

  1. 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.

  1. 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\

  2. SQL Server örneğini durdurun.

  3. 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.)

  1. Başlat menüsünden Tüm Programlar'ın üzerine gelin, Microsoft SQL Server'ın üzerine gelin, Yapılandırma Araçları'nın üzerine gelin ve sonra SQL Server Yapılandırma Yöneticisi'ni tıklatın.

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.

  1. saSSMS'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.


Tüm veritabanları için görevi otomatikleştirmek amacıyla SQL işlevini kullanabilirsiniz: stackoverflow.com/a/19505918/439524
amuliar

3

Adım adım:

  1. tüm bağlantıları kapat
    ALTER DATABASE MyDB SET SINGLE_USER ROLLBACK IMMEDIATE

  2. veritabanını durum dışı olarak ayarla
    ALTER DATABASE MyDB SET OFFLINE

  3. Yeni yola
    ALTER DATABASE MyDB MODIFY DOSYA (Ad = MyDB, Dosya adı = 'N: \ DATA \ MyDB.MDF')

  4. durumunu çevrimiçi veritabanı ile ayarla
    ALTER DATABASE MyDB SET ONLINE

  5. çok kullanıcılı set
    ALTER DATABASE MyDB SET MULTI_USER


3

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


1

Bu basit 4 adımı izleyin:

  1. SSMS'yi açın ve pencerenin üstünden Yeni Sorgu seçeneğini seçin . Ardından, yeni yola taşımak istediğimiz Veritabanının yolunu bulmak için Aşağıdaki Sorguyu kopyalayıp uygulayın ve CurrentLocationsütunda gösterdiğiniz yolu not edin .

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. Şimdi bu yola gidin ve Database_Name.mdf ve Database_Name_log.ldf dosyalarının adını not edin . Ardından Veritabanını Belirli Konumuna taşımak için aşağıdaki iki Sorguyu uygulayın.

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');

  1. Şimdi, Dur sağ tıklayın By Sunucusu Server_NameObject Explorer (Sol Taraf) içinde görebileceğiniz.

    görüntü tanımını buraya girin

  2. Sonra taşı iki dosya Eski Yolu için Yeni Yol ve Server_Name sağ tıkla yeniden sunucuyu başlatın. 1. adımın sorgusunu tekrar çalıştırarak Veritabanının Yeni Yolunu onaylayın.


0

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.


1
Bu senaryonun bazı dezavantajları var. Geri yüklerken, orijinal DB'nin üzerine yazılmalı veya yeniden adlandırılmalıdır. Büyük veritabanları için, bu yöntem genel olarak ciddi IO yükünü sunar. Açıklandığı gibi dosyaları Hareketli kopmakta-takmak veya db değiştiren yöntemleri olduğunu yolu daha hızlı. Dosyalar aynı NTFS bölümünde taşınırsa, bu yalnızca bir meta veri işlemidir.
vonPryz

@Ali - Yedekleme ve Geri Yükleme. Daha uzun sürebilir, ancak genellikle daha güvenli bir yoldur. Aaron Bertrand'ın analizine bakınız: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups Ayrıca: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

Çok büyük veritabanları için bu yaklaşım (ve ayırma / bağlanma yaklaşımı) önemli bir kesinti sunar. Bunu önlemek için, kaynak veritabanını tam kurtarma moduna getirin, sonra ilk yedekleme geri yüklemesini çalışma dışı bırakılan hedef DB ile gerçekleştirin. Ardından bir veya daha fazla işlem günlüğünü yedekleyin / geri yükleyin. Veritabanının, yalnızca isteğe bağlı olarak küçük bir zaman ve boyut içerebilen işlem günlüğünün son yedeklemesi / geri yüklenmesi sırasında kapatılması gerekecektir. Açıkçası farklı bir isme geri yüklemeniz ve ardından bir isim takası yapmanız gerekecek. Bu yaklaşım kabaca log-shipping ile eşdeğerdir.
Brian,

0

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 .

  • masteryolu SQL Server'ın başlangıç ​​seçenekleriyle belirlendiğinden muaftır (örneğin, ayrıntılar için bu cevaba bakınız).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.