Ukuran log virtual SQL Server

8

Saya agak tidak sengaja DBA, menjadi pengembang yang mewarisi beberapa server basis data (2005 dan 2008) dari seseorang yang tidak banyak tahu tentang administrasi basis data, dan tampaknya memiliki minat yang lebih kecil untuk mempelajari lebih banyak tentang masalah ini.

Saya sedang belajar saat ini, dan saat ini saya mencoba mencari tahu file log transaksi.

Semua basis data kami telah diatur dengan model pemulihan sederhana dan autoshrink. Saya mengerti bahwa menggunakan autoshrink biasanya merupakan ide yang mengerikan, tetapi pemahaman saya ini dilakukan untuk menghentikan transaksi log dari tumbuh di luar kendali. (Apakah autoshrink sebenarnya mengecilkan file log atau hanya DB?)

Saya menemukan ini tentang SQL Server 2012, dan bertanya-tanya apakah itu benar tentang 2005 dan / atau 2008, dan apa artinya: "Ketika database menggunakan model pemulihan sederhana, Mesin Database memotong log transaksi setelah pos pemeriksaan. [. ..] Mesin Database memicu pos pemeriksaan otomatis di bawah model pemulihan sederhana ketika log virtual menjadi 70 persen penuh. " Di mana ukuran log virtual ditentukan?

Saya ingin menonaktifkan menyusut otomatis pada semua database, tetapi sebelum saya melakukannya, saya perlu tahu bahwa file log tidak akan tumbuh di luar kendali dengan cepat.

Bantuan apa pun akan sangat dihargai.

Petter Brodin
sumber
1
Baca rusanu.com/2012/07/27/how-to-shrink-the-sql-server-log ini dan lihat apakah ini menjelaskan apa yang terjadi.
Remus Rusanu

Jawaban:

6

File log transaksi tunggal memiliki ukuran fisik (yang Anda lihat pada disk), dan juga dipecah dalam file fisik menjadi bagian logis yang disebut file log virtual (VLF).

Auto-growth dan auto-shrink beroperasi pada file log transaksi fisik .

Pemotongan log transaksi (juga disebut "pembersihan log") beroperasi pada bagian logis dari log transaksi (VLF), dan tidak mempengaruhi ukuran file fisik. Bagian ini sering menjadi subjek kebingungan.

File log harus selalu tumbuh untuk mengakomodasi transaksi besar; mematikan menyusut otomatis akan meninggalkan file log dengan ukuran maksimum yang diperlukan, alih-alih secara fisik mengurangi ukurannya.

Jika Anda tidak memiliki transaksi besar, aman untuk menonaktifkan menyusut otomatis; file log tidak akan tumbuh tanpa terikat seperti yang akan terjadi jika database berada di FULLatau BULK_LOGGEDdan Anda tidak mengambil backup log transaksi.

Perilaku ini sama untuk SQL Server 2005+.

Jon Seigel
sumber
Terima kasih, itulah yang saya cari ketika saya mengajukan pertanyaan. Saya sampai pada kesimpulan yang sama setelah membaca jawaban Remus sebelumnya.
Petter Brodin
2

Jadi, inilah yang saya temukan setelah membaca balasan lain di sini dan melakukan riset sendiri:

T: "Apakah autoshrink sebenarnya mengecilkan file log atau hanya DB?" A: Dari apa yang saya mengerti: ya, itu benar. Autoshrink diatur pada level database, dan memengaruhi semua file (terlihat jika Anda mengklik kanan database -> properties -> file, atau jika Anda menjalankan query 1). Autogrow, bagaimanapun, bekerja pada tingkat file per.

T: "Di mana ukuran log virtual ditentukan?" A: Lihat balasan Jon Seigel dan tautan yang diposting Remus. Untuk melihat ukuran log fisik dan logis, gunakan kueri 2

Satu masalah adalah bahwa jika database telah mengaktifkan mode pemulihan penuh, tumbuh ke ukuran besar, dan kemudian mode pemulihan diubah menjadi sederhana, sebuah pos pemeriksaan tidak akan dipicu karena VLF telah di-autogrown. Dimungkinkan untuk mencoba menyelesaikan ini (lihat balasan Remus untuk kemungkinan masalah dengan kepala / ekor file log) dengan menjalankan kueri 3, yang akan mengurangi logfile ke ukuran seperti saat awalnya dibuat.

Pertanyaan:

1)

SELECT name, physical_name AS current_file_location, DB_NAME(database_id) AS dbname
FROM sys.master_files
WHERE DB_NAME(database_id) = 'mydb'

2)

DECLARE @tmpt TABLE(
    dbname VARCHAR(255),
    logsize DECIMAL,
    logspaceused DECIMAL,
    stat INT
)

INSERT INTO @tmpt
    EXEC ('DBCC SQLPERF(LOGSPACE)')

SELECT * FROM @tmpt WHERE dbname LIKE 'mydb' ORDER BY logspaceused DESC

3)

checkpoint
DBCC SHRINKFILE('logfile_name')
Petter Brodin
sumber
2

Seperti yang Anda sebutkan dalam pertanyaan Anda, di SQL 2005 dan 2008 setelah pos pemeriksaan, file log transaksi akan terpotong juga.

Saran saya adalah mengatur model pemulihan menjadi penuh dan menciptakan pekerjaan untuk mengambil cadangan dari file log transaksi. Pekerjaan ini dapat dijadwalkan pada database Anda dan akan memotong log transaksi setelah mengambil cadangan. Secara otomatis akan memotong file log untuk Anda. Silakan lihat tautan di bawah ini:

SQL Server 2005: http://technet.microsoft.com/en-us/library/ms189085(v=sql.90).aspx

SQL Server 2008: http://technet.microsoft.com/en-us/library/ms189085(v=sql.100).aspx

Langit
sumber
Ya, itu rencanaku dalam jangka panjang, tetapi untuk sekarang aku hanya ingin menyingkirkan autoshrink.
Petter Brodin
Perubahan adalah Anda ingin mengubahnya menjadi pemulihan LENGKAP tetapi sebelum Anda mengevaluasi apakah itu benar-benar diperlukan atau tidak. Jika Anda perlu mengembalikan ke sedekat mungkin dengan bencana maka Anda lakukan. Jika kembali ke cadangan penuh terakhir (biasanya setiap malam) baik-baik saja maka mode pemulihan SEDERHANA akan bekerja dengan baik untuk Anda.
cfradenburg