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:
- Tạo các thủ tục được lưu trữ bắt buộc trên TTI609-VM1 , TTI609-VM2, và 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.
- 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 và TTI609-VM2 máy chủ và lưu trữ chúng trong các bảng liên quan.
- 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.
-
- 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 và 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 và 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.
- Tên cơ sở dữ liệu.
- Mức độ tương thích với cơ sở dữ liệu.
- Trạng thái của cơ sở dữ liệu (ONLINE / OFFLINE / RESTORING / SUSPEND).
- Mô hình khôi phục cơ sở dữ liệu (SIMPLE / FULL / BULK-LOGGED).
- Kích thước cơ sở dữ liệu tính bằng MB.
- Tổng Kích thước Tệp Dữ liệu.
- Kích thước tệp dữ liệu đã sử dụng.
- Tổng kích thước tệp nhật ký.
- 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:
- Máy chủ / Tên máy chủ.
- Tên cơ sở dữ liệu.
- 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.)
- 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:
- Máy chủ / Tên máy chủ.
- Tên công việc SQL.
- Chủ sở hữu Công việc SQL.
- Loại công việc.
- Mô tả Công việc.
- Trạng thái Công việc (Đã bật / tắt)
- Ngày tạo việc làm.
- Ngày sửa đổi công việc.
- Trạng thái công việc đã lên lịch.
- Tên lịch biểu.
- Ngày và giờ thực hiện cuối cùng
- 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 và 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 và 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 và 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 và 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:
- Database_Object_Summery
- Database_Summery
- 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.
- 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.
- Chọn Bảng hoặc Chế độ xem từ Chế độ truy cập dữ liệu hộp thả xuống.
- 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 .
- 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.
- Chọn Bảng hoặc Chế độ xem từ Chế độ truy cập dữ liệu hộp thả xuống.
- 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 .
- 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.
- Chọn Bảng hoặc Chế độ xem từ Chế độ truy cập dữ liệu hộp thả xuống.
- 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 .
- 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.
- Chọn T có thể hoặc Xem từ Chế độ truy cập dữ liệu hộp thả xuống.
- 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 .
- 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.
- Chọn T có thể hoặc Xem từ Chế độ truy cập dữ liệu hộp thả xuống.
- 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 .
- 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.
- Chọn T có thể hoặc Xem từ Chế độ truy cập dữ liệu hộp thả xuống.
- 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:
- Thực thi gói SSIS để điền dữ liệu từ tất cả các máy chủ.
- 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:
- How to populate information of the databases located on remote DB server.
- Create an SSIS package to populate database information and export it to excel file
- Create a multi-step SQL job to generate the report by executing an SSIS package and email the report.