SQLServer_tempdb_move_00

Kilka słów o tym jak przenieść pliki bazy tempdb

Czasem istnieje potrzeba przeniesienia plików bazy tempdb z jednej lokalizacji do drugiej. Sam osobiście spotkałem się z przypadkiem gdzie pliki tejże bazy znajdowały się w domyślnej lokalizacji na dysku systemowym co jak wiemy nie jest najlepszym rozwiązaniem z kilku powodów. Samo przeniesienie nie jest wybitnie skomplikowane co postaram się przedstawić poniżej.

Na samym początku warto zdiagnozować gdzie znajdują się pliki systemowe naszej bazy danych – posłużą nam do tego widoki systemowe pod postacią sys.master_files. Widok ten zwraca dane na temat plików wszystkich baz danych dlatego też należy go przefiltrować tak aby pokazywał tylko informacje na temat plików bazy tempdb. Aby poznać identyfikator interesującej nas bazy danych najprościej będzie użyć funkcji DB_ID():

select 
	DB_NAME(database_id) AS DatabaseName,
	file_id,
	type_desc,
	name,
	physical_name
 from sys.master_files
where database_id=DB_ID(N'tempdb')

Powyższy rezultat jest jedynie podzbiorem informacji zawartych w widoku systemowym jednakże na ten moment jest to dla nas wiedza wystarczająca. Dane te możemy również otrzymać używając procedury systemowej o nazwie sp_helpfile, która zwraca ustawienia plików dla bieżącej bazy danych – sprawdźmy jego działanie:

USE tempdb
GO 
sp_helpfile

 

Otrzymaliśmy analogiczne do poprzedniego przypadku informacje uzupełnione o rozmiary plików i ich przyrost. Osobiście zawsze wolę używać widoków systemowych jednakże korzystanie z procedur tego typu też jest w porządku. Tak więc stwórzmy sobie folder na dysku, który będzie nam służył za nową lokalizację plików bazy tempdb –  będzie się on znajdował się w lokalizacji C:\Program Files\Tempdb_Files (wiem, że nie jest to wielka zmiana jednakże na ten moment wystarczająca). Teraz aby zmienić lokalizację wystarczy wykonać komendę ALTER DATABASE MODIFY FILE tak jak zostało to przedstawione poniżej :

USE master
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = tempdev, FILENAME = 'C:\Program Files\Tempdb_Files\tempdev.mdf')
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = templog, FILENAME = 'C:\Program Files\Tempdb_Files\templog.ldf')
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = temp2, FILENAME = 'C:\Program Files\Tempdb_Files\temp2.ndf')
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = temp3, FILENAME = 'C:\Program Files\Tempdb_Files\temp3.ndf')
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = temp4, FILENAME = 'C:\Program Files\Tempdb_Files\temp4.ndf')
GO

Zapytanie to musiało zostać wykonane osobno dla każdego pliku gdzie wskaźnikiem do pliku jest jego nazwa logiczna. Po wykonaniu powyższego zestawu otrzymamy następujący komunikat:

The file "tempdev" has been modified in the system catalog. The new path will be used the next time the database is started.
The file "templog" has been modified in the system catalog. The new path will be used the next time the database is started.
The file "temp2" has been modified in the system catalog. The new path will be used the next time the database is started.
The file "temp3" has been modified in the system catalog. The new path will be used the next time the database is started.
The file "temp4" has been modified in the system catalog. The new path will be used the next time the database is started.

Tak więc na ten moment modyfikacja plików wymaga zrestartowania usługi – zmodyfikowane przez nas dane zostały zapisane jednakże fizyczna modyfikacja zostanie wykonana po restarcie. Zróbmy więc to – zrestartujmy usługę używając Configuration Manager (więcej o tym narzędziu i o usługach SQL Server możecie przeczytać tutaj). Po restarcie nasze pliki powinny zostać utworzone w nowej lokalizacji – aby to sprawdzić możemy ponownie odpytać widok systemowy sys.master_files:

Jak widać wszystko przebiegło bez większych problemów. Cały proces jest bardzo prosty i stosunkowo szybko możemy osiągnąć pożądany efekt jednakże zawsze może pojawić się jakaś przeszkoda jak np. to że pomyliliśmy się i podaliśmy błędną ścieżkę do nowych plików – jak to naprawić? Uruchamiając usługę SQL Server z ustawieniami minimalnymi, ale to już temat na osobny artykuł. Mam nadzieję, że teraz będziecie potrafili przenosić pliki tempdb i umieszczać je w pożądanych lokalizacjach 🙂

4 Comments

  1. Nigdy nie miałem takiej potrzeby, by przenosić pliki baz systemowych. Ale faktycznie, dobrze jest się nad tym zastanowić, bo czasami może zajść taka potrzeba. Zwłaszcza jeśli poprzedni DBA instalował SQL Servera z domyślnymi ustawieniami (wszystko na jednej partycji: pliki baz systemowych, logi transakcyjne i pliki baz danych).

  2. Czy baza tempdb musi być umieszczona na dysku fizycznym, czy można ją umieścić w pamięci operacyjnej? Tak analogicznie do baz in-memory?

    • Baza tempdb działa mniej więcej tak jak standardowa baza danych – tak więc musi posiadać pliki fizyczne.

  3. A jak sprawa wygląda z pozostałymi bazami sys – master i msdb?
    Tutaj raczej jak ze zwykłymi bazami:
    – stop usługi
    -detach database
    – fizyczne skopiowanie 4 plików (mdf i ldf) do nowej lokalizacji
    -attach database
    – start usługi.

Leave a Reply