婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Mysql數據庫監聽binlog的開啟步驟

Mysql數據庫監聽binlog的開啟步驟

熱門標簽:銅陵防封電銷卡 福建外呼系統定制化 美國反騷擾電話機器人 真人語音電話機器人 電銷卡外呼系統供應商 怎么在地圖標注位置生成圖片 400電話可以免費申請嗎 悟空科技電話機器人 騰訊地圖標注提升

前言

我們經常需要根據用戶對自己數據的一些操作來做一些事情.

比如如果用戶刪除了自己的賬號,我們就給他發短信罵他,去發短信求他回來.

類似于這種功能,當然可以在業務邏輯層實現,在收到用戶的刪除請求之后執行這一操作,但是數據庫的binlog為我們提供了另外一種操作方法.

要監聽binlog,需要兩步,第一步當然是你的mysql需要開啟這一個功能,第二個是要寫程序來對日志進行讀取.

mysql開啟binlog.

首先mysql的binlog日常是不打開的,因此我們需要:

找到mysql的配置文件my.cnf,這個因操作系統不一樣,位置也不一定一樣,可以自己找一下,

在其中加入以下內容:

[mysqld]
server_id = 1
log-bin = mysql-bin
binlog-format = ROW

之后重啟mysql.

/ ubuntu
service mysql restart
// mac
mysql.server restart

監測是否開啟成功

進入mysql命令行,執行:

show variables like '%log_bin%' ;

如果結果如下圖,則說明成功了:


查看正在寫入的binlog狀態:


代碼讀取binlog

引入依賴

我們使用開源的一些實現,這里因為一些奇怪的原因,我選用了mysql-binlog-connector-java這個包,(官方github倉庫)[github.com/shyiko/mysq…]具體依賴如下:

!-- https://mvnrepository.com/artifact/com.github.shyiko/mysql-binlog-connector-java -->
 dependency>
 groupId>com.github.shyiko/groupId>
 artifactId>mysql-binlog-connector-java/artifactId>
 version>0.17.0/version>
 /dependency>

當然,對binlog的處理有很多開源實現,阿里的cancl就是一個,也可以使用它.

寫個demo

根據官方倉庫中readme里面,來簡單的寫個demo.

 public static void main(String[] args) {
 BinaryLogClient client = new BinaryLogClient("hostname", 3306, "username", "passwd");
 EventDeserializer eventDeserializer = new EventDeserializer();
 eventDeserializer.setCompatibilityMode(
 EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
 EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
 );
 client.setEventDeserializer(eventDeserializer);
 client.registerEventListener(new BinaryLogClient.EventListener() {

 @Override
 public void onEvent(Event event) {
 // TODO
 dosomething();
 logger.info(event.toString());
 }
 });
 client.connect();
 }

這個完全是根據官方教程里面寫的,在onEvent里面可以寫自己的業務邏輯,由于我只是測試,所以我在里面將每一個event都打印了出來.

之后我手動登錄到mysql,分別進行了增加,修改,刪除操作,監聽到的log如下:

00:23:13.331 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=0, eventType=ROTATE, serverId=1, headerLength=19, dataLength=28, nextPosition=0, flags=32}, data=RotateEventData{binlogFilename='mysql-bin.000001', binlogPosition=886}}
00:23:13.334 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468403000, eventType=FORMAT_DESCRIPTION, serverId=1, headerLength=19, dataLength=100, nextPosition=0, flags=0}, data=FormatDescriptionEventData{binlogVersion=4, serverVersion='5.7.23-0ubuntu0.16.04.1-log', headerLength=19, dataLength=95}}
00:23:23.715 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468603000, eventType=ANONYMOUS_GTID, serverId=1, headerLength=19, dataLength=46, nextPosition=951, flags=0}, data=null}
00:23:23.716 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468603000, eventType=QUERY, serverId=1, headerLength=19, dataLength=51, nextPosition=1021, flags=8}, data=QueryEventData{threadId=4, executionTime=0, errorCode=0, database='pf', sql='BEGIN'}}
00:23:23.721 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468603000, eventType=TABLE_MAP, serverId=1, headerLength=19, dataLength=32, nextPosition=1072, flags=0}, data=TableMapEventData{tableId=108, database='pf', table='student', columnTypes=15, 3, columnMetadata=135, 0, columnNullability={}}}
00:23:23.724 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468603000, eventType=EXT_WRITE_ROWS, serverId=1, headerLength=19, dataLength=23, nextPosition=1114, flags=0}, data=WriteRowsEventData{tableId=108, includedColumns={0, 1}, rows=[
    [[B@546a03af, 2]
]}}
00:23:23.725 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468603000, eventType=XID, serverId=1, headerLength=19, dataLength=12, nextPosition=1145, flags=0}, data=XidEventData{xid=28}}
00:23:55.872 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468635000, eventType=ANONYMOUS_GTID, serverId=1, headerLength=19, dataLength=46, nextPosition=1210, flags=0}, data=null}
00:23:55.872 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468635000, eventType=QUERY, serverId=1, headerLength=19, dataLength=51, nextPosition=1280, flags=8}, data=QueryEventData{threadId=4, executionTime=0, errorCode=0, database='pf', sql='BEGIN'}}
00:23:55.873 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468635000, eventType=TABLE_MAP, serverId=1, headerLength=19, dataLength=32, nextPosition=1331, flags=0}, data=TableMapEventData{tableId=108, database='pf', table='student', columnTypes=15, 3, columnMetadata=135, 0, columnNullability={}}}
00:23:55.875 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468635000, eventType=EXT_UPDATE_ROWS, serverId=1, headerLength=19, dataLength=31, nextPosition=1381, flags=0}, data=UpdateRowsEventData{tableId=108, includedColumnsBeforeUpdate={0, 1}, includedColumns={0, 1}, rows=[
    {before=[[B@6833ce2c, 1], after=[[B@725bef66, 3]}
]}}
00:23:55.875 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468635000, eventType=XID, serverId=1, headerLength=19, dataLength=12, nextPosition=1412, flags=0}, data=XidEventData{xid=41}}
00:24:22.333 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468662000, eventType=ANONYMOUS_GTID, serverId=1, headerLength=19, dataLength=46, nextPosition=1477, flags=0}, data=null}
00:24:22.334 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468662000, eventType=QUERY, serverId=1, headerLength=19, dataLength=51, nextPosition=1547, flags=8}, data=QueryEventData{threadId=4, executionTime=0, errorCode=0, database='pf', sql='BEGIN'}}
00:24:22.334 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468662000, eventType=TABLE_MAP, serverId=1, headerLength=19, dataLength=32, nextPosition=1598, flags=0}, data=TableMapEventData{tableId=108, database='pf', table='student', columnTypes=15, 3, columnMetadata=135, 0, columnNullability={}}}
00:24:22.335 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468662000, eventType=EXT_DELETE_ROWS, serverId=1, headerLength=19, dataLength=23, nextPosition=1640, flags=0}, data=DeleteRowsEventData{tableId=108, includedColumns={0, 1}, rows=[
    [[B@1888ff2c, 3]
]}}
00:24:22.335 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=1556468662000, eventType=XID, serverId=1, headerLength=19, dataLength=12, nextPosition=1671, flags=0}, data=XidEventData{xid=42}}

根據自己的業務,封裝一個更好使,更定制的工具類

開始的時候打算貼代碼的,,,但是代碼越寫越多,索性傳在github上了,這里只貼部分的實現.代碼傳送門

實現思路

  1. 支持對單個表的監聽,因為我們不想真的對所有數據庫中的所有數據表進行監聽.
  2. 可以多線程消費.
  3. 把監聽到的內容轉換成我們喜聞樂見的形式(文中的數據結構不一定很好,我沒想到更加合適的了).

所以實現思路大致如下:

  1. 封裝個客戶端,對外只提供獲取方法,屏蔽掉初始化的細節代碼.
  2. 提供注冊監聽器(偽)的方法,可以注冊對某個表的監聽(重新定義一個監聽接口,所有注冊的監聽器實現這個就好).
  3. 真正的監聽器只有客戶端,他將此數據庫實例上的所有操作,全部監聽到并轉換成我們想要的格式LogItem放進阻塞隊列里面.
  4. 啟動多個線程,消費阻塞隊列,對某一個LogItem調用對應的數據表的監聽器,做一些業務邏輯.

初始化代碼:

 public MysqlBinLogListener(Conf conf) {
 BinaryLogClient client = new BinaryLogClient(conf.host, conf.port, conf.username, conf.passwd);
 EventDeserializer eventDeserializer = new EventDeserializer();
 eventDeserializer.setCompatibilityMode(
 EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
 EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
 );
 client.setEventDeserializer(eventDeserializer);
 this.parseClient = client;
 this.queue = new ArrayBlockingQueue>(1024);
 this.conf = conf;
 listeners = new ConcurrentHashMap>();
 dbTableCols = new ConcurrentHashMap>();
 this.consumer = Executors.newFixedThreadPool(consumerThreads);
 }

注冊代碼:

 public void regListener(String db, String table, BinLogListener listener) throws Exception {
 String dbTable = getdbTable(db, table);
 Class.forName("com.mysql.jdbc.Driver");
 // 保存當前注冊的表的colum信息
 Connection connection = DriverManager.getConnection("jdbc:mysql://" + conf.host + ":" + conf.port, conf.username, conf.passwd);
 MapString, Colum> cols = getColMap(connection, db, table);
 dbTableCols.put(dbTable, cols);

 // 保存當前注冊的listener
 ListBinLogListener> list = listeners.getOrDefault(dbTable, new ArrayList>());
 list.add(listener);
 listeners.put(dbTable, list);
 }

在這個步驟中,我們在注冊監聽者的同時,獲得了該表的schema信息,并保存到map里面去,方便后續對數據進行處理.

監聽代碼:

 @Override
 public void onEvent(Event event) {
 EventType eventType = event.getHeader().getEventType();

 if (eventType == EventType.TABLE_MAP) {
 TableMapEventData tableData = event.getData();
 String db = tableData.getDatabase();
 String table = tableData.getTable();
 dbTable = getdbTable(db, table);
 }

 // 只處理添加刪除更新三種操作
 if (isWrite(eventType) || isUpdate(eventType) || isDelete(eventType)) {
 if (isWrite(eventType)) {
 WriteRowsEventData data = event.getData();
 for (Serializable[] row : data.getRows()) {
  if (dbTableCols.containsKey(dbTable)) {
  LogItem e = LogItem.itemFromInsert(row, dbTableCols.get(dbTable));
  e.setDbTable(dbTable);
  queue.add(e);
  }
 }
 }
 }
 }

我偷懶了,,,這里面只實現了對添加操作的處理,其他操作沒有寫.

消費代碼:

 public void parse() throws IOException {
 parseClient.registerEventListener(this);

 for (int i = 0; i  consumerThreads; i++) {
 consumer.submit(() -> {
 while (true) {
  if (queue.size() > 0) {
  try {
  LogItem item = queue.take();
  String dbtable = item.getDbTable();
  listeners.get(dbtable).forEach(l -> {
  l.onEvent(item);
  });

  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  }
  Thread.sleep(1000);
 }
 });
 }
 parseClient.connect();
 }

消費時,從隊列中獲取item,之后獲取對應的一個或者多個監聽者,分別消費這個item.

測試代碼:

 public static void main(String[] args) throws Exception {
 Conf conf = new Conf();
 conf.host = "hostname";
 conf.port = 3306;
 conf.username = conf.passwd = "hhsgsb";

 MysqlBinLogListener mysqlBinLogListener = new MysqlBinLogListener(conf);
 mysqlBinLogListener.parseArgsAndRun(args);
 mysqlBinLogListener.regListener("pf", "student", item -> {
 System.out.println(new String((byte[])item.getAfter().get("name")));
 logger.info("insert into {}, value = {}", item.getDbTable(), item.getAfter());
 });
 mysqlBinLogListener.regListener("pf", "teacher", item -> System.out.println("teacher ===="));

 mysqlBinLogListener.parse();
 }

在這段很少的代碼里,注冊了兩個監聽者,分別監聽student和teacher表,并分別進行打印處理,經測試,在teacher表插入數據時,可以獨立的運行定義的業務邏輯.

注意:這里的工具類并不能直接投入使用,因為里面有許多的異常處理沒有做,且功能僅監聽了插入語句,可以用來做實現的參考.

參考文章

  • github.com/shyiko/mysq…
  • https://www.jb51.net/article/166761.htm

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • MySQL系列之redo log、undo log和binlog詳解
  • MySQL binlog_ignore_db 參數的具體使用
  • MySQL中使用binlog時格式該如何選擇
  • 詳解監聽MySQL的binlog日志工具分析:Canal
  • MySQL8.0中binlog的深入講解
  • MYSQL中binlog優化的一些思考匯總
  • Mysql數據庫清理binlog日志命令詳解
  • 如何區分MySQL的innodb_flush_log_at_trx_commit和sync_binlog

標簽:湖北 烏海 聊城 武威 云浮 白銀 湖南 臨汾

巨人網絡通訊聲明:本文標題《Mysql數據庫監聽binlog的開啟步驟》,本文關鍵詞  Mysql,數據庫,監聽,binlog,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Mysql數據庫監聽binlog的開啟步驟》相關的同類信息!
  • 本頁收集關于Mysql數據庫監聽binlog的開啟步驟的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲18色成人| 极品少妇一区二区| 精品福利二区三区| 制服丝袜av成人在线看| 亚洲图片激情小说| 91精品国产综合久久小美女| 色视频欧美一区二区三区| 在线观看日韩国产| 在线亚洲高清视频| 日韩欧美国产三级电影视频| 日韩精品在线一区二区| 国产精品三级在线观看| 中文字幕制服丝袜一区二区三区 | 久久久精品免费观看| 中文字幕不卡在线观看| 欧美国产一区在线| 中文字幕一区二区在线播放| 国产精品久久777777| 国产精品美女视频| 中文字幕综合网| 亚洲三级电影网站| 国产精品乱码一区二区三区软件 | 韩国女主播成人在线| 日本不卡123| 免费欧美在线视频| 国产一区二区三区免费| 不卡视频在线观看| 欧亚洲嫩模精品一区三区| 欧美一级在线观看| 中文字幕精品一区| 精品一区二区免费| 成人丝袜高跟foot| 欧美艳星brazzers| 欧美va亚洲va| 日本中文字幕不卡| 中文字幕日本不卡| 日本一不卡视频| 色一区在线观看| 91精品国产综合久久久久久久| 欧美videofree性高清杂交| 久久久久久久久岛国免费| 国产精品国模大尺度视频| 夜夜夜精品看看| 精品无人区卡一卡二卡三乱码免费卡 | 亚洲一区二区欧美| 久久99蜜桃精品| 欧美亚洲免费在线一区| 久久男人中文字幕资源站| 亚洲精品美腿丝袜| 国产美女一区二区三区| 欧美在线观看视频在线| 欧美一级片在线看| 亚洲国产一区二区视频| 亚洲欧美一区二区三区孕妇| 欧美性猛交xxxx黑人交| 欧美精品一区二区三区四区| 中文字幕乱码亚洲精品一区| 奇米色一区二区| 色国产综合视频| 欧美精选午夜久久久乱码6080| 亚洲色图视频网站| 久久av中文字幕片| 欧美日韩在线精品一区二区三区激情| 久久精品欧美日韩| 日韩成人免费电影| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 国产精品一区二区你懂的| 91久久精品日日躁夜夜躁欧美| 精品国产3级a| 蜜臀av一区二区在线免费观看 | 国产精品高潮呻吟| 国产精品一区不卡| 国产亚洲成年网址在线观看| 日产国产高清一区二区三区| 欧美丝袜丝交足nylons图片| 国产精品免费看片| 成人激情动漫在线观看| 国产女同性恋一区二区| 久久99日本精品| 亚洲超碰精品一区二区| 欧美三级三级三级| 欧美激情一区二区三区全黄| 国产综合色精品一区二区三区| 美女视频免费一区| 国产剧情一区二区三区| 日韩美女视频在线| 一区二区三区不卡在线观看 | 奇米影视一区二区三区小说| 日韩美女天天操| 精品一区二区三区影院在线午夜| 91日韩在线专区| 中文字幕高清一区| 欧美疯狂做受xxxx富婆| 国产精品一区二区三区99| 亚洲宅男天堂在线观看无病毒| 26uuu欧美日本| 91丨九色丨蝌蚪富婆spa| 亚洲v日本v欧美v久久精品| 日韩一级片网址| 韩日欧美一区二区三区| 天天色综合成人网| 日韩美女啊v在线免费观看| 国产日韩欧美在线一区| 国产精品白丝jk白祙喷水网站| 久久99国内精品| 中文字幕欧美激情一区| 丝袜美腿亚洲一区| 亚洲综合在线五月| 国产精品美日韩| 一区二区中文字幕在线| 国产视频一区二区在线| 中文字幕精品—区二区四季| 欧美mv和日韩mv的网站| 欧美色综合天天久久综合精品| a4yy欧美一区二区三区| 99精品欧美一区二区三区综合在线| 欧美韩日一区二区三区四区| 精品综合久久久久久8888| 亚洲一区二区三区爽爽爽爽爽| 国产精品久久久久aaaa| 日韩精品中文字幕一区二区三区| heyzo一本久久综合| 韩国精品久久久| 粉嫩av一区二区三区粉嫩| 亚洲成在线观看| 日本欧美在线观看| 婷婷国产在线综合| 樱花草国产18久久久久| 五月天激情小说综合| 亚洲综合成人网| 午夜成人免费电影| 亚洲伊人伊色伊影伊综合网| 国产精品卡一卡二| 狠狠色2019综合网| 日韩影院在线观看| 最新不卡av在线| 亚洲电影在线播放| 国产一区二区三区四区在线观看| 亚洲中国最大av网站| 精品国产免费久久| 国产亚洲婷婷免费| 亚洲一区二区综合| 图片区日韩欧美亚洲| 国产成人自拍高清视频在线免费播放| 国产91精品入口| 欧美色精品在线视频| 精品欧美一区二区在线观看 | 日韩一区二区免费视频| 久久综合久久综合久久综合| 亚洲黄色在线视频| 日本美女视频一区二区| 91网上在线视频| 国产精品久久久久久久久搜平片| 国产精品无人区| 91在线观看免费视频| 日本女人一区二区三区| 欧美一个色资源| 国产在线精品国自产拍免费| 国产亚洲精品中文字幕| 丁香亚洲综合激情啪啪综合| 中文字幕精品在线不卡| 欧美亚洲免费在线一区| 精品亚洲国产成人av制服丝袜| 久久久精品一品道一区| 国产一区二区主播在线| 一区二区三区在线视频播放| 色婷婷久久久久swag精品| 久久精品72免费观看| 综合自拍亚洲综合图不卡区| 91精品中文字幕一区二区三区| 激情五月激情综合网| 亚洲激情五月婷婷| 日韩欧美精品在线视频| 91丝袜美女网| 粉嫩欧美一区二区三区高清影视| 亚洲综合色视频| 国产精品久久久久aaaa| 欧美日本精品一区二区三区| av电影一区二区| 久久久久88色偷偷免费| 欧美日韩国产综合久久| 欧美亚洲一区二区三区四区| 欧美另类高清zo欧美| 欧美日韩中文字幕一区二区| 欧美午夜精品久久久久久孕妇| 国产精品国产三级国产a| 亚洲天堂网中文字| 亚洲mv在线观看| 国产精品99久| 一本大道综合伊人精品热热 | 综合久久久久久| 亚洲午夜一区二区| 日本亚洲免费观看| 久久婷婷国产综合国色天香| 成人开心网精品视频| 一区二区成人在线观看| 福利电影一区二区| 国产精品自拍三区| 亚洲国产中文字幕在线视频综合| 石原莉奈一区二区三区在线观看|