mysql log table_mysqlbinlog功能扩展--table参数

目的

mysqlbinlog在分析mysql的binlog日志时,有时需要针对某个表的操作进行分析。但是这个表属于“冷数据”,操作记录相对较少,而其他表操作往往很频繁,binlog日志量特别大。尤其是当binlog的模式设置为ROW时,情况就更加严重了,往往如大海捞针。为了提高获取binlog日志的有效性,对mysqlbinlog功能进行扩展,增加table参数,分析指定数据库的表操作记录。

实现

以下实现基于MySQL 5.5.18源码,实现思路:参考--database参数的逻辑;修改原则:尽量少的变更MySQL源码,尽可能的优雅实现。

1、增加全局变量

首先增加两个全局变量,用于存储table参数的状态和table的值,具体如下所示:

/* One table to filter out (Added by wangheng, email to wangheng.wh@alibaba-inc.com.).*/

staticbool one_table=0;

staticchar* table_name = 0;

2、增加过滤函数

过滤函数主要是根据one_table状态和table的值,比较当前事件涉及的表是否需要获取。具体如下所示:

/*

* Check the given table should be filtered out, according to the --table=X option

* @param

*     log_tbname: Name of table.

* @return

*     0 : Skip.

*     N: Filtered out.

* @author:  wangheng

* @email  : wangheng.wh@alibaba-inc.com

*/

staticbool shall_skip_table(const char *log_tbname)

{

return one_table &&

(log_tbname != NULL) &&

strcmp(log_tbname, table_name);

}

3、增加调用逻辑

分析发现,有表信息的Log_event结构有:Table_map_log_event和Create_file_log_event两个结构,其中Table_map_log_event仅在ROW模式下有效,Create_file_log_event是在Load data时调用。为了尽快能少的减少修改引入的新问题,逻辑处理仅对这两个部分增加过滤函数的逻辑调用。具体如下:

case CREATE_FILE_EVENT:

{

Create_file_log_event* ce= (Create_file_log_event*)ev;

if (shall_skip_database(ce->db)

/* Filtered out the events of given table. (Added by wangheng, email to wangheng.wh@alibaba-inc.com) */

|| shall_skip_table(ce->table_name))

……

case TABLE_MAP_EVENT:

{

Table_map_log_event *map= ((Table_map_log_event *)ev);

if (shall_skip_database(map->get_db_name())

/* Filtered out the events of given table.(Added by wangheng, email to wangheng.wh@alibaba-inc.com.). */

|| shall_skip_table(map->get_table_name()))

4、增加输入参数选项

在my_long_options参数选项中增加输入参数--table/-T,用于设置过滤的表名。具体如下:

/*Add the -T/--table option. (Added by wangheng, email to wangheng.wh@alibaba-inc.com.)*/

{"table", 'T', "List entries for just this table in given database of -d/--database option. (row mode only).",

&table_name, &table_name, 0, GET_STR_ALLOC, REQUIRED_ARG,

0, 0, 0, 0, 0, 0},

5、释放参数变量

因为table_name参数选项,在处理时分配了内存空间,在cleanup()函数中,释放table_name变量。具体如下:

/* Free the table name. (Added by wangheng, email to wangheng.wh@alibaba-inc.com.)*/

my_free(table_name);

6、设置标记变量

在table参数设置后,通过one_table变量标记当前有表需要过滤,从而在shall_skip_table()时过滤表操作记录。需要在get_one_option()函数中,设置one_table变量。具体如下:

/* Set the table filter flag. (Added by wangheng, email to wangheng.wh@alibaba-inc.com.)*/

case't':

one_table = 1;

break;

以上过程,尽可能少的对MySQL源码进行修改,扩展部分尽可能保证不影响正常的处理逻辑。

PATCH

为了方便使用mysqlbinlog的扩展功能,基于MySQL 5.5.18官方源码修改,patch发布在github上分享。

patch发布在:

相关的说明文档:

结论:

通过扩展mysqlbinlog功能,增加-T/--table参数,设置过滤数据表的操作记录,提高mysqlbinlog获取数据的有效性,减少分析数据的范围。然而,由于Query_log_event事件类型中没有提供tables信息,导致binlog在MIX和STATEMENT模式下,不能尽可能的过滤有效操作记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python递归迭代_Python入门基础知识点(python迭代器和递归)

函数名的使用:函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量函数名的内存地址:deffunc():passprint(func) #函数的内存地址结果:函数名可以赋值给其他变量:deffunc():print(1)afunca()func()#函数名可以…

怎么调处vs2010的MSDN帮助文档

如果装的是vs2010专业版的话 直接按F1直接可调出在线的帮助 直接按F2可以调出本机版的 转载于:https://www.cnblogs.com/fag888/p/5789159.html

redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange

namespace app\admin\controller;use think\cache\driver\Redis;use think\Controller;use \think\Db;class Index extends Controller{//获取redispublic function getRedis(){$redis new \Redis();$redis->connect(127.0.0.1,6379);$redis->auth(root); //redis密码ec…

如何写好博客

好的博客是用来解决问题的,每一篇文章都应该以如何解决问题为驱动力,而不是知识点的累加,比如说之前写的[MVC]系列,均为知识点的堆积,没有例子和代码,也没有说明问题,这样的文章,基本…

云服务器建站原理_云服务器cvm与建站主机之间的区别

(文章来源:西部数码)云服务器cvm与建站主机区别是什么?cvm的英文全拼是CloudVirtualMachine(云虚拟机),所以云服务器cvm是指虚拟云服务器,属于云服务器产品中的一种。而建站主机一般多是指虚拟主机,是在服务器中划分出…

Magento--判断checkout中是否使用了coupon code

在checkout页面中&#xff0c;如果想判断顾客是否有使用coupon code&#xff0c;可以通过checkout session来进行判断。以下代码会返回checkout中使用的coupon code或者返回空&#xff08;当没有使用coupon code时&#xff09; 1 <?php 2 3 $coupon_code Mage::getSingl…

启动python内核时发生错误_启动内核时出错

我一直看到这个消息。在An error ocurred while starting the kernelTraceback (most recent call last):File "C:\Users\Excel\Anaconda3\lib\runpy.py", line 193, in _run_module_as_main"__main__", mod_spec)File "C:\Users\Excel\Anaconda3\lib…

Scala笔记

1、伴生对象 形如&#xff1a; 有一个类 class Test{ } 一个object和该类同名 object Test{ } object Test的作用类似于静态类&#xff08;工具类&#xff09;&#xff0c;其中的所有成员都是静态的&#xff0c;在object Test中可以直接访问class Test的成员&#xff1b;…

maven找到mysql 连接池_在Tomcat6.0+MySQL5.0环境下配置和使用数据库连接池

一&#xff0c;在Tomcat中配置连接池的JNDI首先到MySQL的网站上下载MySQL JDBC连接器放到%CATALINA_HOME%/lib目录下&#xff0c;在%CATALINA_HOME%/conf目录下找到context.xml&#xff0c;这个文件是全局的&#xff0c;如果想只对特定的应用使用可以编辑WEB-INF/context.xml文…

mysql将多个成绩放在一排_mysql巧用连表查询各科成绩前三名

下列是各表的详情&#xff0c;不想自己建表的同学可以直接copy code&#xff0c;数据随意。创建表成绩详情表&#xff1a;CREATE TABLE score (id int(10) NOT NULL AUTO_INCREMENT,subject_id int(10) DEFAULT NULL,student_id int(10) DEFAULT NULL,score float DEFAULT NULL…

Oracle 跨库 查询 复制表数据 分布式查询

方法一&#xff1a; 在眼下绝大部分数据库有分布式查询的须要。以下简单的介绍怎样在oracle中配置实现跨库訪问。比方如今有2个数据库服务器&#xff0c;安装了2个数据库。数据库server A和B。如今来实如今A库中訪问B的数据库。 第一步、配置Aserver端的tnsnames.ora文件&#…

java 匹配mysql按钮_使用Java在mysql查询中设置匹配函数

我有以下在java中查询(mysql)的摘录&#xff1a;queryGeral.append("FROM product p, fabricante_product fp, fabricante f, extensao e, product_autor pa ").append(" WHERE ").append("a.nome like ? AND ").append("p.cod_material …

LeetCode Contains Duplicate (判断重复元素)

题意&#xff1a; 如果所给序列的元素不是唯一的&#xff0c;则返回true&#xff0c;否则false。 思路&#xff1a; 哈希map解决。 1 class Solution {2 public:3 bool containsDuplicate(vector<int>& nums) {4 unordered_map<int,int> mapp;5 …

提高团队代码质量

近期看到一篇博客。大致的意思就是网管将原本混乱不堪的交换机整理整齐了&#xff0c;起初交换机是图2那样的&#xff0c;由于越来用的人越多&#xff0c;操作的人越来越多。终于成为了图1那个样子。这不禁让我想到了项目中的代码。原先在刚上线的时候谈不上是完美的&#xff0…

webrender 查看是否开启_想要体验极致顺滑的网页加载体验?手动开启Firefox WebRender渲染引擎...

昨天我们提到火狐浏览器最新稳定版Mozilla Firefox v67 版将面向部分用户开启WebRender渲染引擎测试。据火狐浏览器团队介绍当用户开启新的渲染引擎后 , 网页加载帧率能够从现有的 20FPS 直接提升到 60FPS。不过新的渲染引擎本身并不是用于加快网页的加载速度&#xff0c;而是…

NOIP201307货车运输

试题描述A 国有n座城市&#xff0c;编号从1到n&#xff0c;城市之间有m条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。现在有q辆货车在运输货物&#xff0c;司机们想知道每辆车在不超过车辆限重的情况下&#xff0c;最多能运多重的货物。输入第一行有两个用一…

knime如何连接mysql_knime怎么连接MySQL?

首先判断一下网络是否通&#xff1a;如果在局域网相同网段内那网络是通的&#xff0c;不同网段间需要看是否有做隔离&#xff0c;如果没有隔离&#xff0c;那就也是通的。测试方法可以用telnet 数据库IP 数据库端口号的方式探测一下 例如 telnet 192.168. 1.124 3306创建用户&a…

Asp.net Vnext IValueProvider

概述 本文已经同步到《Asp.net Vnext 系列教程 》中] IValueProvider 根据ValueProvider获取数据&#xff0c;在对数据进行绑定 代码实现 private class CustomValueProvider : IValueProvider{//判断否具有指定的前缀public Task<bool> ContainsPrefixAsync(string pref…

ECNUOJ 2615 会议安排

会议安排 Time Limit:1000MS Memory Limit:65536KBTotal Submit:451 Accepted:102 Description 科研人员与相关领域的国内外同行进行适时的接触与充分的交流&#xff0c;对于促进提高他们的科研业务水平&#xff0c;并及时掌握科研动态是十分必要而且重要的。ECNU为了走在科技…

Kafka架构设计:分布式发布订阅消息系统

【http://www.oschina.net/translate/kafka-design】&#xff08;较长&#xff1a;很详细的讲解&#xff09; 【我们为什么要搭建该系统】用作LinkedIn的活动流&#xff08;activity stream&#xff09;和运营数据处理管道&#xff08;pipeline&#xff09;的基础。作为多种类型…