Bagaimana cara melampirkan database di SQL Server?


32

Beberapa pertanyaan umum yang berkaitan dengan melampirkan database di SQL Server:

  • Apa artinya melampirkan atau melepaskan basis data?
  • Bagaimana cara melepaskan basis data?
  • Bagaimana cara saya melampirkan database?
    • Apa artinya melampirkan dan membangun kembali log?
  • Bagaimana saya melakukannya di SQL Server Express?
  • Kapan saya dapat mempertimbangkan untuk melepaskan dan menempel?
  • Apakah ada risiko atau peringatan?
  • Bagaimana dengan melampirkan antara versi dan edisi SQL Server? (Standar untuk Perusahaan? 2000 hingga 2008? 2012 hingga 2008?)

Jawaban:


33

Apa yang Melepas atau Melampirkan dan Bagaimana Cara Kerjanya?

Kami akan mulai dengan detach. Ketika Anda melepaskan database di SQL Server, Anda mengambil database offline dan menghapusnya dari contoh SQL Server dari mana Anda melepaskannya. Data database dan file log tetap dalam kebijaksanaan dan dibiarkan dalam kondisi yang konsisten sehingga Anda kemudian dapat melampirkan database di titik kemudian atau ke contoh SQL Server lain. Melampirkan menghubungkan data dan file log dari database yang telah dilepaskan dengan benar (atau yang disalin dari instance SQL Server yang dimatikan dengan bersih) ke instance SQL Server dan membawa database online.

Bagaimana Saya Melepaskan Basis Data?

Anda bisa melakukan ini dalam T-SQL atau dari SQL Server Management Studio GUI.

Di GUI, Anda klik kanan pada database yang ingin Anda lepaskan, pilih All Tasksdan klik Detach. Dari sana Anda akan mendapatkan dialog detach. Anda dapat memilih untuk menjatuhkan koneksi terlebih dahulu untuk memutuskan secara paksa setiap koneksi yang aktif dan pekerjaan rollback yang sedang mereka jalankan. Anda juga dapat memilih untuk memperbarui statistik sebelum melepaskan. Melepaskan melalui - Pilih Lepaskan ...

Dalam T-SQL:

-- You don't want to be in the database you are trying to detach
USE Master
GO

-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO

Untuk prosedur tersimpan sistem sp_detach_db ada dua paramaters yang dapat Anda lewati secara opsional:

  • @skipchecks- input yang dapat diterima adalah 'True'atau 'False'jika 'True', SQL Server akan memperbarui statistik sebelum melepaskan. Jika ' False', tidak akan. Jika Anda tidak menentukan apa pun di sini, statistik akan diperbarui di SQL Server 2005 atau yang lebih baru.
    • @keepfulltextindexfile- Default di sini adalah 'True'- jika ini disetel ke true, metadata indeks teks lengkap tidak akan dijatuhkan selama detach.

Untuk melihat lebih banyak tentang detach dan beberapa rincian lebih lanjut tentang risiko saya menyoroti bawah ini, artikel Buku Online untuk sp_detach_dbadalah tempat yang baik untuk memulai.

Bagaimana Saya Melampirkan Database?

Anda juga dapat melakukan ini dalam T-SQL atau dari SQL Server Management Studio GUI.

( CATATAN: Jika Anda memiliki data dan file log dari database yang tidak dilepaskan dengan benar, lampiran Anda mungkin tidak berfungsi. Ketika lepas, database dibawa offline dan file log dan data dimasukkan ke dalam kondisi yang konsisten. Ini juga terjadi ketika suatu layanan dimatikan dengan bersih. )

Di GUI, Anda klik kanan pada Databasesfolder tingkat atas untuk instance Anda dan pilih Attach. Pada dialog berikutnya Anda kemudian akan memilih file data primer (.MDF) dari database yang ingin Anda lampirkan dan memastikan Anda memiliki file lain yang dipilih dan lokasi yang sesuai ditentukan, dan klik OK, melampirkan database Anda.

Dalam T-SQL cara terbaik untuk melakukan ini di SQL Server 2005 dan meneruskan adalah melalui CREATE DATABASEperintah. Ini adalah metode yang didukung di luar SQL Server 2012. Jika Anda ingin melihat cara menggunakan sp_attach_db, Anda dapat melihat bahwa di buku-buku artikel online untuk [sp_attach_db][3]atau[sp_attach_single_file_db][4]

Ketika Anda memiliki file log dan file data yang tersedia dan konsisten, ini adalah pendekatan T-SQL:

- Menggunakan Create Database dan klausa FOR ATTACH untuk dilampirkan

CREATE DATABASE DatabaseName 
    ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
    (FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
     (FILENAME = 'FilePath\SecondaryDataFile.ndf)  -- Optional - any secondary data files
    FOR ATTACH 
GO 

Anda dapat melihat lebih banyak tentang pernyataan Create Database di buku online juga.

Bagaimana cara melepaskan / melampirkan di SQL Server Express?

Sebenarnya sama saja. Jika Anda menggunakan SQL Server Management Studio Express Anda dapat menggunakan dialog detach / attach di GUI yang dijelaskan di atas atau langkah-langkah T-SQL melalui SSMS Express yang dijelaskan di atas juga. Tidak ada perbedaan dengan Express di sana.

Jika Anda tidak memiliki SSMS Express, Anda dapat mengunduhnya ( Berikut adalah versi SQL Server 2012 Express).

Anda bisa masuk ke SQLCMDsesi dan menggunakan konstruksi T-SQL yang sama seperti dijelaskan di atas.

Kapan Saya Harus Pertimbangkan Melakukan Melepaskan atau Melampirkan?

Pertama, kata tentang apa yang dilepaskan dan dilampirkan tidak dimaksudkan untuk digunakan: Pencadangan dan Pemulihan Melepaskan dan Melampirkan bukanlah cara untuk membuat cadangan basis data Anda untuk tujuan pemulihan rutin. Tidak ada pencadangan log transaksi dengan cara ini, ini membuat basis data Anda dalam keadaan di mana file basis data dapat dihapus secara tidak sengaja dan sama sekali bukan cara yang baik untuk tujuan ini.

Karena itu, lepaskan dan lampirkan baik untuk beberapa kasus penggunaan (tidak lengkap, jangan ragu untuk mengedit untuk menambah atau membuat jawaban baru dengan lebih banyak):

  • Kadang-kadang untuk migrasi (walaupun saya lebih suka backup / restore untuk yang seperti dibahas dalam jawaban saya di sini )
  • Ketika Anda ingin menghapus database yang tidak lagi digunakan secara aktif tetapi memiliki kemampuan untuk melampirkan nanti sesuai kebutuhan.
  • Dalam situasi pemecahan masalah tertentu, ini dapat dipanggil
  • Tidak memiliki ruang untuk mencadangkan atau mengembalikan data dan file log ke lingkungan lain (Anda seharusnya tidak pernah berada di sini tetapi saya telah menggunakannya untuk memindahkan basis data dev di sekitar lingkungan di kali .. Tidak mau atau tidak perlu log begitu juga melampirkan / membangun kembali file log)

Risiko dan Peringatan

Sekali lagi, buku-buku online adalah sumber yang bagus di sini , tetapi saya akan memanggil beberapa pertimbangan khusus untuk dipikirkan dengan memisahkan atau melampirkan database -

Melepaskan

  • Anda menjadikan database Anda offline. Itu tidak dapat diakses lagi. Ini harus jelas, tetapi layak disebut. Inilah sebabnya mengapa itu bukan opsi cadangan yang bagus.
  • Ketika database Anda online, SQL Server mengunci file. Saya tidak akan merekomendasikan mencoba ini untuk membuktikan saya salah, karena mungkin ada beberapa situasi lain yang sedang dimainkan, tetapi Anda biasanya tidak dapat menghapus file database (data, data sekunder atau file log) ketika SQL Server sedang online. Ini hal yang baik. Ketika Anda melepaskan, Anda tidak memiliki perlindungan seperti itu - ini bisa menjadi hal yang buruk.
  • Jika Anda berurusan dengan korupsi basis data dan Anda menemukan beberapa artikel di suatu tempat yang memiliki langkah pertama Lepaskan - itu salah - jika Anda melepaskan basis data yang rusak, mungkin itu. Anda mungkin tidak melampirkan basis data itu lagi.
  • Memotong dan menempel file database produksi Anda di seluruh jaringan Anda adalah cara untuk berpotensi memperkenalkan tingkat korupsi file .. Alasan lain saya lebih suka backup / restore ketika melakukan migrasi.
  • Mungkin menyebabkan rencana pemeliharaan gagal. Situasinya adalah bahwa Anda telah, seperti yang saya lakukan, mengatur rencana pemeliharaan untuk melakukan pencadangan rutin semua basis data tanpa memeriksa praktik terbaik. Ini berfungsi dengan baik sehingga Anda berhenti memikirkannya. Orang lain kemudian memutuskan untuk mengambil basis data yang tidak mereka gunakan offline. Rencana pemeliharaan akan gagal sejak saat itu hingga Anda memodifikasi rencana pemeliharaan dengan mencentang opsi "abaikan basis data yang keadaannya tidak online" dalam dialog "Basis Data". Perhatikan bahwa itu tidak akan gagal hanya untuk database offline - rencana pemeliharaan akan gagal dengan kesalahan pada titik ketika mencoba untuk membuat cadangan database offline sehingga beberapa database online mungkin tidak didukung. (penulis yang berbeda untuk poin ini jadi perlakukan dengan curiga)

Lampirkan - Sama seperti Anda tidak boleh menjalankan skrip dari internet atau menerima paket dari orang asing di bandara, Anda tidak boleh melampirkan database yang Anda dapatkan dari orang lain tanpa beberapa langkah untuk memverifikasinya. Basis data ini dapat memiliki kode di dalamnya dalam pemicu, prosedur tersimpan, dll. Yang dapat membahayakan lingkungan Anda. Anda harus meninjau database yang ingin Anda lampirkan di lingkungan yang aman, dan firewall, bukan sistem produksi Anda.

Bagaimana dengan Berbagai Versi atau Edisi SQL Server?

Ini tidak berbeda dari aturan di sekitar memulihkan database antara versi Anda biasanya dapat memulihkan hingga versi berikutnya untuk 3 versi (SQL Server 2008 ke SQL Server 2012, misalnya akan berfungsi. SQL Server 2000 ke SQL Server 2012 tidak akan). Anda tidak dapat mundur sama sekali melalui cadangan / pengembalian atau lepas / pasang - Anda harus membuat skrip objek dan skrip menyisipkan insert dan melakukannya secara manual atau dengan alat yang melakukan ini. Untuk edisi, Anda biasanya dapat berpindah di antara SKU utama SQL Server - misalnya Anda dapat memindahkan database dari Standar ke Perusahaan tanpa kerja ekstra. Jika Anda menggunakan fitur Enterprise (Say, kompresi atau partisi), Anda harus menonaktifkan fitur-fitur tersebut sebelum Anda pindah. Anda bisa mendapatkan gambaran tentang fitur yang Anda miliki.


@ Mike - apakah ada dampak kinerja dari memisahkan dan melampirkan basis data secara rutin? Saya membayangkan cache buffer tidak valid untuk setiap basis data yang terlepas (jelas), tetapi apakah Anda mengetahui adanya dampak lain?
Max Vernon

Saya memiliki DB di mana ketika saya menghentikan contoh SQL Server dan menyalin 3 file dan kemudian saya melampirkannya di contoh lain, DB masuk ke Pemulihan (terjadi pada saya dua kali pada DB yang sama). Dari uraian Anda, ini seharusnya tidak terjadi, jadi apa yang harus saya curigai tentang DB saya? Apakah itu dalam beberapa cara rusak? Cadangan membutuhkan waktu ribuan tahun untuk membuat dan memulihkan, dan fitur ini adalah penyelamat hidup! Setidaknya untuk tujuan berbagi pengembang DB ...
NoOne
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.