Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Thủ tục được lưu trữ chuyên dụng để có được trạng thái sao lưu cơ sở dữ liệu mới nhất

Bất kỳ SQL Server DBA nào (tất nhiên, điều này áp dụng cho tất cả các nền tảng) sẽ đồng ý rằng sao lưu cơ sở dữ liệu là những thứ cần thiết nhất đối với các chuyên gia dữ liệu. Theo dõi trạng thái của các bản sao lưu đó là rất quan trọng. Để làm cho nhiệm vụ này trở nên đơn giản hơn, tôi đã tạo một Thủ tục lưu trữ tùy chỉnh. Nó sẽ cho phép bạn nhận được các trạng thái sao lưu cơ sở dữ liệu mới nhất (nếu có) cho tất cả các cơ sở dữ liệu cần thiết mà bạn quan tâm.

Trước khi chúng tôi bắt đầu, hãy kiểm tra tài khoản đang thực hiện Quy trình đã lưu trữ này. Nó phải có các quyền cần thiết để thực hiện SELECT trên các bảng sau để tạo thủ tục được lưu trữ:

  • sys.databases (chính)
  • backupmediafamily (msdb)
  • bộ sao lưu (msdb)

Cách sử dụng quy trình đã lưu trữ

Thủ tục lưu trữ Mã T-SQL được cung cấp trong bài viết này. Thủ tục mong đợi 2 tham số:

  • @database là tên của cơ sở dữ liệu đích. Nếu không có quy định nào được chỉ định, tất cả các cơ sở dữ liệu sẽ được giả định.
  • @backupType là loại sao lưu bạn muốn kiểm tra. Tùy thuộc vào tình huống của bạn, nó có thể là:
    • F - Đầy đủ
    • Đ - Khác biệt
    • L - Nhật ký giao dịch
    • Đ - Tất cả những điều trên

Dưới đây là ma trận các kết hợp tham số khả thi có thể được sử dụng và kết quả đầu ra mà bạn mong đợi. X là tên của cơ sở dữ liệu bạn muốn nhắm mục tiêu.

@database @backupType Đầu ra
Tất cả A Hiển thị các bản sao lưu Nhật ký Giao dịch, Điểm khác biệt và Đầy đủ gần đây nhất của tất cả các cơ sở dữ liệu trong phiên bản.
Tất cả F Hiển thị các bản sao lưu Đầy đủ gần đây nhất của tất cả các cơ sở dữ liệu trong phiên bản.
Tất cả D Hiển thị các bản sao lưu Khác biệt gần đây nhất của tất cả các cơ sở dữ liệu trong phiên bản.
Tất cả L Hiển thị các bản sao lưu Nhật ký giao dịch gần đây nhất của tất cả cơ sở dữ liệu trong phiên bản.
X A Hiển thị các bản sao lưu Nhật ký Giao dịch, Điểm khác biệt và Đầy đủ gần đây nhất của cơ sở dữ liệu X trong phiên bản này.
X F Hiển thị bản sao lưu đầy đủ gần đây nhất của cơ sở dữ liệu X trong phiên bản.
X D Hiển thị bản sao lưu Khác biệt gần đây nhất của cơ sở dữ liệu X trong phiên bản.
X L Hiển thị bản sao lưu Nhật ký giao dịch gần đây nhất của cơ sở dữ liệu X trong phiên bản.

Lưu ý :Nếu cơ sở dữ liệu đích nằm trong Mô hình khôi phục đơn giản, thông tin sao lưu Nhật ký giao dịch sẽ hiển thị dưới dạng NULL. Nó chưa bao giờ nằm ​​trong Mô hình khôi phục đầy đủ và sao lưu Nhật ký giao dịch chưa bao giờ diễn ra cho nó.

Kiểm tra thực thi

Tôi sẽ trình bày một số cách kết hợp tập lệnh để bạn có ý tưởng về những gì sẽ xảy ra từ Quy trình được lưu trữ này:

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'

Ảnh chụp màn hình sẽ không bao gồm SP nhắm mục tiêu một cơ sở dữ liệu duy nhất bởi vì kết quả đầu ra giống nhau, điểm khác biệt duy nhất là nó hiển thị một cơ sở dữ liệu.

Như bạn có thể thấy, dữ liệu cho các cột "Vi sai" là NULL vì tôi chưa bao giờ tạo bản sao lưu vi sai cho bất kỳ cột nào trong số đó. Tuy nhiên, để chứng minh đầy đủ giải pháp này hữu ích như thế nào, chúng ta cần một bản sao lưu vi sai. Tôi sẽ lấy một cái cho cơ sở dữ liệu DBA và thực thi Thủ tục đã lưu trữ để xem nó trả về những gì:

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

Sau khi thực hiện sao lưu chênh lệch, bạn có thể thấy rằng quy trình được lưu trữ của chúng tôi cũng trả về dữ liệu cho các cột Khác biệt, chính xác của bản sao lưu mà tôi vừa thực hiện.

Mã quy trình được lưu trữ hoàn chỉnh

Ngay khi bắt đầu tập lệnh, bạn sẽ thấy các giá trị mặc định - tập lệnh giả định chúng nếu không có giá trị nào được chuyển cho mỗi tham số.

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

Kết luận

Với Quy trình được lưu trữ tùy chỉnh này, bạn có thể xây dựng một cơ chế để thông báo cho bạn khi một loại sao lưu nhất định cho bất kỳ cơ sở dữ liệu nhất định nào chưa được thực hiện trong một khoảng thời gian cụ thể.

Bạn có thể triển khai quy trình được lưu trữ này trong mọi phiên bản SQL Server và kiểm tra thông tin sao lưu cho mọi cơ sở dữ liệu đơn lẻ (Cơ sở dữ liệu Hệ thống và Người dùng).

Ngoài ra, bạn có thể sử dụng thông tin được trả về bởi quy trình được lưu trữ để xây dựng bản đồ sao lưu để xác định vị trí cho tệp sao lưu mới nhất cho mỗi cơ sở dữ liệu. Trong công việc hiện tại của tôi, tôi đã sử dụng nó để xây dựng một tập lệnh để sắp xếp các thử nghiệm khôi phục của tất cả các bản sao lưu dưới sự hỗ trợ của tôi và xác nhận rằng chúng đáng tin cậy 100%. Đối với tôi, nó vô cùng hữu ích.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hướng dẫn dữ liệu:Sử dụng các chức năng của cửa sổ

  2. Cách lấy ngày và giờ hiện tại (không có múi giờ) trong T-SQL

  3. Chứng chỉ Chuyên gia Google Data Analytics có giá trị không?

  4. Mô hình dữ liệu bảng lương

  5. Cơ sở dữ liệu chuỗi thời gian là gì?