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

Hệ thống tự động gửi email để gửi báo cáo tóm tắt cơ sở dữ liệu

Giám sát cơ sở dữ liệu là công việc cần thiết nhất của bất kỳ nhà quản trị cơ sở dữ liệu nào. Các tổ chức và công ty lớn có nhiều máy chủ cơ sở dữ liệu được đặt trong cùng một trung tâm dữ liệu hoặc ở các trung tâm dữ liệu khác nhau về mặt địa lý. Có nhiều công cụ tiêu chuẩn để giám sát cơ sở dữ liệu. Các công cụ đó sử dụng các dạng xem quản lý động SQL Server và thủ tục được lưu trữ hệ thống để điền dữ liệu. Sử dụng các DMV này, chúng tôi có thể tạo hệ thống tự động tùy chỉnh của mình để điền trạng thái của cơ sở dữ liệu và gửi báo cáo qua email.

Trong bài viết này, tôi sẽ trình bày cách chúng ta có thể sử dụng thủ tục được lưu trữ trong hệ thống và máy chủ được liên kết để điền thông tin của cơ sở dữ liệu nằm trên các máy chủ khác nhau và lên lịch công việc để gửi báo cáo.

Trong bản demo này, tôi sẽ thực hiện các tác vụ sau:

  1. Tạo các thủ tục được lưu trữ bắt buộc trên TTI609-VM1 , TTI609-VM2, TTI412-VM máy chủ để điền thông tin về cơ sở dữ liệu, các đối tượng cơ sở dữ liệu và Công việc SQL.
  2. Tạo một thủ tục được lưu trữ để điền bản tóm tắt cơ sở dữ liệu, bản tóm tắt đối tượng cơ sở dữ liệu và bản tóm tắt Công việc SQL từ TTI609-VM1 TTI609-VM2 máy chủ và lưu trữ chúng trong các bảng liên quan.
  3. Tạo một gói SSIS thực hiện các tác vụ sau:
      • Thực thi một thủ tục được lưu trữ bằng cách sử dụng Thực thi tác vụ tập lệnh SQL .
      • Xuất dữ liệu từ các bảng SQL được tạo trên TTI412-VM và lưu trữ nó trong tab riêng lẻ của tệp excel.
  4. Tạo một Công việc máy chủ SQL để thực thi gói SSIS nhằm điền thông tin cơ sở dữ liệu và quy trình được lưu trữ để gửi báo cáo qua email.

Hình ảnh sau minh họa thiết lập demo:

Sau đây là danh sách các thủ tục được lưu trữ:

Sau đây là danh sách các Bảng:

Tạo thủ tục được lưu trữ trên cả hai máy chủ cơ sở dữ liệu

Như tôi đã đề cập, chúng tôi sẽ điền dữ liệu từ TTI609-VM1 TTI609-VM2 may chủ. Các thủ tục được lưu trữ được sử dụng để điền cơ sở dữ liệu sẽ vẫn giống nhau trong cả hai máy chủ.
Vì vậy, trước tiên, tôi đã tạo một cơ sở dữ liệu có tên DBATools trên cả hai máy chủ. Tôi đã tạo một thủ tục được lưu trữ trong các cơ sở dữ liệu đó. Để làm điều đó, hãy thực thi mã sau trên TTI609-VM1 TTI609-VM2 máy chủ:

USE [master] 
go 
/****** Object:  Database [DBATools]    Script Date: 10/25/2018 11:25:27 AM ******/ 
CREATE DATABASE [DBATools] containment = none ON PRIMARY ( NAME = N'DBATools', 
filename = 
N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DBATools.mdf' 
, size = 3264kb, maxsize = unlimited, filegrowth = 1024kb ) log ON ( NAME = 
N'DBATools_log', filename = 
N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DBATools_log.ldf' 
, size = 816kb, maxsize = 2048gb, filegrowth = 10%) 
go

Tạo một thủ tục được lưu trữ có tên Pull_Database_Information trong DBATools cơ sở dữ liệu. Quy trình được lưu trữ này điền thông tin sau của tất cả các cơ sở dữ liệu hiện có trên cả hai máy chủ cơ sở dữ liệu.

  1. Tên cơ sở dữ liệu.
  2. Mức độ tương thích với cơ sở dữ liệu.
  3. Trạng thái của cơ sở dữ liệu (ONLINE / OFFLINE / RESTORING / SUSPEND).
  4. Mô hình khôi phục cơ sở dữ liệu (SIMPLE / FULL / BULK-LOGGED).
  5. Kích thước cơ sở dữ liệu tính bằng MB.
  6. Tổng Kích thước Tệp Dữ liệu.
  7. Kích thước tệp dữ liệu đã sử dụng.
  8. Tổng kích thước tệp nhật ký.
  9. Kích thước tệp nhật ký đã sử dụng.

Thực thi mã sau trong DBATools cơ sở dữ liệu của cả hai máy chủ cơ sở dữ liệu để tạo quy trình được lưu trữ:

USE DBAtools 
go 
CREATE PROCEDURE Pull_Database_Information 
AS 
  BEGIN 
      IF Object_id('tempdb.dbo.#DBSize') IS NOT NULL 
        DROP TABLE #dbsize 

      CREATE TABLE #dbsize 
        ( 
           database_id         INT PRIMARY KEY, 
           data_file_used_size DECIMAL(18, 2), 
           log_file_used_size  DECIMAL(18, 2) 
        ) 

      DECLARE @SQLCommand NVARCHAR(max) 

      SELECT @SQLCommand = Stuff((SELECT '     USE [' + d.NAME + ']     INSERT INTO #DBSize (database_id, data_file_used_size, log_File_used_size)     SELECT           DB_ID()         , SUM(CASE WHEN [type] = 0 THEN space_used END)         , SUM(CASE WHEN [type] = 1 THEN space_used END)     FROM (         SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8. / 1024)         FROM sys.database_files s         GROUP BY s.[type]     ) t;' 
                                  FROM   sys.databases d 
                                  WHERE  d.[state] = 0 
                                  FOR xml path(''), type).value('.', 
                           'NVARCHAR(MAX)'), 
                           1, 2, 
                                  '') 

      EXEC sys.Sp_executesql 
        @SQLCommand 

      SELECT d.database_id         AS 'Database ID', 
             d.NAME                AS 'Database Name', 
             d.state_desc          AS 'Database State', 
             d.recovery_model_desc AS 'Recovery Model', 
             t.total_db_size       AS 'Database Size', 
             t.data_file_size      AS 'Data File Size', 
             s.data_file_used_size AS 'Data File Used', 
             t.log_file_size       AS 'Log file size', 
             s.log_file_used_size  AS 'Log File Used' 
      FROM   (SELECT database_id, 
                     log_file_size = Cast(Sum(CASE 
                                                WHEN [type] = 1 THEN size 
                                              END) * 8. / 1024 AS DECIMAL(18, 2) 
                                     ), 
                     data_file_size = Cast(Sum(CASE 
                                                 WHEN [type] = 0 THEN size 
                                               END) * 8. / 1024 AS 
                                           DECIMAL(18, 2)) 
                     , 
                     total_DB_size = Cast( 
                     Sum(size) * 8. / 1024 AS DECIMAL(18, 2)) 
              FROM   sys.master_files 
              GROUP  BY database_id) t 
             JOIN sys.databases d 
               ON d.database_id = t.database_id 
             LEFT JOIN #dbsize s 
                    ON d.database_id = s.database_id 
      ORDER  BY t.total_db_size DESC 
  END

Thứ hai, tạo các thủ tục được lưu trữ có tên Pull_Database_Objects trong DBATools cơ sở dữ liệu. Thủ tục được lưu trữ này lặp lại qua tất cả các cơ sở dữ liệu trong cả hai máy chủ cơ sở dữ liệu và điền vào số lượng tất cả các đối tượng cơ sở dữ liệu. Nó điền các cột sau:

  1. Máy chủ / Tên máy chủ.
  2. Tên cơ sở dữ liệu.
  3. Loại đối tượng cơ sở dữ liệu (Bảng / Thủ tục được lưu trữ / Các chức năng / ràng buộc của SQL Scaler, v.v.)
  4. Tổng số đối tượng cơ sở dữ liệu.

Thực thi mã sau trong DBATools cơ sở dữ liệu trên cả hai máy chủ cơ sở dữ liệu để tạo quy trình được lưu trữ:

USE dbatools 
go 

CREATE PROCEDURE [Pull_database_objects] 
AS 
  BEGIN 
      CREATE TABLE #finalsummery 
        ( 
           id           INT IDENTITY (1, 1), 
           databasename VARCHAR(350), 
           objecttype   VARCHAR(200), 
           totalobjects INT 
        ) 

      DECLARE @SQLCommand NVARCHAR(max) 
      DECLARE @I INT=0 
      DECLARE @DBName VARCHAR(350) 
      DECLARE @DBCount INT 

      CREATE TABLE #databases 
        ( 
           NAME VARCHAR(350) 
        ) 

      INSERT INTO #databases 
                  (NAME) 
      SELECT NAME 
      FROM   sys.databases 
      WHERE  database_id > 4 
             AND NAME NOT IN ( 'ReportServer', 'reportservertempdb' ) 

      SET @DBCount=(SELECT Count(*) 
                    FROM   #databases) 

      WHILE ( @DBCount > @I ) 
        BEGIN 
            SET @DBName=(SELECT TOP 1 NAME 
                         FROM   #databases) 
            SET @SQLCommand='             Insert Into #FinalSummery (DatabaseName,ObjectType,TotalObjects)             Select              ''' + @DBName 
                            + ''',             Case                 when Type=''TR'' then ''SQL DML trigger''              when Type=''FN'' then ''SQL scalar function''              when Type=''D'' then ''DEFAULT (constraint or stand-alone)''              when Type=''PK'' then ''PRIMARY KEY constraint''              when Type=''P'' then ''SQL Stored Procedure''              when Type=''U'' then ''Table (user-defined)''              when Type=''V''  then ''View''              when Type=''X'' then ''Extended stored procedure''             End As ObjectType,              Count(Name)TotalObjects from ' + @DBName 
                            + '.sys.all_objects               group by type' 

            EXEC Sp_executesql 
              @SQLCommand 

            DELETE FROM #databases 
            WHERE  NAME = @DBName 

            SET @[email protected] + 1 
        END 

      SELECT Host_name() AS 'Server Name', 
             databasename, 
             objecttype, 
             totalobjects, 
             Getdate()   AS 'ReportDate' 
      FROM   #finalsummery 
      WHERE  objecttype IS NOT NULL 

      DROP TABLE #finalsummery 
  END

Tạo các thủ tục được lưu trữ có tên Pull_SQLJob_Information trong DBATools cơ sở dữ liệu. Thủ tục được lưu trữ này lặp lại qua tất cả máy chủ cơ sở dữ liệu và điền thông tin của tất cả các lệnh SQL và trạng thái của chúng. Nó điền các cột sau:

  1. Máy chủ / Tên máy chủ.
  2. Tên công việc SQL.
  3. Chủ sở hữu Công việc SQL.
  4. Loại công việc.
  5. Mô tả Công việc.
  6. Trạng thái Công việc (Đã bật / tắt)
  7. Ngày tạo việc làm.
  8. Ngày sửa đổi công việc.
  9. Trạng thái công việc đã lên lịch.
  10. Tên lịch biểu.
  11. Ngày và giờ thực hiện cuối cùng
  12. Trạng thái thực thi cuối cùng.

Thực thi mã sau trong DBATools cơ sở dữ liệu trên cả hai máy chủ cơ sở dữ liệu để tạo quy trình được lưu trữ:

CREATE PROCEDURE Pull_sqljob_information 
AS 
  BEGIN 
      SELECT Host_name()       AS 'Server Name', 
             a.NAME            AS 'Job Name', 
             d.NAME            AS Owner, 
             b.NAME            AS Category, 
             a.description     AS Description, 
             CASE a.enabled 
               WHEN 1 THEN 'Yes' 
               WHEN 0 THEN 'No' 
             END               AS 'IsEnabled', 
             a.date_created    AS CreatedDate, 
             a.date_modified   AS ModifiedDate, 
             CASE 
               WHEN f.schedule_uid IS NULL THEN 'No' 
               ELSE 'Yes' 
             END               AS 'Scheduled?', 
             f.NAME            AS JobScheduleName, 
             Max(Cast( 
      Stuff(Stuff(Cast(g.run_date AS VARCHAR), 7, 0, '-'), 5, 0, '-') 
           + ' ' 
           + 
Stuff(Stuff(Replace(Str(g.run_time, 6, 0), ' ', '0'), 5, 0, ':'), 3, 0, ':') 
AS DATETIME)) AS [LastRun], 
CASE g.run_status 
WHEN 0 THEN 'Failed' 
WHEN 1 THEN 'Success' 
WHEN 2 THEN 'Retry' 
WHEN 3 THEN 'Canceled' 
WHEN 4 THEN 'In progress' 
END               AS Status 
FROM   msdb.dbo.sysjobs AS a 
       INNER JOIN msdb.dbo.sysjobhistory g 
               ON a.job_id = g.job_id 
       LEFT JOIN msdb.dbo.syscategories AS b 
              ON a.category_id = b.category_id 
       LEFT JOIN msdb.dbo.sysjobsteps AS c 
              ON a.job_id = c.job_id 
                 AND a.start_step_id = c.step_id 
       LEFT JOIN msdb.sys.database_principals AS d 
              ON a.owner_sid = d.sid 
       LEFT JOIN msdb.dbo.sysjobschedules AS e 
              ON a.job_id = e.job_id 
       LEFT JOIN msdb.dbo.sysschedules AS f 
              ON e.schedule_id = f.schedule_id 
GROUP  BY a.NAME, 
          d.NAME, 
          b.NAME, 
          a.description, 
          a.enabled, 
          f.schedule_uid, 
          f.NAME, 
          a.date_created, 
          a.date_modified, 
          g.run_status 
ORDER  BY a.NAME 
END

Tạo các thủ tục đã lưu trữ, Máy chủ được Liên kết và các bảng trên máy chủ trung tâm

Sau khi các quy trình đã được tạo trên TTI609-VM1 TTI609-VM2 máy chủ cơ sở dữ liệu, tạo các thủ tục và bảng được yêu cầu trên máy chủ trung tâm ( TTI412-VM ).

Tôi đã tạo một cơ sở dữ liệu riêng có tên là MonitoringDashboard trên TTI412-VM máy chủ. Thực thi đoạn mã sau để tạo cơ sở dữ liệu trên máy chủ trung tâm.

USE [master] 
go 

/****** Object:  Database [MonitoringDashboard]    Script Date: 10/25/2018 2:44:09 PM ******/ 

CREATE DATABASE [MonitoringDashboard] containment = none ON PRIMARY ( NAME = 
N'MonitoringDashboard', filename = 
N'E:\MS_SQL\SQL2017_Data\MonitoringDashboard.mdf', size = 8192kb, maxsize = 
unlimited, filegrowth = 65536kb ) log ON ( NAME = N'MonitoringDashboard_log', 
filename = N'E:\MS_SQL\SQL2017_Log\MonitoringDashboard_log.ldf', size = 8192kb, 
maxsize = 2048gb, filegrowth = 65536kb ) 

go

Sau khi cơ sở dữ liệu đã được tạo, hãy tạo quy trình được lưu trữ sử dụng Máy chủ LINKED để thực thi quy trình trên TTI609-VM1 TTI609-VM2 máy chủ cơ sở dữ liệu. Thực thi mã sau trong cơ sở dữ liệu “chính” của TTI412-VM máy chủ cơ sở dữ liệu để tạo một máy chủ được liên kết:

Tập lệnh 1:Tạo máy chủ được liên kết TTI609-VM1

USE [master] 
go 
/****** Object:  LinkedServer [TTI609-VM1]    Script Date: 10/25/2018 2:49:28 PM ******/ 
EXEC master.dbo.Sp_addlinkedserver 
  @server = N'TTI609-VM1', 
  @srvproduct=N'SQL Server' 

/* For security reasons the linked server remote logins password is changed with ######## */ 
EXEC master.dbo.Sp_addlinkedsrvlogin 
  @rmtsrvname=N'TTI609-VM1', 
  @useself=N'False', 
  @locallogin=NULL, 
  @rmtuser=N'sa', 
  @rmtpassword='########' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'collation compatible', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'data access', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'dist', 
  @optvalue=N'false' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'rpc', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'rpc out', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'connect timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'query timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'use remote collation', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'remote proc transaction promotion', 
  @optvalue=N'false' 

go

Tập lệnh 2:Tạo máy chủ được liên kết TTI609-VM2

USE [master] 

go 

/****** Object:  LinkedServer [TTI609-VM2]    Script Date: 10/25/2018 2:55:29 PM ******/ 
EXEC master.dbo.Sp_addlinkedserver 
  @server = N'TTI609-VM2', 
  @srvproduct=N'SQL Server' 

/* For security reasons the linked server remote logins password is changed with ######## */ 
EXEC master.dbo.Sp_addlinkedsrvlogin 
  @rmtsrvname=N'TTI609-VM2', 
  @useself=N'False', 
  @locallogin=NULL, 
  @rmtuser=N'sa', 
  @rmtpassword='########' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'collation compatible', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'data access', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'dist', 
  @optvalue=N'false' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'rpc', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'rpc out', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'connect timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'collation name', 
  @optvalue=NULL 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'query timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'use remote collation', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'remote proc transaction promotion', 
  @optvalue=N'false' 

go

Tạo một thủ tục và bảng đã lưu trữ

Khi máy chủ được liên kết đã được tạo, chúng tôi cần tạo ba bảng có tên Database_Object_Summery , Database_Summery SQL_Job_List trong Bảng điều khiển giám sát cơ sở dữ liệu. Các bảng này lưu trữ thông tin được điền bởi Generate_Database_Information thủ tục được lưu trữ và sau đó là dữ liệu, được lưu trữ trong các bảng đó sẽ được sử dụng để tạo báo cáo trong excel.

Thực thi mã sau để tạo SQL_Job_List bảng:

USE [MonitoringDashboard] 
go 

CREATE TABLE [dbo].[sql_job_list] 
  ( 
     [id]             [INT] IDENTITY(1, 1) NOT NULL, 
     [servername]     [VARCHAR](250) NULL, 
     [jobname]        [VARCHAR](250) NULL, 
     [jobowner]       [VARCHAR](250) NULL, 
     [jobcategory]    [VARCHAR](250) NULL, 
     [jobdescription] [VARCHAR](250) NULL, 
     [jobstatus]      [VARCHAR](50) NULL, 
     [createdate]     [DATETIME] NULL, 
     [modifieddate]   [DATETIME] NULL, 
     [isscheduled]    [VARCHAR](5) NULL, 
     [schedulename]   [VARCHAR](250) NULL, 
     [reportdate]     [DATETIME] NULL 
  ) 
ON [PRIMARY] 

go 

ALTER TABLE [dbo].[sql_job_list] 
  ADD DEFAULT (Getdate()) FOR [ReportDate] 

go

Thực thi mã sau để tạo lst_dbservers bảng:

USE [MonitoringDashboard] 

go 

CREATE TABLE [dbo].[lst_dbservers] 
  ( 
     [id]         [INT] IDENTITY(1, 1) NOT NULL, 
     [servername] [VARCHAR](50) NOT NULL, 
     [addeddate]  [DATETIME] NOT NULL, 
     PRIMARY KEY CLUSTERED ( [id] ASC )WITH (pad_index = OFF, 
     statistics_norecompute = OFF, ignore_dup_key = OFF, allow_row_locks = on, 
     allow_page_locks = on) ON [PRIMARY], 
     UNIQUE NONCLUSTERED ( [servername] ASC )WITH (pad_index = OFF, 
     statistics_norecompute = OFF, ignore_dup_key = OFF, allow_row_locks = on, 
     allow_page_locks = on) ON [PRIMARY] 
  ) 
ON [PRIMARY] 

go 

ALTER TABLE [dbo].[lst_dbservers] 
  ADD DEFAULT (Getdate()) FOR [AddedDate] 

go

Thực thi mã sau để tạo Database_Summery bảng:

USE [MonitoringDashboard] 
go 
CREATE TABLE [dbo].[database_summery] 
  ( 
     [id]                 [INT] IDENTITY(1, 1) NOT NULL, 
     [servername]         [VARCHAR](150) NULL, 
     [databaseid]         [INT] NULL, 
     [databasename]       [VARCHAR](250) NULL, 
     [databasestatus]     [VARCHAR](50) NULL, 
     [recoverymodel]      [VARCHAR](50) NULL, 
     [compatibilitylevel] [INT] NULL, 
     [databasecreatedate] [DATE] NULL, 
     [databasecreatedby]  [VARCHAR](150) NULL, 
     [dbsize]             [NUMERIC](10, 2) NULL, 
     [datafilesize]       [NUMERIC](10, 2) NULL, 
     [datafileused]       [NUMERIC](10, 2) NULL, 
     [logfilesize]        [NUMERIC](10, 2) NULL, 
     [logfileused]        [NUMERIC](10, 2) NULL, 
     [reportdate]         [DATETIME] NULL 
  ) 
ON [PRIMARY] 
go 

ALTER TABLE [dbo].[database_summery] 
  ADD DEFAULT (Getdate()) FOR [ReportDate] 
go

Thực thi mã sau để tạo Database_Object_Summery bảng:

USE [MonitoringDashboard] 

go 

CREATE TABLE [dbo].[database_object_summery] 
  ( 
     [id]           [INT] IDENTITY(1, 1) NOT NULL, 
     [servername]   [VARCHAR](250) NULL, 
     [databasename] [VARCHAR](250) NULL, 
     [objecttype]   [VARCHAR](50) NULL, 
     [objectcount]  [INT] NULL, 
     [reportdate]   [DATETIME] NULL 
  ) 
ON [PRIMARY] 

go 

ALTER TABLE [dbo].[database_object_summery] 
  ADD DEFAULT (Getdate()) FOR [ReportDate] 

go

Sau khi các bảng được tạo, hãy tạo một thủ tục được lưu trữ có tên Generate_Database_Information trên Bảng điều khiển giám sát cơ sở dữ liệu. Sử dụng “RPC”, nó thực thi các thủ tục được lưu trữ, được tạo trên TTI609-VM1 TTI609-VM2 máy chủ cơ sở dữ liệu để điền dữ liệu.

Thực thi đoạn mã sau để tạo một thủ tục được lưu trữ:

Create PROCEDURE Generate_database_information 
AS 
  BEGIN 
      /*Cleanup*/ 
      TRUNCATE TABLE database_object_summery 
      TRUNCATE TABLE database_summery 
      TRUNCATE TABLE sql_job_list 

      DECLARE @ServerCount INT 
      DECLARE @i INT =0 
      DECLARE @SQLCommand_Object_Summery NVARCHAR(max) 
      DECLARE @SQLCommand_Database_Information NVARCHAR(max) 
      DECLARE @SQLCommand_SQL_Job_Information NVARCHAR(max) 
      DECLARE @servername VARCHAR(100) 

      CREATE TABLE #db_server_list 
        ( 
           servername VARCHAR(100) 
        ) 

      INSERT INTO #db_server_list 
                  (servername) 
      SELECT servername 
      FROM   lst_dbservers 

      SET @ServerCount= (SELECT Count(servername) 
                         FROM   #db_server_list) 

      WHILE ( @ServerCount > @i ) 
        BEGIN 
            SET @servername=(SELECT TOP 1 servername 
                             FROM   #db_server_list) 
            SET @SQLCommand_Object_Summery = 
'insert into Database_Object_Summery (ServerName,DatabaseName,ObjectType,ObjectCount,ReportDate) exec [' 
+ @servername 
+ '].DBATools.dbo.[Pull_Database_Objects]' 
    SET @SQLCommand_Database_Information = 
'insert into Database_Summery (ServerName,DatabaseID,DatabaseName,DatabaseStatus,Recoverymodel,CompatibilityLevel,DatabaseCreateDate,DatabaseCreatedBy,DBSize,DataFileSize,DataFileUsed,LogFileSize,LogFileUsed) exec [' 
+ @servername 
+ '].DBATools.dbo.[Pull_Database_Information]' 
    SET @SQLCommand_SQL_Job_Information = 
'insert into SQL_Job_List (ServerName,JobName,JobOwner,Jobcategory,JobDescription,JobStatus,CreateDate,ModifiedDate,IsScheduled,ScheduleName) exec [' 
+ @servername 
+ '].DBATools.dbo.[Pull_SQLJob_Information]' 

    EXEC Sp_executesql 
      @SQLCommand_Object_Summery 

    EXEC Sp_executesql 
      @SQLCommand_Database_Information 

    EXEC Sp_executesql 
      @SQLCommand_SQL_Job_Information 

    DELETE FROM #db_server_list 
    WHERE  servername = @servername 

    SET @[email protected] + 1 
END 
END

Sau khi quy trình được tạo, hãy tạo một gói SSIS để xuất dữ liệu sang tệp Excel.

Tạo Gói SSIS để xuất dữ liệu trong tệp excel

Trong các bài viết trước đây, tôi đã giải thích các bước để định cấu hình các tác vụ luồng dữ liệu, Kết nối OLEDB và kết nối Excel, do đó tôi bỏ qua phần này.

Để xuất dữ liệu thành tệp Excel, hãy mở công cụ Dữ liệu SQL Server và tạo dự án SSIS mới có tên Export_Database_Information.

Sau khi dự án được tạo, hãy kéo và thả Thực thi tác vụ SQL vào Luồng kiểm soát cửa sổ và đổi tên nó thành Điền dữ liệu từ máy chủ . Xem hình ảnh sau:

Nhấp đúp vào Thực thi tác vụ SQL (Nhập Dữ liệu từ Máy chủ). Thực thi SQL Task Editor hộp thoại mở ra để cấu hình kết nối SQL. Xem hình ảnh sau:

Trong Kết nối đã nộp, chọn OLEDB chuỗi kết nối và trong Câu lệnh SQL , cung cấp truy vấn sau:

USE monitoringdashboard 
go 
EXEC Generate_database_information

Nhấp vào OK để đóng hộp thoại.

Trên Luồng kiểm soát màn hình, kéo và thả Nhiệm vụ luồng dữ liệu từ Hộp công cụ SSIS và đổi tên nó thành Tạo báo cáo. Xem hình ảnh sau:

Nhấp đúp để mở Luồng dữ liệu cửa sổ.

Như tôi đã đề cập trước đó, Generate_Database_Information thủ tục chèn đầu ra của máy chủ cơ sở dữ liệu trong các bảng sau:

  1. Database_Object_Summery
  2. Database_Summery
  3. SQL_Job_List

Tôi đã tạo một tệp Excel có ba trang tính. Các bảng sau hiển thị ánh xạ của bảng SQL và Trang tính Excel.


Trong Luồng dữ liệu cửa sổ, kéo và thả ba Nguồn ADO.Net và ba điểm đến Excel. Xem hình ảnh sau:

Nhấp đúp vào Tổng điểm đối tượng y (Nguồn ADO.NET) trong Nguồn ADO.NET Biên tập viên.

  1. Chọn TTI412-VM \ SQL2017 Bảng điều khiển theo dõi từ trình quản lý kết nối ADO.NET hộp thả xuống.
  2. Chọn Bảng hoặc Chế độ xem từ Chế độ truy cập dữ liệu hộp thả xuống.
  3. Chọn Database_Object_Summery từ Tên của bảng hoặc chế độ xem hộp thả xuống.

Nhấp đúp vào Thông tin cơ sở dữ liệu (Nguồn ADO.NET) trong Trình chỉnh sửa nguồn ADO.NET .

  1. Chọn “ TTI412-VM \ SQL2017 Bảng điều khiển theo dõi ”Từ trình quản lý kết nối ADO.NET hộp thả xuống.
  2. Chọn Bảng hoặc Chế độ xem từ Chế độ truy cập dữ liệu hộp thả xuống.
  3. Chọn “ Database_Summery ”Từ Tên của bảng hoặc chế độ xem hộp thả xuống.

Nhấp đúp vào Công việc SQL (Nguồn ADO.NET) trong Trình chỉnh sửa nguồn ADO.NET .

  1. Chọn TTI412-VM \ SQL2017 Bảng điều khiển theo dõi trong trình quản lý kết nối ADO.NET.
  2. Chọn Bảng hoặc Chế độ xem từ Chế độ truy cập dữ liệu hộp thả xuống.
  3. Chọn SQL_Job_List trong Tên của bảng hoặc dạng xem hộp thả xuống.

Bây giờ, hãy kéo và thả ba đích Excel từ Hộp công cụ SSIS. Xem hình ảnh sau:

Khi các điểm đến đã được sao chép, hãy kéo mũi tên màu xanh lam bên dưới nguồn ADO.Net và thả nó vào đích Excel. Làm tương tự cho tất cả. Xem hình ảnh sau:

Nhấp đúp vào Tóm tắt đối tượng Excel (Nguồn ADO.NET) trong Trình chỉnh sửa đích đến của Excel .

  1. Chọn Trình quản lý kết nối Excel từ trình quản lý kết nối Excel hộp thả xuống.
  2. Chọn T có thể hoặc Xem từ Chế độ truy cập dữ liệu hộp thả xuống.
  3. Chọn Truy vấn đối tượng $ từ Tên của trang tính excel hộp thả xuống.

Như tôi đã đề cập, tên cột của bảng SQL và cột Excel giống nhau, do đó việc ánh xạ sẽ được thực hiện tự động. Nhấp vào Lập bản đồ để lập bản đồ các cột. Xem hình ảnh sau:

Nhấp đúp vào Thông tin cơ sở dữ liệu Excel (Đích đến của Excel) trong Trình chỉnh sửa đích đến của Excel .

  1. Chọn Trình quản lý kết nối Excel từ trình quản lý kết nối Excel hộp thả xuống.
  2. Chọn T có thể hoặc Xem từ Chế độ truy cập dữ liệu hộp thả xuống.
  3. Chọn Thông tin cơ sở dữ liệu $ từ Tên của trang tính excel hộp thả xuống.

Như tôi đã đề cập, tên cột của bảng SQL và cột Excel giống nhau, do đó việc ánh xạ sẽ được thực hiện tự động. Nhấp vào Lập bản đồ để lập bản đồ các cột. Xem hình ảnh sau:

Nhấp đúp vào Công việc Excel SQL (Đích đến của Excel) trong Trình chỉnh sửa đích đến của Excel .

  1. Chọn Trình quản lý kết nối Excel từ trình quản lý kết nối Excel hộp thả xuống.
  2. Chọn T có thể hoặc Xem từ Chế độ truy cập dữ liệu hộp thả xuống.
  3. Chọn “SQL Jobs $ từ Tên của trang tính Excel hộp thả xuống.

Như tôi đã đề cập, tên cột của bảng SQL và cột Excel giống nhau, do đó việc ánh xạ sẽ được thực hiện tự động. Nhấp vào Lập bản đồ để lập bản đồ các cột. Xem hình ảnh sau:

Tạo một công việc SQL để gửi báo cáo cơ sở dữ liệu qua email

Sau khi gói được tạo, hãy tạo một công việc SQL để thực hiện các hoạt động sau:

  1. Thực thi gói SSIS để điền dữ liệu từ tất cả các máy chủ.
  2. Gửi báo cáo cơ sở dữ liệu qua email cho nhóm được yêu cầu.

Trong SQL Job, chúng ta cần tạo hai bước. Bước đầu tiên sẽ thực thi gói SSIS và bước thứ hai sẽ thực hiện quy trình gửi email.

Để tạo một công việc SQL, hãy mở SSMS>> SQL Server Agent >> Nhấp chuột phải vào Công việc SQL mới .

Ôm Công việc mới trình hướng dẫn, chọn Bước và nhấp vào Ne w. Trong Bước công việc mới trong hộp thoại Bước tên hộp văn bản, cung cấp tên mong muốn, chọn Gói dịch vụ tích hợp máy chủ SQL từ Loại thả cái hộp xuống. Cung cấp vị trí của gói SSIS trong Văn bản gói hộp. Xem hình ảnh sau:

Nhấp vào OK để đóng Bước công việc mới .

Tạo một bước công việc khác sẽ thực hiện một quy trình được lưu trữ để gửi báo cáo qua email. Nó sử dụng một quy trình hệ thống để gửi một email. Gói SSIS sao chép thông tin cơ sở dữ liệu trên một vị trí cụ thể, do đó cung cấp đường dẫn đầy đủ của tệp excel trong tham số @file_attachments của sp_send_dbmail thủ tục được lưu trữ.

Để tạo quy trình được lưu trữ, hãy thực thi mã sau trong Công cụ DBAT cơ sở dữ liệu của Máy chủ Trung tâm:

CREATE PROCEDURE Send_database_report 
AS 
  BEGIN 
      DECLARE @ProfileName VARCHAR(150) 

      SET @ProfileName = (SELECT NAME 
                          FROM   msdb..sysmail_profile 
                          WHERE  profile_id = 7) 

      DECLARE @lsMessage NVARCHAR(max) 

      SET @lsMessage = '<p style="font-family:Arial; font-size:10pt">   Hello Support,   Please find attached database summery report.      ' + '</p>' 

      EXEC msdb.dbo.Sp_send_dbmail 
        @recipients='[email protected]', 
        @[email protected], 
        @subject='Database Summery Report', 
        @file_attachments= 
      'C:\Users\Administrator\Desktop\Database_Information.xlsx', 
        @copy_recipients='', 
        @blind_copy_recipients='', 
        @body_format='HTML', 
        @[email protected] 
  END

Once the procedure is created, add a new SQL Job bước chân. Click New . In the New Job Step dialog box, provide a Job Step name, and select Transact-SQL script (T-SQL) from the Type thả cái hộp xuống. In the Command Text box, write the following code:

USE DBAtools 
Go 

EXEC Send_database_report

Xem hình ảnh sau:

Click OK to close the wizard. Now to configure Job Schedule , select Schedules on the New Job cửa sổ. Click New to add a schedule.

In the New Job Schedule dialog box, provide the desired name in the Name text box, choose frequency and time. Xem hình ảnh sau:

Close OK to close the New Job Schedule and in the New Job window, click on OK to close the dialog box.

Now, to test the SQL Job, right-click the Email Database Report SQL job and click Start Job at Step .

In the result of successful completion of the SQL Job, you will receive an email with the database report. Xem hình ảnh sau:

Tóm tắt

In this article I have covered as follows:

  1. How to populate information of the databases located on remote DB server.
  2. Create an SSIS package to populate database information and export it to excel file
  3. Create a multi-step SQL job to generate the report by executing an SSIS package and email the report.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Intel có bị diệt vong trong không gian CPU máy chủ không?

  2. SQL ngoại trừ

  3. SQL Azure:Cơ sở dữ liệu XXXYYY trên máy chủ hiện không khả dụng

  4. Các nguyên tắc cơ bản về biểu thức bảng, Phần 1

  5. Cách tránh chèn các bản ghi trùng lặp trong truy vấn SQL INSERT (5 cách dễ dàng)