Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Prosedur Tersimpan Khusus untuk Mendapatkan Status Cadangan Basis Data Terbaru

Setiap DBA SQL Server (tentu saja, ini berlaku untuk semua platform) akan setuju bahwa backup database adalah hal yang paling penting bagi para profesional data. Memantau status cadangan itu sangat penting. Untuk membuat tugas ini lebih mudah, saya telah membuat Prosedur Tersimpan kustom. Ini akan memungkinkan Anda untuk mendapatkan status backup database terbaru (jika ada) untuk semua database yang diperlukan di bawah perawatan Anda.

Sebelum kita mulai, periksa akun yang menjalankan Prosedur Tersimpan ini. Itu harus memiliki hak yang diperlukan untuk melakukan SELECT pada tabel berikut untuk membuat prosedur tersimpan:

  • sys.databases (master)
  • backupmediafamily (msdb)
  • cadangan (msdb)

Cara Menggunakan Prosedur Tersimpan

Kode T-SQL Prosedur Tersimpan disediakan dalam artikel ini. Prosedur mengharapkan 2 parameter:

  • @database adalah nama database target. Jika tidak ada yang ditentukan, semua database akan diasumsikan.
  • @backupType adalah jenis cadangan yang ingin Anda periksa. Tergantung pada situasi Anda, ini bisa berupa:
    • B – Penuh
    • D – Diferensial
    • L – Log Transaksi
    • A – Semua hal di atas

Berikut adalah matriks kemungkinan kombinasi parameter yang dapat digunakan, dan output yang Anda harapkan. X adalah nama database yang ingin Anda targetkan.

@database @backupType Keluaran
Semua A Menampilkan cadangan Lengkap, Diferensial, dan Log Transaksi terbaru dari semua database dalam instans.
Semua B Menampilkan Full backup terbaru dari semua database dalam instance.
Semua D Menampilkan cadangan Diferensial terbaru dari semua database dalam instance.
Semua L Menampilkan cadangan Log Transaksi terbaru dari semua database dalam instans.
X A Menampilkan cadangan Lengkap, Diferensial, dan Log Transaksi terbaru dari database X dalam instans.
X B Menampilkan Full backup terbaru dari database X dalam instance.
X D Menampilkan cadangan Diferensial terbaru dari database X dalam instance.
X L Menampilkan cadangan Log Transaksi terbaru dari database X dalam instance.

Catatan :Jika database target berada dalam Model Pemulihan Sederhana, informasi pencadangan Log Transaksi akan muncul sebagai NULL. Itu tidak pernah berada di bawah Model Pemulihan Penuh, dan pencadangan Log Transaksi tidak pernah dilakukan untuk itu.

Tes Eksekusi

Saya akan mendemonstrasikan beberapa kombinasi skrip agar Anda mendapatkan gambaran tentang apa yang diharapkan dari Prosedur Tersimpan ini:

EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'A'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'F'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'D'
EXEC DBA_DatabaseBackups @database = 'All', @backupType = 'L'

Tangkapan layar tidak akan mencakup SP yang menargetkan satu basis data karena outputnya sama, satu-satunya perbedaan adalah, ia menampilkan satu basis data.

Seperti yang Anda lihat, data untuk kolom "Diferensial" adalah NULL karena saya tidak pernah membuat cadangan diferensial untuk salah satu dari mereka. Namun, untuk sepenuhnya menunjukkan betapa bermanfaatnya solusi ini, kami memerlukan cadangan diferensial. Saya akan mengambil satu untuk database DBA dan menjalankan Prosedur Tersimpan untuk melihat apa yang dikembalikannya:

EXEC DBA_DatabaseBackups @database = 'DBA', @backupType = 'D'

Setelah mengambil cadangan diferensial, Anda dapat melihat bahwa prosedur tersimpan kami mengembalikan data untuk kolom Diferensial juga, tepatnya dari cadangan yang baru saja saya buat.

Kode Prosedur Tersimpan Lengkap

Di awal skrip, Anda akan melihat nilai default – skrip mengasumsikannya jika tidak ada nilai yang diteruskan untuk setiap parameter.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Alejandro Cobar
-- Create date: 	2021-05-10
-- Description:	SP to retrieve the latest backups information
-- =============================================
CREATE PROCEDURE DBA_DatabaseBackups
	@database VARCHAR(256) = 'all', 
	@backupType CHAR(1) = 'A'
AS
BEGIN
	SET NOCOUNT ON;

	DECLARE @sqlCommand VARCHAR(MAX);

	SET @sqlCommand = '
    WITH MostRecentBackups
	AS(
		SELECT 
			database_name AS [Database],
			MAX(bus.backup_finish_date) AS LastBackupTime,
			CASE bus.type
				WHEN ''D'' THEN ''Full''
				WHEN ''I'' THEN ''Differential''
				WHEN ''L'' THEN ''Transaction Log''
			END AS Type
		FROM msdb.dbo.backupset bus
		WHERE bus.type <> ''F''
		GROUP BY bus.database_name,bus.type
	),
	BackupsWithSize
	AS(
		SELECT 
			mrb.*, 
			(SELECT TOP 1 CONVERT(DECIMAL(10,4), b.compressed_backup_size/1024/1024/1024) AS backup_size FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS [Backup Size],
			(SELECT TOP 1 DATEDIFF(s, b.backup_start_date, b.backup_finish_date) FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS [Seconds],
			(SELECT TOP 1 b.media_set_id FROM msdb.dbo.backupset b WHERE [Database] = b.database_name AND LastBackupTime = b.backup_finish_date) AS media_set_id
		FROM MostRecentBackups mrb
	)

	SELECT 
d.name AS [Database],
      	d.state_desc AS State,
      	d.recovery_model_desc AS [Recovery Model],'

	  IF @backupType = 'F' OR @backupType = 'A'
	  SET @sqlCommand += '
      bf.LastBackupTime AS [Last Full],
      DATEDIFF(DAY,bf.LastBackupTime,GETDATE()) AS [Time Since Last Full (in Days)],
      bf.[Backup Size] AS [Full Backup Size],
      bf.Seconds AS [Full Backup Seconds to Complete],
      (SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bf.media_set_id AND bmf.device_type = 2) AS [Full Backup Path]
      '

	  IF @backupType = 'A'
	  SET @sqlCommand += ','

	  IF @backupType = 'D' OR @backupType = 'A'
	  SET @sqlCommand += '
	  bd.LastBackupTime AS [Last Differential],
      DATEDIFF(DAY,bd.LastBackupTime,GETDATE()) AS [Time Since Last Differential (in Days)],
      bd.[Backup Size] AS [Differential Backup Size],
      bd.Seconds AS [Diff Backup Seconds to Complete],
      (SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bd.media_set_id AND bmf.device_type = 2) AS [Diff Backup Path]
      '

	  IF @backupType = 'A'
	  SET @sqlCommand += ','

	  IF @backupType = 'L' OR @backupType = 'A'
	  SET @sqlCommand += '
	  bt.LastBackupTime AS [Last Transaction Log],
      DATEDIFF(MINUTE,bt.LastBackupTime,GETDATE()) AS [Time Since Last Transaction Log (in Minutes)],
      bt.[Backup Size] AS [Transaction Log Backup Size],
      bt.Seconds AS [TLog Backup Seconds to Complete],
      (SELECT TOP 1 bmf.physical_device_name FROM msdb.dbo.backupmediafamily bmf WHERE bmf.media_set_id = bt.media_set_id AND bmf.device_type = 2) AS [Transaction Log Backup Path]
	  '

	SET @sqlCommand += '
	FROM sys.databases d
	LEFT JOIN BackupsWithSize bf ON (d.name = bf.[Database] AND (bf.Type = ''Full'' OR bf.Type IS NULL))
	LEFT JOIN BackupsWithSize bd ON (d.name = bd.[Database] AND (bd.Type = ''Differential'' OR bd.Type IS NULL))
	LEFT JOIN BackupsWithSize bt ON (d.name = bt.[Database] AND (bt.Type = ''Transaction Log'' OR bt.Type IS NULL))
	WHERE d.name <> ''tempdb'' AND d.source_database_id IS NULL'

	IF LOWER(@database) <> 'all'
	SET @sqlCommand += ' AND d.name ='+CHAR(39)[email protected]+CHAR(39)

	EXEC (@sqlCommand)
END
GO

Kesimpulan

Dengan Prosedur Tersimpan kustom ini, Anda dapat membuat mekanisme untuk memperingatkan Anda saat jenis pencadangan tertentu untuk basis data tertentu belum dibuat dalam periode tertentu.

Anda dapat menerapkan prosedur tersimpan ini di setiap instance SQL Server dan memeriksa informasi cadangan untuk setiap database tunggal (Database Sistem dan Pengguna).

Selain itu, Anda dapat menggunakan informasi yang dikembalikan oleh prosedur tersimpan untuk membuat peta cadangan untuk mengidentifikasi lokasi file cadangan terbaru untuk setiap database. Dalam pekerjaan saya saat ini, saya telah menggunakan ini untuk membuat skrip untuk mengatur tes pemulihan semua cadangan di bawah dukungan saya dan mengonfirmasi bahwa mereka 100% dapat diandalkan. Bagi saya, ini sangat berguna.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ukuran Sampel dan Durasi STATISTIK PEMBARUAN:Apakah Penting?

  2. Memahami Jenis dan Format MapReduce

  3. hubungan prisma

  4. SQL IN vs SQL ADA

  5. 19 Sumber Daya Online untuk Mempelajari Kesalahan Desain Basis Data