Secara manual mengatur ukuran file log setelah menyusut SQL Server 2008 R2

10

Saya menjadi DBA yang agak tidak disengaja bekerja di sana dan benar-benar membutuhkan bantuan pada sesuatu.

Kami memiliki basis data 40GB dalam Mode Pemulihan Penuh, tidak ada cadangan log yang dikonfigurasi, dan file log besar berukuran 84GB. Sejauh ini rencana saya untuk menyelamatkan situasi ini adalah dengan menjalankan pencadangan log lengkap pada basis data, mengecilkan file log, dan memulai rencana pemeliharaan untuk menjalankan pencadangan log setiap malam dengan cadangan basis data untuk membantu mengendalikannya.

Masalah saya adalah saya tidak ingin file log menyusut menjadi nol dan menghabiskan pagi pertama di hari Senin terus bertambah. Saya memiliki perkiraan kasar mengenai file apa yang seharusnya (sekitar 20% dari database) dan ingin mengatur ini sejak awal untuk memastikan ruang yang bersebelahan sebanyak mungkin. Apakah ini hanya kasus mengubah "Ukuran Awal" di bawah Properti database -> File? Saya menduga juga bahwa database harus offline agar ini terjadi?

Terima kasih sebelumnya

Tim Alexander
sumber
2
Anda berencana untuk membuat cadangan basis data sekali sehari, dan menjalankan pencadangan log sekali malam? Mungkin Anda harus mempertimbangkan model pemulihan sederhana sehingga log mengelola sendiri.
Aaron Bertrand
Aaron, saya setuju dengan Anda pada sudut pandang pemulihan DR tetapi untuk pemulihan operasional mereka mungkin masih menginginkannya penuh. Jangan lupa bahwa meskipun mereka hanya melakukan pencadangan log sekali sehari tetap memungkinkan pemulihan waktu.
Kenneth Fisher
1
@Kenneth jadi jika Anda melakukan pencadangan penuh di tengah malam, maka pencadangan log pada pukul 12:05, saya menemukan itu sangat palsu. YMMV.
Aaron Bertrand
@ Harun lagi, semua operasional tetapi kecuali saya salah Anda dapat menggunakan cadangan lengkap dari malam sebelumnya, dan log diambil pada 12:05 dan untuk pemulihan ke titik mana pun di hari sebelumnya. Juga jika mereka mengalami masalah itu bukan masalah besar untuk melakukan login kembali, memulihkan dari malam sebelumnya dan melakukan titik waktu untuk kembali ke beberapa menit yang lalu. Saya tidak mengatakan mereka harus membuatnya penuh, hanya mengatakan ada lebih banyak yang terlibat daripada sudut pandang DR. Yang dikatakan jika mereka tetap penuh mereka harus melakukan pencadangan log lebih sering dari sekali sehari.
Kenneth Fisher
2
@Kenneth tetapi jika Anda hanya mencadangkan log sekali sehari, inilah mengapa ini sangat besar! Jika Anda perlu memulihkan hingga pukul 12:07 pagi kemarin, Anda harus memuat seluruh log sepanjang hari untuk memulihkan 2 menit. Sangat tidak berguna.
Aaron Bertrand

Jawaban:

6

Kecilkan saja apa yang Anda pikirkan adalah ukuran optimal. Jangan gunakan UI, lakukan saja ini - katakanlah 200 MB adalah ukuran optimal Anda:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);

Jika Anda hanya tertarik untuk mengambil cadangan log sekali sehari, dan tidak tertarik pada pemulihan point-in-time, maka Anda harus beralih ke model pemulihan sederhana. Ini berarti cadangan log tidak perlu (sebenarnya tidak mungkin) tetapi isi log akan dikelola sendiri.

Jika Anda ingin backup log menjadi bermakna, jangan berencana untuk mengambil backup penuh di malam hari dan kemudian satu backup log setelahnya. Ini membuat Anda dalam model pemulihan penuh, membuat log bekerja sangat keras, dan tidak membelikan Anda apa pun. Jadi jika Anda ingin pemulihan point-in-time, jalankan backup log lebih sering pada tingkat yang memuaskan toleransi kehilangan data Anda. Jika Anda tidak ingin kehilangan lebih dari 15 menit data, jalankan pencadangan log setiap 15 menit.

Aaron Bertrand
sumber
Terima kasih untuk ini. Saya sepenuhnya memahami semua komentar tentang beralih ke model pemulihan sederhana. sayangnya ini adalah keputusan yang tidak bisa saya buat dan perlu dijalankan melalui beberapa level birokrasi. Ini tentunya sesuatu yang akan saya sarankan.
Tim Alexander
12

Manajemen file Anda dapat menjadi operasi yang sepenuhnya online. Anda memiliki dua jalur, tergantung pada kebutuhan Anda untuk menyimpan informasi log Anda untuk tujuan pemulihan:

Titik pemulihan waktu tidak diperlukan

  1. Konversikan basis data menjadi SIMPLEpemulihan. Jalankan pos pemeriksaan untuk menulis transaksi ke disk.
  2. Ratakan log.
  3. Ubah ukuran log ke ukuran yang sesuai.

Saya juga merekomendasikan pengaturan jumlah pertumbuhan tetap dan pertumbuhan tidak terbatas (untuk membantu mengelola log Anda dengan lebih baik). Catatan, jumlah pertumbuhan tetap sangat banyak dan itu tergantung jumlah, saya akan merekomendasikan pergi dengan 1-2 GB awalnya tergantung pada seberapa banyak pertumbuhan yang bisa dilihat oleh log. Idealnya, log Anda tidak akan tumbuh banyak, jadi ini seharusnya tidak banyak berdampak. Jika log Anda tumbuh secara teratur, Anda mungkin perlu mengunjungi kembali ukuran Anda.

Selesai menggunakan:

ALTER DATABASE [foo] 
SET RECOVERY SIMPLE;

CHECKPOINT;

DBCC SHRINKFILE (foo_log,0);

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [foo] 
SET RECOVERY FULL;

Diperlukan pemulihan waktu

Hangup terbesar adalah Anda tidak dapat mengecilkan file log Anda melewati segmen VLF yang saat ini aktif. Untuk melihat ini, Anda dapat menggunakan DBCC LOGINFOdalam konteks basis data. Segmen apa pun dengan Status = 2 aktif. Untuk menghapus segmen aktif, Anda harus menjalankan cadangan log transaksi saat tidak ada transaksi yang aktif di segmen itu. Langkah Anda adalah:

  1. Jalankan cadangan log transaksi.
  2. Kecilkan file Anda. (Idealnya rata, tetapi jika database Anda aktif, ini akan sulit dilakukan).
  3. Ulangi langkah 1 dan 2 hingga ukuran log Anda sesuai, idealnya sekecil mungkin.
  4. Ubah ukuran log ke ukuran yang sesuai.

Selesai menggunakan:

BACKUP LOG [foo] TO DISK='<Location of t-log backup>';

DBCC SHRINKFILE (foo_log,0);

--Repeat the above until your log file is small "enough"

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

Beberapa sumber tambahan untuk memahami apa yang terjadi di sini:

Mike Fal
sumber
2

Sebenarnya tidak, database tidak perlu offline untuk mengecilkan log. Dan saya akan mengatakan ini mungkin salah satu dari sedikit kasus di mana penyusutan log adalah ide yang bagus. Anda dapat mengatur ukuran awal, tetapi akan lebih mudah untuk melakukan menyusut dan menyuruhnya menyusut ke ukuran tertentu.

USE [DBName]
GO
DBCC SHRINKFILE (N'LogName' , SizeInMg)
GO

Anda juga dapat melakukannya dengan menggunakan GUI dan menggunakan tombol radio kedua dan kotak centang yang mengatakan seberapa besar Anda ingin log pada akhirnya. Anda bisa sampai ke GUI dengan mengklik kanan database di objek explorer di SSMS, memilih tugas, menyusut, file.

Kenneth Fisher
sumber
2

Sebagai pelengkap jawaban Aaron tentang mode sederhana , Anda dapat menjadwalkan 2 (atau lebih) cadangan diferensial per hari, dengan cara itu mengurangi jendela kehilangan data dari operasi basis data Anda sambil mempertahankan mode SIMPLE.

Fabricio Araujo
sumber