Bagaimana cara memindahkan file database SQL Server?


103

Saya memiliki database dan ingin memindahkan .mdfdan .ldffile ke lokasi lain. Tetapi saya tidak ingin menghentikan MSSQLSERVERlayanan, dan saya tidak ingin mengekspor ke server lain.

Bagaimana saya bisa melakukan ini?

Jawaban:


154

Anda tidak harus menghentikan layanan SQL Server untuk memindahkan file database, tetapi Anda harus membuat database tertentu offline. Ini karena Anda tidak dapat memindahkan file saat sedang diakses dan membuat database offline menghentikan file dari digunakan oleh aplikasi SQL Server.

Proses untuk memindahkannya cukup sederhana. Lepaskan / Lampirkan sudah dijelaskan, tetapi tidak hampir kompleks ini.

Ubah lokasi file dengan ALTER DATABASEperintah:

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

Catatan, Anda tidak perlu mendeklarasikan lokasi lama dalam perintah ini. Mengubah jalur ini tidak langsung berlaku, tetapi akan digunakan saat berikutnya database dimulai.

Setel basis data offline

(Saya gunakan WITH ROLLBACK IMMEDIATEuntuk mengusir semua orang dan mengembalikan semua transaksi yang saat ini terbuka)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Pindahkan / Salin file ke lokasi baru

Cukup salin file menggunakan metode favorit Anda (Klik 'n Seret, XCopy, Salin-Item, Robocopy)

Bawalah database secara online

ALTER DATABASE foo SET ONLINE;

Anda dapat melihat ini dijelaskan lebih terinci di sini .


13
Ini berhasil untuk saya. Dalam kasus saya, saya juga harus memindahkan file LDF juga menggunakan perintah pertama: eg 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
Juga dapat digunakan untuk memindahkan file indeks teks lengkap hanya dengan memperbarui nama file agar sesuai dengan apa yang Anda lihat dalam dialog file.
DShook

24
Pastikan setelah memindahkan file database, bahwa pengguna "NT SERVICE \ MSSQLSERVER" memiliki izin untuk itu, atau Anda akan mendapatkan kesalahan ketika mencoba untuk membawa database kembali online.
Demonslay335

Apa itu "nama" seharusnya? Dalam dokumentasi itu ada "logical_name." Apa yang mereka maksud?
johnny

2
@mlhDev Sebenarnya dalam MODIFY FILEpesanan kasus saya dapat diubah. Jika Anda menjalankan MODIFY FILE terlebih dahulu, itu akan memberi tahu Anda perintah berhasil dijalankan dan lokasi akan berubah setelah operasi offline-online (kata-kata berbeda tetapi Anda mendapatkan ide). Offline-> Pindahkan file-> Pesanan online memang penting, karena alasan yang jelas. Juga tandai catatan Demonslay335. Izin file penting.
Lionet Chen

50

File MDF dan LDF dilindungi dan tidak dapat dipindahkan saat database online.

Jika Anda tidak keberatan menghentikan basis data dari bekerja, maka Anda bisa DETACH, pindahkan file dan kemudian ATTACH.

  • Klik kanan pada nama database
  • Pilih Properties
  • Buka Filestab
  • Membuat catatan dari Pathdan FileNameMDF dan file LDF . Langkah ini penting jika Anda tidak ingin mencari file yang hilang ...
  • Klik kanan pada nama database
  • Pilih Tasks -> Detach
  • Pindahkan file ke tempat yang Anda inginkan
  • Klik kanan pada Databasesnode server Anda
  • Pilih Attach
  • Klik pada Addtombol
  • Tunjuk ke lokasi baru
  • Klik OK

Anda seharusnya baik-baik saja sekarang. Info tentang DETACH- ATTACHproses dapat ditemukan di sini .

Di tautan tentang DETACH- ATTACHada rekomendasi untuk menggunakan ALTER DATABASEpernyataan jika menyimpan database pada instance SQL Server yang sama. Referensi lainnya di Pindahkan Basis Data Pengguna .

Jika Anda ingin tetap menjalankannya sambil bergerak, maka lakukan a BACKUP- RESTORE. Dalam proses pemulihan, Anda dapat menentukan lokasi baru file database.


3
Saya sarankan membuka SQL Management Studio sebagai administrator untuk menghindari masalah akses file ketika memasang kembali
Simon_Weaver

6

Untuk Memindahkan file basis data sistem, ikuti langkah-langkah ini:

  1. Masuk sebagai pengguna di SSMS

  2. Ambil cadangan dari database yang dibuat pengguna untuk keamanan.

  3. Bunuh semua sesi yang terhubung ke Server dari SSMS.

  4. Jalankan perintah berikut untuk memeriksa lokasi file saat ini dari basis data sistem:

    USE master;
    SELECT * FROM sys.master_files;

Identifikasi jalur dan catat jalur saat ini dari file.

  1. Gunakan TSQL untuk mengubah jalur file untuk semua basis data kecuali master:

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

Misalnya:

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

Sekarang lokasi file telah diubah.

Pastikan untuk memindahkan file ldf dan mdf

  1. Di SSMS klik kanan Server dan pilih properti. Properti di dalam pergi ke Pengaturan Database. Ubah lokasi default database untuk Data dan Log ke jalur tujuan. Logout dari server.

    Misalnya: ubah C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\keE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Hentikan contoh SQL Server.

  3. Salin file atau file ke lokasi baru. Gunakan Robocopy untuk memindahkan file untuk menyalin izin akses ke folder tujuan. Buka cmd dan jalankan sebagai administrator dan gunakan perintah berikut:

    robocopy / sec sourceFolder destinationFolder

Lebih baik pergi ke lokasi sumber untuk menjalankan perintah. Hapus file lain selain file basis data sistem yang disalin. Misalnya:

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

(Di sini kami memindahkan semua file database sistem ke lokasi baru.)

  1. Dari menu Mulai, arahkan ke Semua Program, arahkan ke Microsoft SQL Server, arahkan ke Alat Konfigurasi, lalu klik Manajer Konfigurasi Server SQL.

Lakukan langkah-langkah berikut di SQL Server Configuration Manager:

Di node SQL Server Services, klik kanan instance SQL Server (misalnya, SQL Server (MSSQLSERVER)) dan pilih Properties .. Di kotak dialog Properties SQL Server (instance_name), klik tab Parameter Startup. Di kotak Parameter yang ada, pilih –d parameter untuk memindahkan file data master. Klik Perbarui untuk menyimpan perubahan. Di kotak Tentukan parameter startup, ubah parameter ke jalur baru dari database master. Di kotak Parameter yang ada, pilih –l parameter untuk memindahkan file log master. Klik Perbarui untuk menyimpan perubahan. Di kotak Tentukan parameter startup, ubah parameter ke jalur baru dari database master.

Nilai parameter untuk file data harus mengikuti parameter -d dan nilai untuk file log harus mengikuti parameter -l. Contoh berikut menunjukkan nilai parameter untuk lokasi default file data master.

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

Jika relokasi yang direncanakan untuk file data master adalah E: \ SQLData, nilai parameter akan diubah sebagai berikut:

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

Hentikan instance dari SQL Server dengan mengklik kanan nama instance dan memilih Stop. Mulai ulang contoh SQL Server.

  1. Masuk sebagai sapengguna di SSMS dan verifikasi lokasi file database dengan mengeksekusi permintaan berikut:

    USE master;
    SELECT * FROM sys.master_files;

Semua selesai.


Anda bisa menggunakan fungsi SQL untuk mengotomatiskan tugas untuk semua database: stackoverflow.com/a/19505918/439524
amuliar

3

Anda melakukan langkah demi langkah:

  1. tutup semua koneksi
    ALTER DATABASE MyDB SET SINGLE_USER DENGAN ROLLBACK SEGERA

  2. atur database dengan status offline
    ALTER DATABASE MyDB SET OFFLINE

  3. Ke jalur baru
    ALTER DATABASE FILE MODIFIKASI MyDB (Nama = MyDB, Nama file = 'N: \ DATA \ MyDB.MDF')

  4. set database dengan status online
    ALTER DATABASE MyDB SET ONLINE

  5. atur
    DATABASE ALTER multi-pengguna MyDB SET MULTI_USER


3

Ada cara untuk memindahkan file data database (belum yakin apakah ada cara untuk melakukan ini untuk file log) tanpa membuat database offline.

Dejan Nakarada-Kordic memiliki penjelasan + skrip untuk metode ini di sini: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

Versi singkatnya adalah Anda menambahkan file database lain di lokasi baru, dan kemudian menggunakan DBCC Shrinkfile, dengan opsi EMPTYFILE untuk memindahkan data dari file lama ke file baru. Ketika ini selesai, Anda dapat menghapus file data lama.

Bukan solusi saya, saya sendiri yang mencari solusi ini dan merasa sangat berguna untuk lingkungan produksi kami.

Thorfinn


1

Ikuti 4 langkah sederhana ini:

  1. Buka SSMS dan pilih opsi Permintaan Baru dari atas jendela. Kemudian, salin dan jalankan Query berikut untuk menemukan path database yang ingin kita pindah ke path baru dan perhatikan path yang Anda tunjukkan di CurrentLocationkolom.

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

  1. Sekarang pergi ke jalan itu dan perhatikan nama Database_Name.mdf & Database_Name_log.ldf file. Kemudian jalankan dua Pertanyaan berikut untuk memindahkan Database ke Lokasi Tertentu.

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. Sekarang, Hentikan Server Dengan Klik Kanan Server_Nameyang dapat Anda lihat di Object Explorer (Sisi Kiri).

    masukkan deskripsi gambar di sini

  2. Kemudian Pindahkan kedua file dari Lintasan Lama ke Lintasan Baru dan mulai lagi server dengan Klik Kanan pada Server_Name. Konfirmasikan Jalur Baru Basis Data dengan kembali menjalankan kueri langkah 1.


0

Saya tidak yakin bahwa ini adalah cara terbaik (saya akan menyambut setiap komentar untuk memberi tahu saya bagaimana tidak), tetapi sangat sederhana (dan cepat jika Anda memiliki database kecil):

Pertama, buat cadangan database ke file .bak. Kemudian, pulihkan database dari file .bak yang sama, pilih lokasi file .mdf dan .ldf yang baru di bawah opsi file untuk tugas pemulihan.

Saya tidak akan melakukannya di lingkungan produksi di luar jendela pemeliharaan, karena Anda tidak dapat mengakses database selama pemulihan. Metode lain yang saya lihat di atas akan memiliki kelemahan serupa. Setelah tugas pemulihan selesai, Anda tidak perlu menghapus file lama. Ini dilakukan secara otomatis.


1
Skenario ini memiliki beberapa kekurangan. Saat memulihkan, DB asli harus ditimpa atau diganti namanya. Untuk database besar, metode ini memperkenalkan overhead IO yang serius. Memindahkan file seperti yang dijelaskan dalam metode detach-attach atau alter db jauh lebih cepat. Jika file dipindahkan dalam partisi NTFS yang sama, itu hanya operasi metadata.
vonPryz

@ Ali - Cadangkan dan Kembalikan. Mungkin butuh waktu lebih lama, tetapi umumnya jalan yang lebih aman. Lihat analisis Aaron Bertrand di: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups Juga: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

Untuk database yang sangat besar, pendekatan ini (dan pendekatan detach / attach) memperkenalkan downtime yang substansial. Untuk menghindari hal ini, tempatkan basis data sumber dalam mode pemulihan penuh, kemudian lakukan pemulihan cadangan awal dengan DB tujuan tidak beroperasi. Kemudian buat cadangan / kembalikan satu atau lebih log transaksi. Basis data hanya perlu down selama backup / restore terakhir dari log transaksi, yang dapat berisi waktu dan ukuran kecil yang sewenang-wenang. Tentunya Anda juga harus mengembalikan ke nama yang berbeda dan kemudian melakukan pertukaran nama. Pendekatan ini kira-kira setara dengan pengiriman log.
Brian

0

Untuk melengkapi jawaban yang ada: Berikut ini skrip untuk membuat ALTER DATABASE ... MOVE ...pernyataan untuk semua database:

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

catatan:

  • Ganti REPLACE(f.physical_name, 'C:\', 'D:\')dengan transformasi apa pun yang ingin Anda buat ke jalur file.

  • masterdikecualikan, karena jalurnya ditentukan oleh opsi startup SQL Server (lihat, misalnya, jawaban ini untuk detail).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.