Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Database Sistem SQL Server – Pemeliharaan MSDB

Dalam artikel sebelumnya dari seri Database Sistem SQL Server, kita telah melalui Database Sistem yang diinstal secara default selama Instalasi SQL Server, memahami tujuan dari masing-masing database sistem tersebut dan menjelajahi database Tempdb dan pemeliharaannya secara lebih rinci. Pada artikel ini, kita akan menjelajahi database MSDB secara lebih rinci bersama dengan masalah yang sering dihadapi seputar database MSDB dan cara menyelesaikannya dengan cara yang benar.

Basis Data MSDB

MSDB Basis data sistem SQL Server menyimpan semua informasi konfigurasi penting dan informasi historis yang terkait dengan Layanan Agen Server SQL, Pialang Layanan SQL Server, Surat Basis Data, Pengiriman Log, Pencerminan Basis Data, dll.:

  • Layanan Agen Server SQL
    • Tugas Agen Server SQL – Data konfigurasi dan detail Riwayat
    • Peringatan Agen Server SQL – Data konfigurasi
    • Operator Agen Server SQL – Data konfigurasi
    • Proxy Agen Server SQL – Data konfigurasi
    • Informasi terkait
  • SQL Server Database Mail, termasuk Service Broker – Data konfigurasi dan detail log Mail historis.
  • Detail Pencadangan dan Pemulihan SQL Server – Data riwayat semua peristiwa Pencadangan dan Pemulihan Basis Data yang terjadi dalam contoh SQL Server.
  • Paket pemeliharaan, Paket SSIS, dan informasi terkait – Data konfigurasi, data terkait, dan data eksekusi semua item ini melalui Pekerjaan Agen Server SQL.
  • Konfigurasi Pengiriman Log, Profil Agen Replikasi, Pekerjaan Pengumpul Data – Data konfigurasi dari semua teknik Ketersediaan Tinggi yang disebutkan.

Kapan pun salah satu dari konfigurasi penting di atas diubah, disarankan untuk mengambil Penuh backup database MSDB untuk menghindari kehilangan data jika terjadi kegagalan.

Meskipun SQL Server Agent Service menyimpan detail konfigurasi penting di seluruh tabel di MSDB database, SQL Server menyimpan beberapa detail konfigurasi di Windows Registry juga. Untuk itu, ia menggunakan Prosedur Tersimpan yang diperluas bernama sp_set_sqlagent_properties .

Mari kita lihat sekilas ke lokasi Registry tempat SQL Server menyimpan konfigurasi SQL Server Agent Service. Penting :Ini hanya untuk tujuan pembelajaran, dan kami tidak menyarankan untuk mengubah nilai konfigurasi apa pun. Jika tidak, ini mungkin berakhir dengan kesalahan aneh yang terkait dengan Layanan Agen Server SQL.

Buka Editor Registri dengan mengetik regedit di prompt perintah:

Klik Masuk untuk membuka Editor Registri :

Sekarang, navigasikan ke jalur:

Komputer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13.MSSQLSERVER\SQLServerAgent

Lihat detail konfigurasi di bawah ini. Fragmen yang ditandai mengacu pada nama instans SQL Server, dan mungkin berbeda di lingkungan Anda berdasarkan versi SQL Server dan nama instans.

Tampilan cepat pada registri menunjukkan bahwa ada parameter tertentu yang terkait dengan Layanan Agen Server SQL yang disimpan. Karena kami tidak menyarankan untuk mengubah parameter apa pun yang terkait dengan Layanan Agen Server SQL dan dibagikan di atas hanya untuk tujuan pembelajaran, kami tidak akan membahasnya lebih dalam di sini.

Namun, jika Anda bermaksud untuk mengubah salah satu properti Layanan Agen Server SQL untuk memenuhi persyaratan Bisnis atau Produksi, maka Anda dapat memodifikasinya dengan mengklik kanan Layanan Agen Server SQL dan memilih Properti seperti yang ditunjukkan di bawah ini.

Meskipun ada banyak parameter yang tersedia terkait dengan Layanan Agen Server SQL dan ruang lingkup artikel ini terkait dengan database msdb, saya telah mengecualikannya dan hanya mencakup opsi khusus untuk database msdb dengan mengklik menu History seperti yang ditunjukkan di bawah ini di mana kita dapat mengonfigurasi ukuran Log Riwayat Pekerjaan dan Riwayat Agen.

Masalah yang Sering Dihadapi di Basis Data MSDB

Dalam setiap contoh produksi SQL Server, kami akan memiliki banyak Pekerjaan Agen SQL Server, Database Mail, rencana Pemeliharaan, dan cadangan Log Penuh/Transaksi diaktifkan. Tergantung no. database dalam contoh atau no. pekerjaan SQL Server Agent tersedia, atau penggunaan Database Mail, SQL Server kami akan mulai mencatat informasi riwayat semua fitur yang diaktifkan, sehingga meningkatkan ukuran MSDB basis data. Jika tidak dipelihara dengan baik, ini akan mempengaruhi kinerja database MSDB dan operasi yang terkait dengannya.

Mari kita tinjau fitur yang dibahas sebelumnya dan tabel yang digunakan untuk menyimpan data riwayat untuk memahami bagaimana kita dapat menjaga agar ukuran tabel tetap terkendali.

  • Riwayat Cadangan
  • Riwayat Pekerjaan Agen Server SQL
  • Rencana Pemeliharaan
  • Riwayat Surat Basis Data SQL Server
  • Paket SSIS

Untuk mengetahui tabel mana dalam database MSDB yang membutuhkan lebih banyak ruang, kita dapat menggunakan Disk Usage by Top Tables Reports yang datang sebagai bagian dari pelaporan default SQL Server di SQL Server Management Studio.

Buka SSMS dan klik kanan pada MSDB database> Laporan > Laporan Standar > Penggunaan Disk berdasarkan Tabel Teratas untuk menghasilkan laporan tabel yang diurutkan berdasarkan Penggunaan Disk:

Klik Penggunaan Disk menurut Tabel Teratas untuk melihat laporan. Karena instance saya adalah salah satu pengembangan, tidak ada tabel besar, tetapi laporan ini dapat menunjukkan ukuran semua tabel dalam database yang diurutkan dalam urutan menurun.

Kami juga dapat menggunakan kueri di bawah ini untuk mendapatkan ukuran tabel dalam database.

SELECT -- TOP(10)
	  SCHEMA_NAME(o.[schema_id]) Schema_name
	, o.name object_name
    , total_size = CAST(SUM(au.total_pages) * 8. / 1024 AS DECIMAL(18,2))
    , total_rows = SUM(CASE WHEN i.index_id IN (0, 1) AND au.[type] = 1 THEN p.[rows] END)
FROM sys.objects o 
JOIN sys.indexes i ON o.[object_id] = i.[object_id]
JOIN sys.partitions p ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
JOIN sys.allocation_units au ON p.[partition_id] = au.container_id
WHERE i.is_disabled = 0
AND i.is_hypothetical = 0
AND o.Type in ('S','U','V')
GROUP BY o.name, SCHEMA_NAME(o.[schema_id])
ORDER BY 3 DESC

Setelah mengetahui tabel mana yang membutuhkan lebih banyak ruang, kita dapat menggunakan prosedur tersimpan terkait untuk menjaga ukurannya tetap terkendali.

Riwayat Cadangan

Tanggung jawab utama DBA adalah memastikan bahwa Pencadangan Penuh dan Log Transaksi diaktifkan di semua instans SQL Server Produksi untuk memulihkan database ke titik waktu tertentu.

SQL Server menyimpan detail Cadangan dan informasi Pulihkan di tabel database MSDB berikut :

  • file cadangan
  • grup file cadangan
  • backupmediafamily
  • set media cadangan
  • cadangan
  • memulihkan file
  • restorefilegroup
  • restorehistory

Untuk tidak signifikan. basis data dalam contoh SQL Server yang dikonfigurasi dengan pencadangan Penuh dan pencadangan Log Transaksional, catatan di seluruh tabel di atas dapat meningkat lebih cepat.

Jadi, SQL Server menyediakan dua prosedur tersimpan sistem di MSDB database untuk mengontrol ukuran tabel di atas:

  • sp_delete_backuphistory – menghapus data riwayat pencadangan di 8 tabel di atas berdasarkan tanggal terlama parameter.
  • sp_delete_database_backuphistory – menghapus data riwayat pencadangan di 8 tabel di atas berdasarkan nama database .

Sintaks untuk menjalankan prosedur tersimpan sistem di atas:

exec msdb.dbo.sp_delete_backuphistory @oldest_date = 'oldest_date'
exec msdb.dbo.sp_delete_database_backuphistory @database_name = 'database_name'

Saat kami menjalankan salah satu prosedur tersimpan yang dijelaskan di atas pada database yang berisi catatan besar di seluruh tabel riwayat pencadangan, kami mungkin mendapatkan pemblokiran atau pemberitahuan bahwa catatan dihapus dengan sangat lambat. Untuk mengatasi ini, kami membuat indeks yang hilang di bawah ini pada cadangan meja. Ini dapat diidentifikasi melalui rencana eksekusi prosedur tersimpan untuk mengeksekusi prosedur tersimpan kami dengan lebih cepat.

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE OBJECT_ID = OBJECT_ID('[dbo].[backupset]') AND name = 'IX_BackupSet_FinDate_MediaSet')
CREATE NONCLUSTERED INDEX IX_BackupSet_FinDate_MediaSet ON backupset(backup_finish_date) 
INCLUDE (media_set_id)
GO

Riwayat Pekerjaan Agen Server SQL

SQL Server menyimpan semua riwayat Pekerjaan Agen Server SQL di msdb.dbo.sysjobhistory meja. Selain itu, SQL Server memiliki prosedur tersimpan sistem bernama msdb.dbo.sp_purge_jobhistory yang membantu menjaga sysjobhistory ukuran tabel terkendali.

Sintaks untuk menjalankan sp_purge_jobhistory prosedur tersimpan adalah:

exec msdb.dbo.sp_purge_jobhistory @job_name = 'job_name', @job_id = 'job_id', @oldest_date ='oldest_date'

Ketiga parameter bersifat opsional, dan kami menyarankan untuk menjalankan prosedur di atas dengan meneruskan tanggal_terlama parameter untuk menjaga sysjobhistory ukuran tabel terkendali.

Rencana Pemeliharaan

SQL Server menyimpan rincian semua rencana Pemeliharaan dalam tabel di bawah ini:

  • msdb.dbo.sysmaintplan_log
  • msdb.dbo.sysmaintplan_logdetail

SQL Server memiliki prosedur tersimpan bawaan bernama msdb.dbo.sp_maintplan_delete_log untuk menjaga agar ukuran 2 tabel ini tetap terkendali.

Sintaks untuk menjalankan prosedur adalah:

exec msdb.dbo.sp_maintplan_delete_log @plan_id = '', @subplan_id = '', @oldest_Time = 'oldest_datetime'

Semua 3 parameter adalah opsional. Kami merekomendasikan untuk menjalankan prosedur di atas, dengan meneruskan parameter old_time untuk menjaga ukuran dari dua tabel di atas tetap terkendali.

Riwayat Surat Basis Data SQL Server

SQL Server menyimpan semua log riwayat Database Mail di tabel di bawah ini:

  • sysmail_mailitems
  • sysmail_log
  • sysmail_attachments
  • sysmail_attachments_transfer

Untuk menjaga agar ukuran tabel riwayat ini tetap terkendali, SQL Server menawarkan 2 Prosedur Tersimpan sistem bernama msdb.dbo.sysmail_delete_mailitems_sp dan msdb.dbo.sysmail_delete_log_sp.

Sintaks untuk menjalankan prosedur tersimpan ini adalah:

exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = 'oldest_datetime', @sent_status = NULL
exec msdb.dbo.sysmail_delete_log_sp @logged_before = 'oldest_datetime', @event_type = NULL

Untuk kedua prosedur, semua parameter bersifat opsional. Namun, disarankan untuk menggunakan sent_before atau log_befor e parameter untuk menghapus catatan lama berdasarkan periode penyimpanan.

Dalam beberapa skenario, jika semua tabel yang terkait dengan Database Mail berukuran besar, jalankan hapus prosedur akan berjalan selamanya. Cara yang lebih cepat untuk menangani masalah ini adalah dengan menghapus batasan kunci Asing di sysmail_attachments dan sysmail_send_retries tabel, potong 4 tabel di atas dan buat kembali 2 kunci asing kembali di sysmail_attachments dan sysmail_send_retries tabel seperti yang ditunjukkan di bawah ini:

USE MSDB;

ALTER TABLE [dbo].[sysmail_attachments] DROP [FK_sysmail_mailitems_mailitem_id];
GO
ALTER TABLE [dbo].[sysmail_send_retries] DROP [FK_mailitems_mailitem_id];
GO

TRUNCATE TABLE [dbo].[sysmail_attachments];
TRUNCATE TABLE [dbo].[sysmail_send_retries];
TRUNCATE TABLE [dbo].[sysmail_mailitems];
TRUNCATE TABLE [dbo].[sysmail_log];

ALTER TABLE [dbo].[sysmail_attachments]  WITH CHECK ADD  CONSTRAINT [FK_sysmail_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_attachments] CHECK CONSTRAINT [FK_sysmail_mailitems_mailitem_id];
GO

ALTER TABLE [dbo].[sysmail_send_retries]  WITH CHECK ADD  CONSTRAINT [FK_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_send_retries] CHECK CONSTRAINT [FK_mailitems_mailitem_id];
GO

Paket SSIS

SQL Server menyimpan semua SSIS(*.dtsx) paket di msdb.dbo.sysssispackages meja. Tabel ini adalah tabel konfigurasi, namun, dalam kasus acak, kemungkinan besar ada banyak paket SSIS yang dibuang ke tabel. Hal ini menyebabkan ukuran tabel ini menjadi besar.

Dalam kasus tersebut, kita perlu mengidentifikasi apakah ada paket yang tidak diinginkan dan menghapus paket tersebut untuk menjaga sysssispackages ukuran tabel terkendali.

Intinya

SQL Server tidak memiliki tugas bawaan untuk menangani tugas menghapus semua tabel dibahas di atas. Namun, kami memiliki parameter tanggal tertua tersedia untuk semua prosedur di atas.

Oleh karena itu, pendekatan yang disarankan untuk menangani ukuran tabel MSDB di bawah kendali akan menentukan periode retensi berdasarkan jumlah hari, dan membuat pekerjaan Agen Server SQL baru untuk menjalankan skrip di bawah ini secara terjadwal:

declare @retention_date datetime = '2021-04-01'
exec msdb.dbo.sp_delete_backuphistory @oldest_date = @retention_date;
exec msdb.dbo.sp_purge_jobhistory @oldest_date = @retention_date;
exec msdb.dbo.sp_maintplan_delete_log @oldest_Time = @retention_date;
exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @retention_date;
exec msdb.dbo.sysmail_delete_log_sp @logged_before = @retention_date;

Kesimpulan

Kami telah mempelajari tentang daftar tabel yang dapat berkembang lebih cepat di MSDB database dan bagaimana menjaga ukuran tabel ini di bawah kontrol. Kami telah memperoleh skrip praktis dengan daftar prosedur yang harus dijalankan secara teratur untuk mencegah MSDB database tumbuh ke ukuran besar juga. Semoga artikel ini bermanfaat untuk otomatisasi Anda dan informasi ini akan membebaskan pikiran Anda dari pemeliharaan database MSDB dan berkonsentrasi pada aktivitas lain.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghindari satu kutipan di SQL Server?

  2. Bagaimana menerapkan Memiliki Klausa dengan Grup dengan di Select Query - Tutorial SQL Server / TSQL Bagian 131

  3. Dapatkan Daftar Semua Kolom Null dan Bukan Null di Database SQL Server - Tutorial SQL Server / T-SQL Bagian 53

  4. Cara Mengembalikan Stempel Waktu Unix di SQL Server (T-SQL)

  5. Instalasi Cluster Failover SQL Server -4