虽然Azure sql database有DMVs可以查看DTU等使用情况,但记录有时间限制,不会一直保留。为了更好监控Azure_sql_database上各个库的DTU使用情况、数据库磁盘使用情况、阻塞等情况。通过本地的Agent的job使用link server 链接到各个Azure sql database 对应库(本地Ip能直连azure sql database),把相关的信息读取出来,存储在本地已新建好的对应表中,通过分析本地对应表中记录来实现监控azure sql database各个库的情况。如需了解azure sql database 与 ssms在开发上的一些区别。
基本思路:
第一步:本地库中新建好相应的表用来存放从azure sql database 上读取的记录;
第二步:在本地实例中新建好各个对应azure sql database 各个库的数据库链接,并把相关信息存放在azure_dblink_configure表中;
第三步:在本地库中新建好存储过程用来处理azure sql database上的记录存储在本地对应的表中;
第四步:在本地数据库的代理中新建job通过计划循环调用存储过程;
本地测试环境:
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
具体实现步骤:
第一步:新建库新建表
1 --新建保存监控记录的库 2 IF DB_ID('azure_monitor') IS NOT NULL 3 DROP DATABASE azure_monitor; 4 GO 5 CREATE DATABASE azure_monitor; 6 GO 7 USE azure_monitor; 8 GO 9 --在保存监控记录的库上新建如下表: 10 IF OBJECT_ID('azure_dblink_configure','U') IS NOT NULL 11 DROP TABLE azure_dblink_configure; 12 13 CREATE TABLE azure_dblink_configure 14 ( 15 id INT IDENTITY(1, 1) , 16 dblink NVARCHAR(200) NOT NULL , --dblink 17 dbname NVARCHAR(50) NOT NULL , 18 descriptions NVARCHAR(200) , --描述 19 okflag BIT DEFAULT ( 1 ) 20 NOT NULL , ---1启用,0停用 21 createuser NVARCHAR(20) , --创建人 22 createdate DATETIME DEFAULT ( GETDATE() ) 23 NOT NULL , --创建时间 24 updatedate DATETIME DEFAULT ( GETDATE() ) 25 NOT NULL ---更新时间 26 ); 27 ALTER TABLE azure_dblink_configure ADD CONSTRAINT PK_azure_dblink_configure PRIMARY KEY(dblink,dbname); 28 29 --监控存储空间表 30 IF OBJECT_ID('monitor_azure_spaceused','U') IS NOT NULL 31 DROP TABLE monitor_azure_spaceused; 32 33 CREATE TABLE monitor_azure_spaceused 34 ( 35 id INT IDENTITY(1, 1) 36 PRIMARY KEY , 37 dblink NVARCHAR(200), 38 database_name VARCHAR(200) , 39 [sum_database(G)] decimal(18, 2), 40 execute_time_beijing DATETIME, 41 create_time DATETIME DEFAULT(GETDATE()) 42 ); 43 44 --监控DTU等情况表 45 IF OBJECT_ID('monitor_azure_DTU', 'U') IS NOT NULL 46 DROP TABLE monitor_azure_DTU; 47 48 CREATE TABLE monitor_azure_DTU 49 ( 50 id INT IDENTITY(1, 1) 51 PRIMARY KEY , 52 dblink NVARCHAR(200), 53 database_name VARCHAR(200) , 54 beijin_end_time DATETIME NULL , 55 avg_cpu_percent DECIMAL NULL , 56 avg_data_io_percent DECIMAL NULL , 57 avg_log_write_percent DECIMAL NULL , 58 avg_memory_usage_percent DECIMAL NULL , 59 xtp_storage_percent DECIMAL NULL , 60 max_worker_percent DECIMAL NULL , 61 max_session_percent DECIMAL NULL , 62 dtu_limit INT NULL , 63 create_time DATETIME DEFAULT ( GETDATE() ) 64 ); 65 66 CREATE INDEX IX_monitor_azure_DTU ON monitor_azure_DTU ([database_name]) INCLUDE ([beijin_end_time]); 67 68 --监控阻塞表 69 IF OBJECT_ID('monitor_azure_blocked', 'U') IS NOT NULL 70 DROP TABLE monitor_azure_blocked; 71 72 CREATE TABLE monitor_azure_blocked 73 ( 74 id INT IDENTITY(1, 1) 75 PRIMARY KEY , 76 dblink NVARCHAR(200), 77 dbname VARCHAR(200) , 78 spid SMALLINT NOT NULL , 79 kpid SMALLINT NOT NULL , 80 blocked SMALLINT NOT NULL , 81 waittype [VARCHAR](MAX) NOT NULL , 82 waittime BIGINT NOT NULL , 83 lastwaittype NCHAR(32) NOT NULL , 84 waitresource NCHAR(256) NOT NULL , 85 dbid SMALLINT NOT NULL , 86 uid SMALLINT NULL , 87 cpu INT NOT NULL , 88 physical_io BIGINT NOT NULL , 89 memusage INT NOT NULL , 90 login_time DATETIME NOT NULL , 91 last_batch DATETIME NOT NULL , 92 ecid SMALLINT NOT NULL , 93 open_tran SMALLINT NOT NULL , 94 status NCHAR(30) NOT NULL , 95 sid [VARCHAR](MAX) NOT NULL , 96 hostname NCHAR(128) NOT NULL , 97 program_name NCHAR(128) NOT NULL , 98 hostprocess NCHAR(10) NOT NULL , 99 cmd NCHAR(16) NOT NULL , 100 nt_domain NCHAR(128) NOT NULL , 101 nt_username NCHAR(128) NOT NULL , 102 net_address NCHAR(12) NOT NULL , 103 net_library NCHAR(12) NOT NULL , 104 loginame NCHAR(128) NOT NULL , 105 context_info [VARCHAR](MAX) NOT NULL , 106 sql_handle [VARCHAR](MAX) NOT NULL , 107 stmt_start INT NOT NULL , 108 stmt_end INT NOT NULL , 109 request_id INT NOT NULL , 110 [text] NVARCHAR(max), 111 createtime DATETIME DEFAULT ( GETDATE() ) 112 );