Bisakah file database disalin saat database online?

9

Saya sedang bekerja menyiapkan salinan pengembangan database produksi di SQL Server 2008 R2 SP1. Basis data langsung semakin sedikit digunakan oleh dua pengembang untuk permintaan hanya baca saat ini, tetapi basis data baru juga akan melakukan pembaruan.

Karena database adalah 2.1TB dan membutuhkan total 3 hari untuk memulihkan dan memperbarui ke versi terbaru yang kami butuhkan untuk pengujian, rencana awal saya adalah membuat satu set file cadangan baru dan kemudian memulihkan dari file-file itu. Ini akan memungkinkan saya untuk membuat salinan pengembangan database pada mesin dan contoh SQL yang sama, tanpa harus membuat offline database saat ini.

Namun, untuk menghemat beberapa hari itu, saya berpikir mungkin ide yang bagus untuk menyalin file database fisik dan melampirkan salinan database yang baru. Sayangnya ketika saya mencoba untuk menyalin saya mendapatkan kesalahan mengacu pada kunci yang menempatkan SQL Server pada file-file itu.

Karena saya tidak bisa membuat database offline untuk apa pun selain mentransfer file log (saya bisa menyelesaikan ini sebelum orang-orang masuk di pagi hari), apakah ada cara saya bisa menyalin file database langsung tanpa menempatkan database ke status offline? Atau haruskah saya menunggu sampai orang pulang untuk melakukan itu?

Sean Long
sumber

Jawaban:

11

Mengapa perlu 3 hari untuk membuat cadangan / memulihkan basis data 2,1 TB? Jika itu semua tentang memindahkan cadangan, saya menduga menyalin file MDF / LDF sebenarnya akan lebih lambat karena setidaknya cadangan dapat dikompresi. Dan jika ini hanya tentang memulihkan, maka menulis salinan file tidak boleh ada yang lebih cepat dari proses pemulihan itu sendiri - pastikan Anda memiliki inisialisasi file instan diaktifkan . Atau dapatkan I / O lebih cepat pada sistem sekunder.

Bagaimanapun, tidak, Anda tidak dapat menyalin file MDF / LDF saat database sedang online, Anda harus membuatnya offline untuk melakukannya. Dan ini adalah cara paling aman TERAKHIR mutlak untuk menyalin database. Jika ada sesuatu yang terjadi pada file saat terlepas / offline, Anda sekarang memiliki nol salinan database Anda.

Saya akan menyarankan mencari cara untuk membuat cadangan / pengembalian lebih cepat - apakah itu memastikan Anda mengompresi cadangan Anda dan mentransfer file dengan cara terbaik, menggunakan subsistem I / O terbaik yang tersedia, semakin baik I / O, membuat yakin bahwa IFI diaktifkan, dll.

Pilihan lain untuk dipertimbangkan adalah pengiriman round robin log - dengan asumsi produksi dalam pemulihan penuh dan Anda mengambil cadangan log reguler, Anda dapat melakukan pengiriman log ke satu database sementara pengembang bekerja pada yang lain, dan ketika Anda sampai pada titik stabil, pulihkan dengan pemulihan dan minta pengembang untuk beralih, membawa perubahan terbaru mereka. Sekarang inisialisasi ulang pengiriman log pada salinan yang baru saja mereka hentikan, dan akan siap untuk mereka pada cut-over "stabil" berikutnya, tanpa menunggu.

Aaron Bertrand
sumber
Pencadangan akan memakan waktu berjam-jam yang tidak diketahui (saya tidak membuat cadangan asli). Pemulihan membutuhkan waktu 10 jam, kemudian menjalankan pembaruan untuk mendapatkannya hingga pembangunan kami membutuhkan waktu 8 jam lagi. Jadi sungguh, jika kita berbicara tentang 24 jam sehari, hanya butuh 18 jam. Berbicara sekitar 8 jam sehari, itu pada dasarnya 3 hari (menambah waktu untuk menyalin file). Ada BENAR-BENAR cara saya bisa mengatur proses backup / restore itu sendiri, dan itulah yang akan saya lakukan sekarang karena saya tahu itulah cara yang ingin saya tuju.
Sean Long
0

Tidak, Anda harus membuatnya offline untuk menyalin file. Jika database Anda dibagi menjadi file / filegroup yang lebih kecil, ini bisa membantu dalam membuat pemulihan cadangan lebih cepat setelah Anda melakukannya sekali (tergantung pada data apa yang berubah dan data apa yang diperlukan untuk salinan pengembangan).

Tanner Corbin
sumber
0

Saya telah melihat jawaban lain dan mereka masuk akal. Namun, hanya untuk menjawab pertanyaan Anda, Anda tentu dapat menyalin file basis data tanpa menjadikan DB offline. Anda harus menggunakan pemrograman SMO untuk tujuan ini. Lihat ini: http://technet.microsoft.com/en-us/library/ms162175(v=sql.100).aspx

Harap dicatat bahwa tautan yang disediakan adalah untuk objek pemrograman SMO umum dan bukan jawaban spesifik untuk pertanyaan ini. Saya belum melakukannya tetapi saya akan segera mencoba ini dan akan membiarkan semua orang tahu (jika saya ingat), apa yang saya temukan.

Mandar Shindagi
sumber
-1

Bisakah file database disalin saat database online?

Iya.

Yang harus Anda lakukan adalah mengatur basis data menjadi read-only:

  1. Lari:

    USE [master]
    GO
    ALTER DATABASE [Database] SET READ_ONLY WITH NO_WAIT
    GO
  2. Salin file database - MDF, LDF, dll ke tujuan baru mereka

  3. Setelah penyalinan selesai, Anda dapat melepaskan dan melampirkan kembali lokasi baru. Pastikan untuk mengatur ulang opsi hanya-baca dan Anda menggunakan akun pengguna yang sama saat memanipulasi file-file ini. Juga, Anda mungkin ingin menghapus file lama setelah pindah.

Metode lain

Setelah file berhasil disalin (langkah 2 di atas):

Anda dapat mengatur basis data ke: Single_Usermode lalu:

  1. Lari:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Single_USER WITH NO_WAIT
    GO
  2. D:\ menjadi lokasi baru

    ALTER DATABASE Database MODIFY FILE
    (NAME = DATABASE, FILENAME = 'D:\DATABASE.mdf')
    GO
    ALTER DATABASE OHDSI MODIFY FILE
    (NAME = DATABASE_LOG, FILENAME = 'D:\DATABASE_LOG.ldf')
    GO
  3. Pastikan file data di lokasi baru ( D:\) memiliki akses penuh ke akun layanan yang menjalankan SQL Server.

  4. Mulai ulang layanan SQL

  5. Lari:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Multi_USER WITH NO_WAIT
    GO

Selesai!

RAVicioso
sumber
Catatan pertama bahwa menempatkan DB dalam mode read-only menyebabkan pemadaman yang efektif jika penggunaan normal memerlukan penulisan ke database. Kedua, saya berharap SQL Server masih memiliki file yang terkunci untuk digunakan jika sedang dibaca; jika pengalaman pribadi Anda atau dokumentasi MS mengatakan sebaliknya, harap edit itu ke dalam jawaban Anda. Ketiga, saran yang biasanya saya lihat untuk mengubah lokasi file adalah untuk mengambil DB offline , tidak hanya ke mode pengguna tunggal .. Sekali lagi, jika Anda punya pengalaman pribadi atau dokumen MS menyarankan sebaliknya, silakan edit ke dalam jawaban. Terima kasih!
RDFozz
Itu benar! Read-Only akan mencegah pengguna dari menulis tetapi mereka akan dapat membaca. Pada poin kedua Anda - ya Anda bisa membuat database offline - tetapi pertanyaannya adalah saat online. Proses yang saya jelaskan di atas berfungsi dengan downtime minimal. Terima kasih.
RAVicioso
@RAVicioso basis data yang sedang dibaca hanya merupakan pemadaman juga. Jika Anda tidak dapat menulis data baru (mis. Menerima pesanan), sistem Anda secara efektif mati. Ini sepertinya ide yang buruk, bukan?
Erik Darling
@sp_BlitzErik - Solusinya berfungsi, tetapi Anda tidak akan bisa menulis selama jenis pemeliharaan ini. Dalam contoh Anda: "menerima pesanan", itu tidak akan.
RAVicioso