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.pswp.cn/news/273159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273159.shtml
英文地址,請注明出處:http://en.pswp.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;的基礎。作為多種類型…