Menjaga Cadangan (Sebagian) Kecil saat menggunakan SQL Server FILESTREAM

12

Saya memiliki database dengan hampir 1TB FILESTREAMdata yang saya tidak perlu dicadangkan (jika data itu dihapus akan dibuat kembali secara otomatis dalam beberapa jam, jadi itu tidak penting). Sebagian besar data diubah setiap beberapa hari, jadi cadangan diferensial tidak akan membantu memperkecil ukurannya.

Saya memiliki cadangan yang bekerja dengan cara yang saya butuhkan dengan mengatur Mode Pemulihan ke Full, membuat terpisah FILEGROUPuntuk FILESTREAM, kemudian mengambil cadangan hanya "Primer" FILEGROUP. Masalah yang disebabkan ini adalah file log (yang juga didukung) sekarang tidak perlu besar karena termasuk FILESTREAMdata.

SIMPLEMode Pemulihan menghilangkan kemampuan saya untuk melakukan backup dari FILEGROUPs tertentu , jadi saya tidak berpikir itu akan menjadi pilihan juga.

Pikiranku adalah hanya memindahkan FILESTREAMdata ke database terpisah, tapi sekarang aku kehilangan integritas referensial dan tentunya mewarisi sejumlah masalah lain juga.

Apakah ada cara untuk membuat cadangan parsial dalam Simplemode pemulihan (tanpa mengatur FILESTREAMtabel hanya untuk dibaca)? Jika tidak, apakah ada solusi waras lain untuk masalah saya?

David Murdoch
sumber

Jawaban:

3

Masalah yang disebabkan ini adalah file log (yang juga didukung) sekarang tidak perlu besar karena termasuk data FILESTREAM.

Saya tidak yakin apakah maksud Anda file log itu sendiri terlalu besar atau cadangan file log menjadi terlalu besar.

Jika yang pertama maka seberapa sering Anda mendukung log? Tergantung pada desain aplikasi Anda mungkin dapat mengurangi ukuran dengan membuat cadangan lebih sering (dan setiap 5 menit tidak terlalu sering). Namun jika Anda sudah melakukan itu dan itu masih menggelembung maka Anda mungkin kurang beruntung. Mengapa file log besar menjadi masalah lagi?

Jika yang terakhir - sepertinya Anda senang melanjutkan dengan model pemulihan sederhana dan tidak ada titik waktu mengembalikan jika membiarkan Anda memiliki cadangan lebih kecil; dalam hal ini tetap dalam mode penuh dan buang cadangan log Anda.

Cody Konior
sumber
Saya tidak menyadari cadangan log yang sering tidak biasa! "Mengapa file log besar menjadi masalah lagi?" pertanyaan sebenarnya membuat saya berpikir tentang itu dan saya tidak punya jawaban. Jadi, 100 untuk Anda!
David Murdoch
3

Solusi untuk database yang diatur ke mode pemulihan SIMPLE adalah memiliki data FILESTREAM dalam grup file hanya-baca (yang bukan pilihan ideal Anda), dan kemudian mencadangkan hanya grup file baca / tulis dengan DIFERENSIAL seperti ini:

BACKUP DATABASE [name] READ_WRITE_FILEGROUPS TO DISK = '' WITH DIFFERENTIAL, COMPRESSION;

Ini akan mendapatkan data apa pun yang telah berubah di setiap grup baca / tulis. Itu yang termudah, di luar kotak, bahwa Anda dapat membuat sebagian cadangan dapat dikelola tanpa mendapatkan data FILESTREAM. Namun hal itu akan mensyaratkan bahwa proses pemuatan untuk data yang disebutkan di atas perlu memodifikasi filegroup untuk dibaca / ditulis, memuat data tambahan, dan kemudian diatur untuk hanya membaca lagi. Tentu tidak ideal.

Stephen Falken
sumber
Ini akan menjadi sempurna jika sistem otomatis kami dirancang untuk menangani FILESTREAM yang terkadang SIAP. Sayangnya, refactoring semua layanan akan memakan waktu terlalu banyak, terutama karena kita hanya bisa melempar hard drive pada masalah sekarang. Terima kasih, maju, semua layanan baru akan dirancang dengan mempertimbangkan hal ini, dan rencana untuk memperbarui layanan lama dari waktu ke waktu berlaku. (Seandainya saya bisa memberi Anda hadiah setengah dari itu!
David Murdoch
2

Saya merasa kotor menyediakan ini sebagai opsi, tetapi jika Anda memilih untuk memisahkan data FILESTREAM ke dalam basis datanya sendiri, Anda dapat mempertahankan RI di antara tabel di dbs yang terpisah dengan cara memicu :

Pemicu -> Keterangan -> Batasan:
Pemicu hanya dibuat di database saat ini; Namun, pemicu dapat merujuk objek di luar database saat ini.

Harapkan masalah kinerja dan bagian kulit kepala Anda menjadi tidak berambut setelah menarik bulu-bulu kepala Anda dengan frustrasi, tetapi secara teoritis Anda bisa melakukan ini. Saya tidak merekomendasikan pendekatan ini pada tingkat apa pun, sebaliknya saya sangat menyarankan Anda meningkatkan frekuensi cadangan tlog Anda dan / atau beralih ke model pemulihan massal-log dan melihat berapa banyak ruang yang menyelamatkan Anda, TETAPI ini adalah solusi yang mungkin. Benar-benar Anda harus mempertimbangkan manfaat memisahkan data ini dan berurusan dengan desain database Frankenstein, tetapi itu adalah pilihan.

... Aku harus mandi sekarang ...

John Eisbrener
sumber
1

Saya tahu pertanyaan ini sudah dijawab, tetapi ada solusi lain yang dapat membantu orang lain. Baru-baru ini saya mengetahui dari blog Brent Ozar bahwa ada opsi untuk segera membuang cadangan log Anda:

BACKUP LOG MyDb TO DISK='NUL:'

Jadi, Anda dapat meninggalkan basis data dalam FullMode Pemulihan dan melakukan pencadangan filegroup. Ketika log transaksi Anda menjadi terlalu besar, maka cukup jalankan perintah log cadangan dan Anda selesai.

Jörg Weigel
sumber
Saya masih merekomendasikan agar pencadangan log berjalan sebagai pekerjaan yang dijadwalkan, untuk memastikan bahwa aktivitas yang tidak terduga tidak menaikkan ukuran file log secara tidak masuk akal.
RDFozz