Bagaimana cara mengembalikan database SQL Server dan mengecilkan file pada saat yang sama?

9

Katakanlah saya memiliki database SQL Server yang file datanya telah dibuat dengan ukuran awal 100 GB, tetapi hanya berisi 10 GB data. Cadangan basis data kemudian hanya berukuran 10 GB.

Saya ingin mengembalikan cadangan ini ke server yang berbeda (atau database yang berbeda di server yang sama), tetapi saya tidak ingin mengembalikan ruang disk yang sama dengan yang asli (100 GB), yang merupakan apa yang terjadi secara default.

Saya tidak dapat mengecilkan basis data asli sebelum mengambil cadangan (ini adalah basis data produksi, dan membutuhkan banyak ruang yang dialokasikan sebelumnya); Saya bisa mengecilkan database yang dipulihkan setelah pemulihan selesai, tetapi saya benar-benar lebih suka memilikinya tidak memakan waktu 100 GB saat melakukan itu; selain itu, dalam skenario khusus ini saya tidak memiliki banyak ruang disk kosong, sehingga pemulihan tidak ke mana-mana.

Apakah ada cara saya dapat mengembalikan database dan hanya mengambil ruang sebanyak data aktual yang dikandungnya ?

Massimo
sumber
Saya punya masalah serupa. Ruang DB asli yang diambil pada disk adalah ~ 30GB (dengan sekitar 1,5GB data nyata) dan saya ingin mengembalikannya di server MSSQL Express lokal saya. Masalah yang jelas adalah bahwa server lokal saya hanya memperbolehkan maks. 10GB, karena ini adalah edisi gratis. Jadi, saya bisa melakukannya, jika saya dapat mengecilkan file sebelum mencoba mengembalikan DB, tapi ...
userfuser

Jawaban:

6

Tidak, maaf - tidak mungkin. Pulihkan mengembalikan file saat berada di cadangan. Schinking harus dilakukan setelah itu atau sebelum mengambil cadangan.

TomTom
sumber
2

Jika ruang hard disk Anda terbatas maka Anda dapat meletakkan file .bak di jaringan berbagi & mengembalikannya dari sana. Harus berfungsi jika server sql Anda berjalan dengan akun domain & berikan hak yang cukup bagi share untuk membaca file.

Opsi lain yang sebelumnya di dalam Anda adalah keranjang kacang (tetapi hanya berguna jika Anda menjalankan sql server 2008 r2) adalah bahwa SQL Server mendukung pembuatan file database langsung ke share tanpa harus menggunakan traceflag & saya dapat memberitahu dari pengalaman pribadi Anda itu berhasil! Jadi, Anda dapat melakukan restore WITH MOVE ke share.

Nick Kavadias
sumber
1

Secara umum, tidak. Beberapa ide acak yang mungkin atau mungkin tidak membantu Anda:

  • Kecuali jika Anda benar-benar membutuhkan data dari cadangan spesifik itu , maka Anda dapat membuat database baru (kosong) dari ukuran target, dan menggunakan salinan Massal (atau SSIS) untuk mendorong semua tabel dari database saat ini (langsung) ke dalam salinan Anda.
  • Ada alat pihak ke-3 (Redgate Compare, misalnya) yang dapat membantu mengotomatiskan hal semacam ini, jika ini lebih dari satu kali operasi.
  • Beberapa perangkat lunak cadangan pihak ketiga (Quest Litespeed, misalnya) memiliki kemampuan untuk melakukan " pemulihan tingkat objek ", yang dapat mengembalikan tabel individual atau objek lainnya ke database baru (kosong). Bahkan jika cadangan tidak dibuat menggunakan Litespeed, saya percaya produk tersebut harus bekerja pada cadangan SQL asli.

Akhirnya, saya suka beberapa "ruang siku" di database produksi saya juga, tetapi 90GB bebas dari total 100GB terdengar agak ekstrem. Langkah-langkah berikut mungkin memberi Anda apa yang Anda butuhkan dan tidak boleh memengaruhi produksi:

  1. Jalankan DBCC SHRINKFILE ('myfile.MDF', TRUNCATEONLY)pada file data produksi untuk sementara waktu melepaskan ruang kosong di akhir file (TRUNCATEONLY bukan IO intensif, dan tidak akan memecah indeks)
  2. Jika file log juga besar, jalankan DBCC SHRINKFILEfile log produksi pada saat aktivitas rendah, tepat setelah mengambil cadangan log.
  3. Jalankan cadangan Anda
  4. Lakukan ALTER DATABASE MODIFY FILEuntuk menumbuhkan kembali file data produksi ke ukuran semula.

Seharusnya tidak ada dampak produksi menggunakan langkah-langkah ini. Satu-satunya risiko adalah jika beberapa data kebetulan berada di bagian paling akhir dari file data 100GB, dalam hal ini Langkah (1) tidak akan merilis banyak jika ada ruang.

BradC
sumber
Terima kasih, saya sudah tahu tentang ini dan mencoba menyusun beberapa solusi. Saya tidak bisa menyentuh basis data asli, hanya cadangan yang tersedia ... dan sudah dikonfigurasi seperti itu.
Massimo