`
javaPrimary
  • 浏览: 60857 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Mysql监控方法之一

阅读更多
业务系统最终都会反馈到DB上,观察DB变化,可以知道业务系统的处理逻辑和处理方法。下面的代码,用来对MYSQL所有表建立触发器,结合JSP可以观察到DB的变化。附件是效果图。
引用
下面的SQL脚本,做两件事,生成存储记录变化的表,和生成触发器SQL的存储过程

drop TABLE if EXISTS zz_modify;
CREATE TABLE `zz_modify` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` text,
  `createtime` datetime DEFAULT NULL,
  `tablename` varchar(4000) DEFAULT NULL,
  `oprtype` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- 存储过程,用来生成删除触发器的SQL。
drop PROCEDURE if EXISTS p_droptrgs;
CREATE PROCEDURE `p_droptrgs`()
BEGIN 
-- 定义变量 
declare tab_name varchar(400); 
declare tmp_tabschema varchar(400) DEFAULT 'rmp_2'; 
declare v_sql_all text DEFAULT ''; 
declare cur_tab_done int DEFAULT 0; 

-- 定义所有表的遍历游标
DECLARE cur_tab cursor for select table_name from information_schema.`TABLES` where TABLE_SCHEMA = tmp_tabschema and TABLE_NAME != 'zz_modify';

-- 将结束标志绑定到游标
declare continue handler FOR SQLSTATE '02000' SET cur_tab_done = 1; 

-- 打开游标
OPEN cur_tab;
REPEAT
    FETCH cur_tab into tab_name;
    -- call p_createtrgsbytable(tmp_tabName, tmp_tabschema);
    set v_sql_all = CONCAT(v_sql_all,'drop trigger if EXISTS  trg_insert_', tab_name, '; \n');
    set v_sql_all = CONCAT(v_sql_all,'drop trigger if EXISTS  trg_update_', tab_name, '; \n');
    set v_sql_all = CONCAT(v_sql_all,'drop trigger if EXISTS  trg_delete_', tab_name, '; \n');
    UNTIL cur_tab_done
end REPEAT;
CLOSE cur_tab;

select v_sql_all;

END;

drop FUNCTION if EXISTS f_createtrgsbytable;
CREATE  FUNCTION `f_createtrgsbytable`(tab_name varchar(400), tab_schema varchar(400)) RETURNS text CHARSET utf8
    DETERMINISTIC
BEGIN 
-- 定义变量 
declare tmp_col_name varchar(4000); 
DECLARE v_sql_all longtext DEFAULT '';
declare v_sql_insert longtext DEFAULT ''; 
declare v_sql_update longtext DEFAULT ''; 
declare v_sql_delete longtext DEFAULT ''; 


declare cur_tab_done int DEFAULT 0; 

-- 定义所有表的遍历游标
DECLARE cur_tab cursor for select COLUMN_NAME from information_schema.`COLUMNS` where table_name = tab_name and TABLE_SCHEMA = tab_schema;

-- 将结束标志绑定到游标
declare continue handler FOR SQLSTATE '02000' SET cur_tab_done = 1; 

set v_sql_insert = CONCAT(v_sql_insert,'drop trigger if EXISTS  trg_insert_', tab_name, ';');
set v_sql_update = CONCAT(v_sql_update,'drop trigger if EXISTS  trg_update_', tab_name, ';');
set v_sql_delete = CONCAT(v_sql_delete,'drop trigger if EXISTS  trg_delete_', tab_name, ';');

set v_sql_insert = concat(v_sql_insert, 'create trigger trg_insert_', tab_name, ' after insert on ', tab_name, ' for each row begin insert into zz_modify(content, createtime, tablename, oprtype) value(concat(');
set v_sql_update = concat(v_sql_update, 'create trigger trg_update_', tab_name, ' after update on ', tab_name, ' for each row begin insert into zz_modify(content, createtime, tablename, oprtype) value(concat(');
set v_sql_delete = concat(v_sql_delete, 'create trigger trg_delete_', tab_name, ' after delete on ', tab_name, ' for each row begin insert into zz_modify(content, createtime, tablename, oprtype) value(concat(');

-- 打开游标
OPEN cur_tab;
REPEAT
    FETCH cur_tab into tmp_col_name;
    set v_sql_insert = CONCAT(v_sql_insert, '\'#&old.', tmp_col_name, '=\',',  '\'-\'', ',\'~new.', tmp_col_name, '=\',', 'IFNULL(new.', tmp_col_name, ', \'nu-ll\'),');
    set v_sql_update = CONCAT(v_sql_update, '\'#&old.', tmp_col_name, '=\',',  'IFNULL(old.', tmp_col_name, ', \'nu-ll\') ,\'~new.', tmp_col_name, '=\',', 'IFNULL(new.', tmp_col_name, ', \'nu-ll\'),');
    set v_sql_delete = CONCAT(v_sql_delete, '\'#&old.', tmp_col_name, '=\',',  'IFNULL(old.', tmp_col_name, ', \'nu-ll\') ,\'~new.', tmp_col_name, '=\',', '\'-\'', ',');
    UNTIL cur_tab_done
end REPEAT;
CLOSE cur_tab;

-- 截取处理
set v_sql_insert = CONCAT(SUBSTRING(v_sql_insert,1,LENGTH(v_sql_insert) - 1), ') ,now(), \'', tab_name, '\', \'insert\' ); end;\n');
set v_sql_update = CONCAT(SUBSTRING(v_sql_update,1,LENGTH(v_sql_update) - 1), ') ,now(), \'', tab_name, '\', \'update\' ); end;\n');
set v_sql_delete = CONCAT(SUBSTRING(v_sql_delete,1,LENGTH(v_sql_delete) - 1), ') ,now(), \'', tab_name, '\', \'delete\' ); end;\n');

return CONCAT(v_sql_insert,v_sql_update,v_sql_delete);

END;

-- 执行存储过程,用来生成产生触发器的SQL。
drop PROCEDURE if EXISTS p_createtrgs;
CREATE PROCEDURE `p_createtrgs`()
BEGIN 
-- 定义变量 
declare tmp_tabName varchar(400); 
declare tmp_tabschema varchar(400) DEFAULT 'rmp_2'; 
declare v_sql_all longtext DEFAULT ''; 
declare cur_tab_done int DEFAULT 0; 

-- 定义所有表的遍历游标
DECLARE cur_tab cursor for select table_name from information_schema.`TABLES` where TABLE_SCHEMA = tmp_tabschema and TABLE_NAME != 'zz_modify';

-- 将结束标志绑定到游标
declare continue handler FOR SQLSTATE '02000' SET cur_tab_done = 1; 

-- 打开游标
OPEN cur_tab;
REPEAT
    FETCH cur_tab into tmp_tabName;
    -- call p_createtrgsbytable(tmp_tabName, tmp_tabschema);
    set v_sql_all = CONCAT(v_sql_all, f_createtrgsbytable(tmp_tabName, tmp_tabschema), '\n');
    UNTIL cur_tab_done
end REPEAT;
CLOSE cur_tab;


select v_sql_all;

END;


引用
JSP脚本,用来观察数据变化

<!--首先导入一些必要的packages-->
<%@page import="java.text.MessageFormat"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<!--告诉编译器使用SQL包-->
<%@ page import="java.sql.*" %>
<%@ page import="com.mysql.*" %>
<!--设置中文输出-->
<%@ page contentType="text/html; charset=UTF-8"%>

<html>
<head>
<title>数据变动观察</title>
<link rel="shortcut icon" href="http://a.fsdn.com/con/img/sftheme/favicon.ico">
</head>
<body>
 <div style="margin:10px;width:100%;heigth:50px;">
    <a href="del_modify.jsp"  style="margin:0 5 0 5;">清理所有数据 </a>
    <a href="comp.jsp" style="margin:0 5 0 5;">查询数据变化</a>
</div>

	<%
		Connection con;
		Statement stmt;
		ResultSet rs;

		//加载驱动程序,下面的代码为加载MySQL驱动程序 
		Class.forName("com.mysql.jdbc.Driver");

		//注册MySQL驱动程序 
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());

		//用适当的驱动程序连接到数据库 
		//String dbUrl = "jdbc:mysql://172.16.34.12:3306/cec?user=root&password=abcd1001&useUnicode=true&characterEncoding=UTF-8";
		//String dbUser = "cec"; //用户名 
		//String dbPwd = "cec"; //密码 
		
		String dbUrl = "jdbc:mysql://192.168.9.139:3306/cec_yxt?user=root&password=abcd1001&useUnicode=true&characterEncoding=UTF-8";
		String dbUser = "root"; //用户名 
		String dbPwd = "123456"; //密码 
		//建立数据库连接 
		con = java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPwd);

		//创建一个JDBC声明 
		stmt = con.createStatement();

		//查询记录 
		rs = stmt.executeQuery("select id,content,createtime,tablename,oprtype from zz_modify");

		//输出查询结果 
		
		int idx = 0;
		while (rs.next())
		{
			String content = rs.getString("content");
			String createtime = rs.getString("createtime");
			String tablename = rs.getString("tablename");
			String oprtype = rs.getString("oprtype");
			
			out.println("<table border=1  width='80%' style='margin-left:auto;margin-right:auto;margin-top:10px;margin-bottom:10px;'>");
			out.println(MessageFormat.format("<caption style='margin-top:10px;margin-bottom:10px;'>第【{0}】次表【{1}】在【{2}】被修改【{3}】。</caption>", ""+(++idx), tablename, createtime, oprtype));
			
			if (content == null || "".equals(content))
			{
				//打印所显示的数据 
				out.println("<tr width='100%'>"
						+ "<td width='100%'>没有获取到修改内容。</td>"
						+ "</tr>");
			}
			else
			{
				// 打印 表头 
				out.println("<tr width='100%' style='word-break: break-all;'>"
				        + "<th width='5%'> 表字段 </td>"
						+ "<th width='20%'> 旧的值 </td>"
						+ "<th width='10%'> 新的值 </td>"
						+ "</tr>");
				
				StringTokenizer st = new StringTokenizer(content, "#&");
				while (st.hasMoreTokens())
				{
					String row = st.nextToken();
					String[] rowarr = row.split("~");
					String oldContent = rowarr[0];
					String newContent = rowarr[1];
					String fieldName = oldContent.substring(oldContent.indexOf('.') + 1, oldContent.indexOf('='));
					String oldValue = oldContent.substring(oldContent.indexOf('=') + 1);
					String newValue = newContent.substring(newContent.indexOf('=') + 1);
				    
					if (newValue.equals(oldValue))
					{
						//打印所显示的数据 
						out.println("<tr width='100%' style='word-break: break-all;'>"
						        + "<td width='5%'>" + fieldName + "</td>"
								+ "<td width='20%'>" + oldValue + "</td>"
								+ "<td width='10%'>" + newValue + "</td>"
								+ "</tr>");
					}
					else
					{
						//打印所显示的数据 
						out.println("<tr width='100%' style='word-break: break-all;color:red;'>"
						        + "<td width='5%'>" + fieldName + "</td>"
								+ "<td width='20%'>" + oldValue + "</td>"
								+ "<td width='10%'>" + newValue + "</td>"
								+ "</tr>");
					}
				}
				
			}
			
			out.println("</table>");
		}
		

		//关闭数据库连结 
		rs.close();
		stmt.close();
		con.close();
	%>
</body>
</html>

引用
JSP脚本,用来删除记录表zz_modify中所有的数据的。

<!--首先导入一些必要的packages-->
<%@page import="java.text.MessageFormat"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<!--告诉编译器使用SQL包-->
<%@ page import="java.sql.*" %>
<%@ page import="com.mysql.*" %>
<!--设置中文输出-->
<%@ page contentType="text/html; charset=UTF-8"%>

 <div style="margin:10px;width:100%;heigth:50px;">
    <a href="del_modify.jsp"  style="margin:0 5 0 5;">清理所有数据 </a>
    <a href="comp.jsp" style="margin:0 5 0 5;">查询数据变化</a>
</div>

	<%
		Connection con;
		Statement stmt;
		ResultSet rs;

		//加载驱动程序,下面的代码为加载MySQL驱动程序 
		Class.forName("com.mysql.jdbc.Driver");

		//注册MySQL驱动程序 
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());

		//用适当的驱动程序连接到数据库 
		//String dbUrl = "jdbc:mysql://172.16.34.12:3306/cec?user=root&password=abcd1001&useUnicode=true&characterEncoding=UTF-8";
		//String dbUser = "cec"; //用户名 
		//String dbPwd = "cec"; //密码 
		
		String dbUrl = "jdbc:mysql://192.168.9.12:3306/cec_for_yxt_test?user=root&password=abcd1001&useUnicode=true&characterEncoding=UTF-8";
		String dbUser = "cec"; //用户名 
		String dbPwd = "n2h@5B_AoP"; //密码 
		//建立数据库连接 
		con = java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPwd);

		//创建一个JDBC声明 
		stmt = con.createStatement();

		//查询记录 
		stmt.execute("delete from zz_modify");
		stmt.close();
		con.close();
	%>
  • 大小: 27.8 KB
分享到:
评论

相关推荐

    MySQL 数据库监控攻略

    - **意义**:内存是影响数据库性能的重要因素之一,内存不足会导致频繁的磁盘交换操作,严重影响性能。 - **监控建议**:合理设置缓冲池大小,确保有足够的内存供数据库使用。 #### 4. 磁盘I/O - **定义**:读写...

    nagios监控mysql主从

    MySQL作为广泛应用的关系型数据库管理系统之一,其主从复制机制是实现高可用性的重要手段。为了确保MySQL主从复制正常运行,利用Nagios进行监控显得尤为重要。 #### 二、环境准备 **环境描述:** - **操作系统:*...

    Python实现监控MySQL性能指标

    QPS(Queries Per Second)是衡量数据库系统处理能力的重要指标之一,它表示每秒钟系统能够处理的查询数量。根据不同的存储引擎,计算方法有所不同: - **对于 MyISAM 引擎为主的数据库**: - `show GLOBAL status ...

    MySQL管理之道 性能调优、高可用与监控 绝对完整PDF版1

    MySQL管理之道 性能调优 高可用与监控 绝对完整PDF版 MySQL作为一款使用极为广泛的开源数据库 被广泛地应用在Internet的中小型网站中 随着MySQL的不断成熟 它也逐渐应用于更多大规模网站中 比如淘宝等 作为MySQL DBA...

    实战:EM Plugin For MySQL 监控

    在数据库管理领域,Oracle Enterprise Manager(简称EM)是业界广泛使用的管理工具之一。EM Plugin 的开发能够帮助用户更好地监控与管理MySQL数据库,提升其稳定性和性能表现。选择开发EM Plugin的主要原因有以下几...

    mysql监控告警_MYSQL_告警_监控

    MySQL是世界上最流行的关系型数据库管理系统之一,用于存储和管理数据。在复杂的系统环境中,确保MySQL的稳定运行至关重要,这就需要实施有效的监控和告警机制。本文将深入探讨MySQL的监控告警,以及如何通过shell...

    php-MySQL监控系统.zip

    首先,实时MySQL健康监控是这个系统的核心功能之一。通过定期检查数据库的状态,如连接数、内存使用、查询缓存等,可以及时发现并解决可能的问题,确保数据库的稳定运行。监控系统会显示关键指标,如InnoDB缓冲池...

    自动化运维之用Zabbix+mysql制作 监控SVN主从版本号是否一致的脚本.zip

    在IT运维领域,自动化是提升效率的关键之一。本教程将详细介绍如何利用Zabbix结合MySQL来创建一个监控系统,用于检查SVN(Subversion)主从版本库的版本一致性。通过这个自动化监控脚本,我们可以及时发现并处理版本...

    Zabbix结合插件percona监控Mysql数据模板

    在我们的场景中,"Zabbix结合插件percona监控Mysql数据模板"是一个为Zabbix 3.0及以上版本设计的预配置模板,用于监控MySQL数据库的性能指标。 Percona是一个提供高性能MySQL解决方案的公司,其开发了一系列工具,...

    MySQL王者晋级之路_MySql王者晋级之路_

    "MySQL王者晋级之路"是一部旨在帮助用户提升MySQL技能的内部资料,它涵盖了从基础到高级的各种主题,助你一步步攀登数据库技术的高峰。 首先,理解MySQL的基础知识至关重要。MySQL是一款开源的关系型数据库管理系统...

    MYSQl监控的MONyog

    MySQL是世界上最受欢迎的开源数据库管理系统之一,而MONyog是一款专为MySQL监控设计的强大工具,由Webyog公司开发。MONyog可以帮助DBA(数据库管理员)和开发人员实时了解MySQL服务器的运行状态,以便优化性能、排查...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

    zabbix监控的模板-Template App MySQL

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,广泛应用于Web应用和企业级数据存储。 该模板包含了一系列预定义的监控项、触发器、图形和屏幕,旨在提供全面的MySQL监控功能。通过使用Template App MySQL,...

    php&mysql;监控源码

    MySQL是全球最受欢迎的开源数据库之一,具备高可靠性、高性能和易用性。在物联网监控系统中,MySQL用于存储各种设备的元数据(如设备ID、类型等)以及收集到的实时数据(如温度、湿度、电量等)。通过精心设计的数据...

    MySQL性能监控:守护数据库健康的哨兵

    - **Percona Monitoring and Management (PMM)**:一款开源的MySQL监控工具,适用于复杂环境下的监控需求。 - **Nagios**:开源的监控系统,能够有效监控数据库性能。 - **Prometheus + Grafana**:Prometheus用于...

    这是我用C语言写的一个小的mysql监控程序编译了4个版本需要用到mysql的库文件.zip

    2. **MySQL数据库**:MySQL是世界上最流行的开源关系型数据库管理系统之一,广泛应用于Web应用、数据分析等领域。它的API和客户端库使得开发者能够方便地在各种编程语言中与MySQL交互。 3. **数据库监控**:数据库...

    曹金成:mysql运行监控全解

    MySQL数据库作为世界上最流行的开源关系型数据库管理系统之一,其稳定性和性能对业务至关重要。有效的运行监控是确保MySQL高效、可靠运行的关键环节。本篇将深入探讨MySQL运行监控的相关知识点,帮助你更好地理解和...

Global site tag (gtag.js) - Google Analytics