Bisakah saya mengecilkan file log transaksi pada basis data mirror?

9

Ini adalah pertanyaan lanjutan dari pertanyaan sebelumnya tentang mengapa saya tidak bisa mengecilkan file log pada basis data utama.

Singkatnya, saya membuat mirroring basis data tetapi lupa untuk memastikan pekerjaan yang mendukung log transaksi berjalan kembali, dan log transaksi tumbuh hampir 60GB.

Karena mirroring diatur, peningkatan ukuran ini diduplikasi pada server mirroring, dan akhirnya mengambil semua ruang disk dan membuat database mirror tidak dapat digunakan.

Per pertanyaan ini tentang pemeliharaan log transaksi pada basis data cermin, Anda tidak dapat mencadangkan log di cermin, tetapi ketika ditanya secara khusus dalam komentar tentang cara mengecilkan file log yang ditumbuhi berlebihan pada basis data cermin, ada komentar yang tersisa bahwa

Salah satu cara untuk melakukan ini adalah dengan failover ke mirrored database dan lakukan menyusut di sana. Ujilah dengan seksama dalam lingkungan non-produksi untuk memastikan ia memiliki perilaku yang Anda inginkan / harapkan.

Ini sepertinya menyarankan bahwa mungkin ada cara lain untuk mengecilkan file log pada mirror, dan metode ini mungkin tidak aman untuk dilakukan pada server produksi.

Apakah ada cara untuk mengecilkan file log transaksi dengan aman di mirror database?

Rachel
sumber
2
Satu-satunya cara yang didukung adalah mengecilkan file pada prinsipal yang juga akan mengecilkan file di cermin. Jika cermin Anda tidak lagi sama dengan kepala sekolah, Anda benar-benar tidak ingin mencoba untuk gagal ke cermin. Hancurkan mirroring, dan buat ulang, seperti yang Anda katakan di pertanyaan sebelumnya.
Max Vernon

Jawaban:

6

The DBCC SHRINKFILEperintah akan dicerminkan dari prinsipal ke database cermin. Ini beberapa buktinya.

Buat contoh database pada prinsipal:

create database MirroredDb;
go

Buat database yang sama dari cadangan dengan NORECOVERY:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

Siapkan sesi mirroring Anda namun ke arah mana Anda memilih.

Pada basis data utama, lihat ukuran file basis data:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Kumpulan hasil saya terlihat seperti ini:

name            size
MirroredDb      392
MirroredDb_log  104

Pada database cermin , buat snapshot dan lihat informasi yang sama:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

Kumpulan hasil saya terlihat seperti berikut:

name            size
MirroredDb      392
MirroredDb_log  104

Sekarang tumbuh file log transaksi pada basis data utama (saya membawanya ke 1 GB):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

Melihat ukuran log transaksi basis data utama , kita sekarang melihat ukuran yang disesuaikan:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Kumpulan hasil saya terlihat seperti berikut:

name            size
MirroredDb      392
MirroredDb_log  131072

Buat snapshot lain pada basis data cermin , dan lihat ukuran file log transaksi di sana:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

Kumpulan hasil saya terlihat seperti berikut:

name            size
MirroredDb      392
MirroredDb_log  131072

Sekarang lakukan DBCC SHRINKFILEpada prinsipal :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Kumpulan hasil saya adalah sebagai berikut:

name            size
MirroredDb      392
MirroredDb_log  104

Buat snapshot ketiga dan terakhir pada basis data cermin , dan lihat ukurannya:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

Dan saya mendapatkan hasil set berikut:

name            size
MirroredDb      392
MirroredDb_log  104

Jadi seperti yang Anda lihat di sini, DBCC SHRINKFILEperintah sebenarnya dicerminkan ke database cermin.

Thomas Stringer
sumber
Terima kasih, saya tidak menyadari ukuran file log disalin dari server utama juga. Tetapi jika mirror tidak berfungsi karena ukuran log transaksi, apakah satu-satunya solusi untuk menghapus dan membuat ulang mirror? Tidak ada cara untuk mengecilkan log cermin dengan aman ketika proses mirroring tidak berfungsi?
Rachel
Anda tidak dapat terhubung ke database yang dicerminkan, oleh karena itu Anda tidak dapat menjalankannya DBCC SHRINKFILE. Adapun jika Anda dapat memperbaiki sesi mirror Anda tanpa menghapus mirroring pada database itu, ada sedikit penyelidikan yang harus dilakukan di sana. Sepertinya itu ditangguhkan karena ukuran file. Sudahkah Anda mencoba memulai kembali pasangannya?
Thomas Stringer
Ya, tetapi segera kembali ditangguhkan. Saya menduga itu karena terlalu banyak waktu telah berlalu sejak mirroring berhenti, jadi banyak data masih perlu ditransfer sebelum sampai ke bagian "shrink log file". Saya berharap ada beberapa cara lain yang tidak saya sadari, seperti sesuatu yang bisa saya jalankan dari mirror mirror untuk mengecilkan file, atau beberapa manipulasi sistem file, tetapi sepertinya tidak demikian. Jawaban Anda masih sangat membantu, jadi terima kasih :)
Rachel
Berharap tidak lagi. Setelah database ditangguhkan / terputus dan cadangan log dieksekusi pada primer Anda cukup banyak disembunyikan untuk mendapatkan cermin kembali selaras tanpa re-init.
Jason Cumberland