Kecilkan Log Transaksi Saat Menggunakan Grup Ketersediaan AlwaysOn

17

Kami menggunakan AlwaysOn Availability Groupfitur SQL Server 2012. Pencadangan basis data lengkap reguler dan pencadangan log transaksi dilakukan setiap hari di basis data sekunder.

Saya telah membaca di sini melakukan pencadangan log transaksi baik pada replika primer atau replika sekunder akan menandai log transaksi kedua replika sebagai dapat digunakan kembali. Lagi pula, ukuran cadangan log transaksi besar dan dapat dikurangi menggunakan shrink file:

masukkan deskripsi gambar di sini

Saya telah memulihkan database secara lokal dan melakukan operasi menyusut. Ukuran file log dikurangi hingga 160 MB.

Pertanyaan saya adalah pada basis data mana saya harus melakukan operasi penyusutan atas file log transaksi (primer, sekunder atau keduanya)?


Saya kira di masa lalu selama beberapa tahun tidak ada cadangan file log dibuat, jadi itu menjadi sangat besar. Mengeksekusi DBCC SQLPERF (LOGSPACE)Saya dapat melihat bahwa hanya 0.06%file yang digunakan - tidak ada gunanya bagi saya untuk menyimpan file log dengan ukuran sangat besar. Dalam [sys].[database_files]saya cek bahwa yang max_sizediatur untuk -1dengan growthuntuk 65536jadi saya kira ketika membutuhkan lebih banyak ruang yang akan mendapatkan. Lagi pula, saya bisa mengecilkannya menjadi 5% misalnya untuk mencegah pertumbuhan di masa depan. Saya mencoba mencari konfirmasi bahwa saya bukan ide yang buruk untuk melakukannya.


Sebenarnya, back up (pada database dan file log) dilakukan hanya pada database sekunder, sehingga akan lebih mudah untuk melakukan menyusut file pada mereka, tetapi apakah ukuran file log primer akan berkurang juga?

Gotqn
sumber

Jawaban:

21

Dalam AG menulis hanya dapat terjadi pada primer. Operasi susut ditulis. Karena itu Anda harus melakukan penyusutan pada yang utama. Perhatikan bahwa penyusutan mungkin tidak menyusut sebanyak yang Anda harapkan, pengujian Anda pada DB yang dipulihkan mungkin telah meningkatkan model pemulihan sederhana. Baca Cara mengecilkan log SQL Server untuk info lebih lanjut.

Jangan menyusut hingga 160MB. Tentukan mengapa log tumbuh ke 121Gb sehingga tidak mengulangi (Anda memiliki kecurigaan, akan lebih baik untuk mengonfirmasi jika mungkin). Ukur log ke ukuran yang sesuai dengan kebutuhan operasional Anda. Pertumbuhan log adalah masalah serius, tidak dapat menggunakan inisialisasi file instan dan semua aktivitas basis data Anda akan membeku saat log tumbuh dan sedang diinisialisasi-0. Pengguna dan aplikasi membencinya saat itu terjadi. Jika Anda memahami dampaknya dan pengguna Anda OK, Anda dapat menyusutkan sekali ke jumlah kecil (160MB mungkin terlalu kecil) dan membiarkannya tumbuh sampai stabil.

Remus Rusanu
sumber
7

Anda dapat mencoba:

  1. Basis data pada semua server di Grup Ketersediaan harus dalam kondisi Sinkronisasi.
  2. Pindahkan halaman yang digunakan untuk memulai log transaksi, sebelum Anda mengecilkannya.
  3. Kadang-kadang ruang kosong yang tersedia adalah 99%, tetapi SQL Server tidak dapat melepaskan ruang yang tidak digunakan. Cobalah untuk me-reboot setiap server di kelompok ketersediaan pada gilirannya.
  4. Kadang-kadang Anda perlu bakup dan mengecilkan log transaksi 2 kali sebelum MS SQL Server merilis ruang kosong (Tidak dapat mengecilkan file log (DB_Log) karena file log logis yang terletak di akhir file sedang digunakan.).

Coba skrip ini:

    --Mengatur basis data saat ini di dalam langkah kerja atau skrip
    --Periksa untuk Menjalankan Hanya Primer
    if (peran PILIH
        DARI sys.dm_hadr_avilities_replica_states AS a
        GABUNG sys.available_replicas AS b
            ON b.replica_id = a.replica_id
    WHERE b.replica_server_name = @@ SERVERNAME) = 1
    MULAI
        - Gunakan [test_db] - Tidak berfungsi untuk MS SQL 2014, cukup komentari baris ini dan setel basis data saat ini di dalam langkah atau skrip pekerjaan
        - 1) Bakup Trn
        LOG CADANGAN [test_db] TO DISK = N'D: \ MSSQL \ Backup \ test_db.trn 'DENGAN NOFORMAT, INIT, NAME = N' Trn Backup ', SKIP, NOREWIND, NOUNLOAD, KOMPRESI, STATS = 10
        - 2) Memindahkan halaman yang digunakan
        DBCC SHRINKFILE (N'test_db_log ', 3000, NOTRUNCATE)
        - 3) Log SHRINKFILE
        DBCC SHRINKFILE (N'test_db_log ', 3000)
    AKHIR
Denis P.
sumber