Basis data selalu dimulai dalam mode pemulihan

11

Setiap kali saya me-restart server saya, database selalu dalam mode pemulihan, dan dibutuhkan sekitar 20 menit untuk berperilaku seperti biasa. Ini selalu dan hanya terjadi ketika saya me-restart server, jadi saya punya beberapa pertanyaan ...

  1. Saya diberitahu ini bisa disebabkan oleh file log yang besar? Mungkinkah itu benar? Jika tidak, apa penyebab lainnya?
  2. Saya perlu menurunkan ruang file log untuk mencegah pemulihan. Apa yang lebih baik: menyusut atau memotong?
  3. Bagaimana saya bisa mengecilkan atau memotong file log / database untuk menurunkan ukuran? Apa itu sintaks?

Saat ini saya menggunakan Microsoft SQL Server 2008.


sumber
Apakah Anda cenderung memiliki transaksi besar dalam penerbangan saat Anda tutup? Untuk apa interval pemulihan diatur?
Martin Smith
tidak ada tindakan yang dilakukan 20 menit sebelum server restart, selain pernyataan pilih, interval ditetapkan pada 0.
Seberapa sering Anda memulai? Seberapa sering Anda membuat cadangan database? Saya bertanya-tanya mengapa Anda memulai server secara teratur? Agar lengkap, Anda dapat memeriksa secara manual basis data (yang menghapus log) jika perlu.
Lynn Langit
"Supaya lengkap, Anda bisa secara manual memeriksa pos database (yang menghapus log) jika perlu." bagaimana itu bisa dilakukan? dan ketika Anda mengatakan menghapus log, maksud Anda, tidak menggunakan atau hanya menghapus log?
Tidak cukup informasi. Model pemulihan? Apakah Anda menggunakan fitur seperti mirroring atau replikasi? Ukuran basis data dan file yang terlibat? Apakah database menangani setiap transaksi besar?
Jon Seigel

Jawaban:

6

Saya memiliki masalah yang sama dan saya yakin telah menyelesaikannya, tetapi saya belum dapat mengujinya sepenuhnya untuk mengonfirmasi.

Saya percaya masalah ini terkait dengan jumlah VLF yang Anda miliki di file log Anda dan bukan ukurannya. Jika Anda memiliki logfile besar, kemungkinan ia tumbuh secara organik melalui peristiwa pertumbuhan otomatis dan itu bukan pertumbuhan yang direncanakan secara disengaja. Jika demikian, Anda mungkin memiliki ribuan VLF di dalam file log.

Berikut ini permintaan untuk melihat berapa banyak VLF yang Anda miliki yang saya gunakan dari sini :

    Create Table #stage(
    FileID      int
  , FileSize    bigint
  , StartOffset bigint
  , FSeqNo      bigint
  , [Status]    bigint
  , Parity      bigint
  , CreateLSN   numeric(38));

Create Table #results(
    Database_Name   sysname
  , VLF_count       int 
);

Exec sp_msforeachdb N'Use ?; 
            Insert Into #stage 
            Exec sp_executeSQL N''DBCC LogInfo(?)''; 

            Insert Into #results 
            Select DB_Name(), Count(*) 
            From #stage; 

            Truncate Table #stage;'

Select * 
From #results
Order By VLF_count Desc;

Drop Table #stage;
Drop Table #results;

Untuk penjelasan lebih lanjut tentang VLF apa yang melihat tautan ini .

Saya percaya masalahnya adalah bahwa dengan begitu banyak VLF dibutuhkan SQL server lama untuk menilai keadaan mereka dan kemudian membawa database keluar dari pemulihan. Jika Anda mengecilkan file log Anda ke ukuran terkecil yang Anda bisa, sering kali ukuran VLF pertama yang dibuat dalam file log, maka Anda dapat langsung dengan sengaja menumbuhkannya lagi dan dengan demikian membuatnya membuat jumlah VLF yang tepat (sesuatu yang kurang dari 16).

Setelah ini selesai saya yakin Anda akan dapat melihat bahwa database Anda keluar dari pemulihan lebih cepat.

Saya belum memiliki kesempatan untuk menguji kegagalan atas contoh produksi kami setelah saya menyelesaikan masalah VLF kami sendiri sehingga saya akan sangat ingin tahu jika Anda dapat mengonfirmasi ini adalah penyebab utama masalah ini. Secara eksperimental saya telah melihat waktu yang diperlukan untuk memulihkan lingkungan pementasan kami berkurang secara dramatis karena ini, semoga saja begitu.

Chris Magnuson
sumber
2

Dari artikel MSDN ini :

Transaksi tanpa komitmen yang berjalan lama meningkatkan waktu pemulihan untuk semua jenis pos pemeriksaan.

Biasanya tidak disarankan untuk menjalankan jenis DBCC shrinkfile apa pun pada basis data produksi. Log juga perilaku pemotongan telah berubah dari versi sebelumnya ke 2008 (terima kasih @Edward) - per blog ini :

Log cadangan dengan trucate_only tidak lagi didukung dalam SQL 2008. Jika database Anda dalam model log-massal atau pemulihan penuh, jadwalkan pencadangan T-Log pada interval reguler dan itu akan membuat t-log Anda tetap dalam bentuk.

Sekali lagi, saya akan menyebutkan, seberapa sering Anda membuat cadangan database? Biasanya, cadangan biasa "kelola" ukuran log terbaik.

Lynn Langit
sumber
0

Mengurangi ukuran log transaksi online dapat memperbaiki masalah, yaitu mempercepat database menjadi online, tetapi Anda harus berpikir tentang pemulihan bencana sebelum Anda melakukannya. Perhatikan bahwa jika Anda berada dalam model pemulihan sederhana, Anda tidak akan dapat mengembalikan ke titik waktu. Di sisi lain, jika Anda berada dalam model pemulihan LENGKAP, cara terbaik untuk menjaga ukuran log transaksi online adalah dengan membuat cadangan log transaksi secara reguler (jadwalkan).

Memotong log transaksi tidak membebaskan ruang hard disk fisik, itu hanya memungkinkan SQL Server untuk menggunakan kembali ruang itu untuk transaksi yang telah terjadi sejak CHEKPOINT terakhir (sejak cadangan log transaksi terakhir).

Jika Anda mengecilkan basis data, Anda akan mengurangi ukuran file. Untuk mengecilkan basis data MyDB sebesar 15 persen:

DBCC SHRINKDATABASE (MyDB, 15); PERGILAH

Carol Baker Barat
sumber