Jak przenieść pliki bazy danych SQL Server?

103

Mam bazę danych i chcę przenieść pliki .mdfi .ldfdo innej lokalizacji. Ale nie chcę zatrzymywać MSSQLSERVERusługi i nie chcę eksportować na inny serwer.

Jak mogę to zrobić?

Mike Fal
źródło

Odpowiedzi:

154

Nie musisz zatrzymywać usługi SQL Server, aby przenieść pliki bazy danych, ale musisz przełączyć określoną bazę danych w tryb offline. Wynika to z faktu, że nie można przenosić plików podczas dostępu do nich, a przełączenie bazy danych w tryb offline powoduje, że pliki nie są używane przez aplikację SQL Server.

Proces ich przenoszenia jest dość prosty. Detach / Attach został już opisany, ale nie jest to prawie taki kompleks.

Zmień lokalizacje plików za pomocą ALTER DATABASEpolecenia:

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

Uwaga: w tym poleceniu nie musisz deklarować starej lokalizacji. Zmiana tej ścieżki nie obowiązuje od razu, ale zostanie wykorzystana przy następnym uruchomieniu bazy danych.

Przełącz bazę danych w tryb offline

(Używam WITH ROLLBACK IMMEDIATEdo wyrzucania wszystkich i wycofywania wszystkich aktualnie otwartych transakcji)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Przenieś / skopiuj pliki do nowej lokalizacji

Po prostu skopiuj pliki przy użyciu swojej ulubionej metody (kliknij i przeciągnij, XCopy, Kopiuj element, Robocopy)

Przełącz bazę danych do trybu online

ALTER DATABASE foo SET ONLINE;

Możesz zobaczyć to szczegółowo opisane tutaj .

Mike Fal
źródło
13
To zadziałało dla mnie. W moim przypadku musiałem również przenieść plik LDF za pomocą pierwszego polecenia: np. 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
Można go również użyć do przeniesienia plików indeksu pełnotekstowego, po prostu aktualizując nazwę pliku, aby pasowała do tego, co widać w oknie dialogowym plików.
DShook
24
Po przeniesieniu plików bazy danych upewnij się, że użytkownik „NT SERVICE \ MSSQLSERVER” ma do niej uprawnienia, w przeciwnym razie wystąpią błędy podczas próby przywrócenia bazy danych do trybu online.
Demonslay335
Co to powinno być „imię”? W dokumentacji ma on „nazwa_logiczna”. Co mieli na myśli?
Johnny
2
@mlhDev Właściwie w moim przypadku MODIFY FILEkolejność jest zmienna. Jeśli najpierw uruchomisz MODIFY FILE, powiesz, że polecenie działa poprawnie, a lokalizacja zostanie zmieniona po operacji offline-online (sformułowanie jest inne, ale masz pomysł). Z oczywistych względów znaczenie ma jednak Offline -> Przenieś pliki -> Zamówienie online. Zaznacz także notatkę Demonslay335. Uprawnienie do pliku jest ważne.
Lionet Chen
50

Pliki MDF i LDF są chronione i nie można ich przenosić, gdy baza danych jest w trybie online.

Jeśli nie masz nic przeciwko zatrzymaniu bazy danych, możesz to DETACHzrobić, przenieść pliki, a następnie ATTACHto.

  • Kliknij prawym przyciskiem myszy nazwę bazy danych
  • Wybierz Properties
  • Idź do Fileszakładki
  • Zanotuj Pathi FileNamepłyty MDF i LDF plików . Ten krok jest ważny, jeśli nie chcesz kończyć wyszukiwania brakujących plików ...
  • Kliknij prawym przyciskiem myszy nazwę bazy danych
  • Wybierz Tasks -> Detach
  • Przenieś pliki tam, gdzie chcesz
  • Kliknij prawym przyciskiem myszy Databaseswęzeł swojego serwera
  • Wybierz Attach
  • Kliknij Addprzycisk
  • Wskaż nową lokalizację
  • Kliknij OK

Powinieneś już być OK. Informacje na temat DETACH- ATTACHprocesu można znaleźć tutaj .

W linku about DETACH- ATTACHzaleca się użycie ALTER DATABASEinstrukcji, jeśli baza danych jest przechowywana w tym samym wystąpieniu programu SQL Server. Więcej informacji w Przenieś bazy danych użytkowników .

Jeśli chcesz, aby działał podczas ruchu, wykonaj BACKUP- RESTORE. W procesie przywracania możesz zdefiniować nową lokalizację plików bazy danych.

Giannis Paraskevopoulos
źródło
3
Polecam otwarcie SQL Management Studio jako administratora, aby uniknąć problemów z dostępem do plików podczas ponownego podłączania
Simon_Weaver
6

Aby przenieść systemowe pliki bazy danych, wykonaj następujące kroki:

  1. Zaloguj się jako użytkownik sa w SSMS

  2. Dla bezpieczeństwa wykonaj kopię zapasową bazy danych utworzonej przez użytkownika.

  3. Zabij wszystkie sesje połączone z serwerem z SSMS.

  4. Wykonaj następujące polecenie, aby sprawdzić bieżące położenie pliku systemowych baz danych:

    USE master;
    SELECT * FROM sys.master_files;

Zidentyfikuj ścieżkę i zanotuj bieżącą ścieżkę plików.

  1. Użyj TSQL, aby zmienić ścieżkę pliku dla wszystkich baz danych oprócz master:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

Na przykład:

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

Teraz lokalizacja pliku została zmieniona.

Pamiętaj, aby przenieść zarówno pliki ldf, jak i mdf

  1. W SSMS kliknij prawym przyciskiem myszy Serwer i wybierz właściwości. Wewnątrz właściwości przejdź do Ustawienia bazy danych. Zmień domyślne lokalizacje bazy danych dla Data i Log na ścieżkę docelową. Wyloguj się z serwera.

    Np .: zmień C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\naE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Zatrzymaj wystąpienie programu SQL Server.

  3. Skopiuj plik lub pliki do nowej lokalizacji. Użyj Robocopy, aby przenieść pliki, aby skopiować uprawnienia dostępu do folderu docelowego. Otwórz cmd i uruchom jako administrator i użyj następującego polecenia:

    robocopy / sec sourceFolder destinationFolder

Lepiej jest przejść do lokalizacji źródłowej, aby uruchomić polecenie. Usuń inne pliki inne niż systemowe pliki bazy danych, które są kopiowane. Na przykład:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(Tutaj przenosimy wszystkie systemowe pliki bazy danych do nowej lokalizacji).

  1. Z menu Start wskaż Wszystkie programy, wskaż Microsoft SQL Server, wskaż Narzędzia konfiguracyjne, a następnie kliknij SQL Server Menedżer konfiguracji.

Wykonaj następujące kroki w programie SQL Server Configuration Manager:

W węźle SQL Server Services kliknij prawym przyciskiem myszy wystąpienie SQL Server (na przykład SQL Server (MSSQLSERVER)) i wybierz Właściwości. W oknie dialogowym Właściwości SQL Server (nazwa_instancji) kliknij kartę Parametry uruchamiania. W polu Istniejące parametry wybierz parametr –d, aby przenieść plik danych podstawowych. Kliknij Aktualizuj, aby zapisać zmianę. W polu Określ parametr początkowy zmień parametr na nową ścieżkę głównej bazy danych. W polu Istniejące parametry wybierz parametr –l, aby przenieść główny plik dziennika. Kliknij Aktualizuj, aby zapisać zmianę. W polu Określ parametr początkowy zmień parametr na nową ścieżkę głównej bazy danych.

Wartość parametru dla pliku danych musi być zgodna z parametrem -d, a wartość dla pliku dziennika musi być zgodna z parametrem -l. Poniższy przykład pokazuje wartości parametrów dla domyślnej lokalizacji pliku danych podstawowych.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Jeśli planowanym przeniesieniem dla pliku danych podstawowych jest E: \ SQLData, wartości parametrów zostaną zmienione w następujący sposób:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Zatrzymaj wystąpienie programu SQL Server, klikając prawym przyciskiem myszy nazwę wystąpienia i wybierając polecenie Zatrzymaj. Uruchom ponownie wystąpienie programu SQL Server.

  1. Zaloguj się jako saużytkownik w SSMS i sprawdź lokalizację plików bazy danych, wykonując następujące zapytanie:

    USE master;
    SELECT * FROM sys.master_files;

Wszystko gotowe.

abhay sreekumar
źródło
Możesz użyć funkcji SQL do zautomatyzowania zadania dla wszystkich baz danych: stackoverflow.com/a/19505918/439524
amuliar
3

Robisz krok po kroku:

  1. zamknij wszystkie połączenia
    ZMIEŃ BAZĘ DANYCH ZESTAW MyDB POJEDYNCZY_UŻYTKOWNIK Z NATYCHMIASTOWYM ROLLBACK

  2. ustaw bazę danych ze statusem offline
    ZMIEŃ BAZĘ DANYCH ZESTAW MyDB OFFLINE

  3. Do nowej ścieżki
    ZMIEŃ bazę danych MyDB MODIFY FILE (Name = MyDB, Filename = 'N: \ DATA \ MyDB.MDF')

  4. ustaw bazę danych ze statusem online
    ZMIEŃ BAZA DANYCH ZESTAW MyDB ONLINE

  5. ustaw dla wielu użytkowników
    ZMIEŃ BAZY DANYCH ZESTAW MyDB MULTI_USER

Nguyễn Hải Đăng
źródło
3

Istnieje sposób na przeniesienie plików danych bazy danych (jeszcze nie jestem pewien, czy można to zrobić w przypadku plików dziennika) bez przełączania bazy danych w tryb offline.

Dejan Nakarada-Kordic ma wyjaśnienie + skrypty dla tej metody tutaj: https://www.itprotoday.com/sql-server/move-database-files-with-taking-database-offline

Krótka wersja polega na tym, że dodajesz kolejny plik bazy danych w nowej lokalizacji, a następnie używasz pliku DBCC Shrinkfile, z opcją EMPTYFILE, aby przenieść dane ze starego pliku do nowego pliku. Po wykonaniu tej czynności możesz usunąć stary plik danych.

Nie moje rozwiązanie, sam szukałem tego rozwiązania i uznałem je za bardzo przydatne w naszym środowisku produkcyjnym.

Thorfinn

Thorfinn Thomassen
źródło
1

Wykonaj te proste 4 kroki:

  1. Otwórz SSMS i wybierz opcję Nowe zapytanie z góry okna. Następnie skopiuj i wykonaj następujące zapytanie, aby znaleźć ścieżkę do bazy danych, którą chcemy przenieść na nową ścieżkę, i zanotuj ścieżkę pokazaną w CurrentLocationkolumnie.

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

  1. Teraz przejdź do tej ścieżki i zanotuj nazwę plików Database_Name.mdf & Database_Name_log.ldf . Następnie wykonaj następujące dwa zapytania, aby przenieść bazę danych do określonej lokalizacji.

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. Teraz zatrzymaj serwer klikając prawym przyciskiem myszy, Server_Namektóry możesz zobaczyć w Object Explorer (po lewej stronie).

    wprowadź opis zdjęcia tutaj

  2. Następnie przenieś oba pliki ze starej ścieżki do nowej ścieżki i ponownie uruchom serwer, klikając prawym przyciskiem myszy nazwę serwera. Potwierdź nową ścieżkę bazy danych, ponownie wykonując zapytanie pierwszego kroku.

Karan Raiyani
źródło
0

Nie jestem pewien, czy jest to najlepszy sposób (chętnie przyjmę wszelkie komentarze, aby powiedzieć mi, jak to nie jest), ale jest to bardzo proste (i szybkie, jeśli masz małą bazę danych):

Najpierw wykonaj kopię zapasową bazy danych do pliku .bak. Następnie przywróć bazę danych z tego samego pliku .bak, wybierając nowe lokalizacje plików .mdf i .ldf w opcjach pliku dla zadania przywracania.

Nie zrobiłbym tego w środowisku produkcyjnym obok okna obsługi, ponieważ nie można uzyskać dostępu do bazy danych podczas przywracania. Inne metody, które widziałem powyżej, miałyby jednak podobne wady. Po zakończeniu zadania przywracania nie musisz usuwać starego pliku. Odbywa się to automatycznie.

Ali
źródło
1
Ten scenariusz ma pewne wady. Podczas przywracania oryginalna baza danych musi zostać zastąpiona lub zmieniona. W przypadku dużych baz danych metoda wprowadza poważne obciążenie IO. Przenoszenie plików zgodnie z opisem w metodach detach-attach lub alter db jest znacznie szybsze. Jeśli pliki są przenoszone na tej samej partycji NTFS, jest to tylko operacja na metadanych.
vonPryz
@Ali - Tworzenie kopii zapasowych i przywracanie. Może to potrwać dłużej, ale ogólnie jest bezpieczniejszą ścieżką. Zobacz analizę Aarona Bertranda na: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups Także: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF
W przypadku bardzo dużych baz danych takie podejście (i podejście odłączania / dołączania) wprowadza znaczne przestoje. Aby tego uniknąć, ustaw źródłową bazę danych w trybie pełnego odzyskiwania, a następnie wykonaj początkowe przywracanie kopii zapasowej z pozostawioną niedziałającą docelową bazą danych. Następnie wykonaj kopię zapasową / przywróć jeden lub więcej dzienników transakcji. Baza danych będzie musiała zostać wyłączona tylko podczas ostatecznego tworzenia kopii zapasowej / przywracania dziennika transakcji, który może zawierać dowolnie mały czas i rozmiar. Oczywiście musisz także przywrócić inną nazwę, a następnie wykonać zamianę nazwy. To podejście jest mniej więcej równoważne wysyłce kłód.
Brian
0

Aby uzupełnić istniejące odpowiedzi: Oto skrypt do tworzenia ALTER DATABASE ... MOVE ...instrukcji dla wszystkich baz danych:

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

Uwaga:

  • Zastąp REPLACE(f.physical_name, 'C:\', 'D:\')dowolną transformacją, którą chcesz wprowadzić do ścieżek plików.

  • masterjest zwolniony, ponieważ jego ścieżka jest określana przez opcje uruchamiania programu SQL Server (szczegółowe informacje można znaleźć na przykład w tej odpowiedzi ).

Heinzi
źródło