Ada banyak basis data di server SQL klien saya. Basis data ini sedang dikembangkan, sehingga pengembang dapat merancang, refactor, melakukan modifikasi data, dan sebagainya. Ada beberapa database yang jarang berubah. Klien saya harus menjaga semuanya aman (dicadangkan) dan meluangkan waktu untuk mengelola lingkungan. (Tidak ada posisi administrator DB di perusahaan.) Setelah diskusi panjang, klien telah memutuskan untuk menggunakan strategi pencadangan penuh harian, karena kemudahan pemulihan.
Jadi, inilah ringkasan situasinya:
- Jumlah basis data dapat bervariasi setiap hari.
- Basis data yang diubah (artinya data dan / atau struktur telah diubah) harus didukung.
- Basis data yang tidak diubah TIDAK akan didukung.
- Solusi tidak akan memengaruhi struktur basis data (bukan persyaratan yang dibatasi)
- "Mesin cadangan" ini akan bekerja secara otomatis.
Masalah utama: bagaimana mendeteksi bahwa database telah diubah. Bagian pertama dari masalah (perubahan DDL) dapat diatasi dengan menggunakan pemicu DDL . Tetapi perubahan data (perubahan DML) merupakan masalah. Tidak mungkin untuk menerapkan pemicu DML ke semua tabel dari semua database untuk melacak perubahan (kinerja, manajemen objek yang diperluas ...). Mesin pencadangan harus melacak semua perubahan untuk menandai setiap basis data sebagai siap untuk dicadangkan.
Ubah Data Capture adalah solusi tetapi tampaknya terlalu berat (membutuhkan SQL Server Enterprise Edition juga).
Cara lain adalah melacak perubahan file database (ukuran atau waktu perubahan terakhir), tetapi tidak berfungsi dengan benar: Database dapat mengubah ukurannya ketika melebihi semua ruang kosong yang disediakan dan sp_spaceused bukan solusi.
Menelusuri adalah solusi tetapi menyebabkan masalah kinerja dan membutuhkan manajemen tambahan.
Apakah ada solusi untuk menghitung ukuran penggunaan database aktual tanpa dampak pada objek manajemen database lain (seperti statistik ..)? Memang perubahan pada data tabel yang tidak mengubah ukuran tabel tidak akan memicu (saya pikir), tapi itu lebih baik daripada tidak sama sekali. Benar-benar saya mencari solusi langsung atau tidak langsung untuk SQL Server 2008.
Terima kasih atas komentar, solusi, dan pemikiran.
TAMBAH:
Ini solusinya (terima kasih kepada Marian ):
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation IN
('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
AND so.is_ms_shipped = 0)
OR
([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
)