• No results found

An API for Reading the MySQL Binary Log

N/A
N/A
Protected

Academic year: 2021

Share "An API for Reading the MySQL Binary Log"

Copied!
42
0
0

Loading.... (view fulltext now)

Full text

(1)
(2)

<Insert Picture Here>

Lars Thalmann

Development Director, MySQL

Replication, Backup & Connectors

An API for Reading the MySQL Binary Log

Mats Kindahl

Lead Software Engineer, MySQL

Replication & Utilities

(3)

3

The following is intended to outline our general

product direction. It is intended for information

purposes only, and may not be incorporated into any

contract. It is not a commitment to deliver any

material, code, or functionality, and should not be

relied upon in making purchasing decisions.

The development, release, and timing of any

features or functionality described for Oracle’s

products remains at the sole discretion of Oracle.

(4)

4

Outline

Replication Architecture

Binary logs

Binary log event

Reading binary log

Connecting to server

Reading from files

Reading events

Queries

Reading rows (row-based replication)

Other events

(5)

5

Replication Architecture

Master

Slave(s)

C lie nt s Changes
(6)

6

I/O

SQL

Databa

se

Replication Architecture

Client

Dump

Dump

Dump

Binary Log

Session

Session

Session

I/O

SQL

Databa

se

I/O

SQL

Databa

se

Master

Slave(s)

(7)

7

I/O

SQL

Databa

se

Replication Architecture

Client

Dump

Dump

Dump

Binary Log

Relay Log

Session

Session

Session

I/O

SQL

Databa

se

I/O

SQL

Database

Master

Slave(s)

(8)

8

Replication to other systems

Client

Binary Log

Dump

Session

Session

Session

Master

Relay Log I/O SQL Database Slave(s)

HBase

SOLR

Full-text indexing

Data Mining

?

Dump

Dump

Dump

(9)

9

Transforming events

SOLR

A

PI Transformer

Se

rve

r

Fi

le

Subject of our presentation

(10)

10

Binlog API

Library to process replication events

API is ready for use

Goals:

Simple

Extensible

(11)

11

<Insert Picture Here>

How to capture events

Binlog API

The replication listener

(12)

12

<Insert Picture Here>

First example

#include <cstdlib> #include <iostream> #include <binlog_api.h> int main(int argc, char *argv[]) {   const char *url = “mysql://[email protected]:3360”;   Binary_log binlog(create_transport(url));   binlog.connect();   Binary_log_event *event;   while (true) {     int result = binlog.wait_for_next_event(&event);     if (result == ERR_EOF)       break;     cout << “ at “ << binlog.get_position()          << “ event type “ << event.get_type_code()          << endl;   }   return EXIT_SUCCESS; }
(13)

13

<Insert Picture Here>

Create network transport

#include <cstdlib> #include <iostream> #include <binlog_api.h> int main(int argc, char *argv[]) {   const char *url = “mysql://[email protected]:3360”;   Binary_log binlog(create_transport(url));   binlog.connect();   Binary_log_event *event;   while (true) {     int result = binlog.wait_for_next_event(&event);     if (result == ERR_EOF)       break;     cout << “ at “ << binlog.get_position()          << “ event type “ << event.get_type_code()          << endl;   }   return EXIT_SUCCESS; }

(14)

14

<Insert Picture Here>

… or file transport

#include <cstdlib> #include <iostream> #include <binlog_api.h> int main(int argc, char *argv[]) {   const char *url = “file:///tmp/binlog.0000001”;   Binary_log binlog(create_transport(url));   binlog.connect();   Binary_log_event *event;   while (true) {     int result = binlog.wait_for_next_event(&event);     if (result == ERR_EOF)       break;     cout << “ at “ << binlog.get_position()          << “ event type “ << event.get_type_code()          << endl;   }   return EXIT_SUCCESS; }
(15)

15

<Insert Picture Here>

Connect the transport

#include <cstdlib> #include <iostream> #include <binlog_api.h> int main(int argc, char *argv[]) {   const char *url = “file:///tmp/binlog.0000001”;   Binary_log binlog(create_transport(url));   binlog.connect();   Binary_log_event *event;   while (true) {     int result = binlog.wait_for_next_event(&event);     if (result == ERR_EOF)       break;     cout << “ at “ << binlog.get_position()          << “ event type “ << event.get_type_code()          << endl;   }   return EXIT_SUCCESS; }

(16)

16

<Insert Picture Here>

Digression: set read position

Default: start at beginning

Set position explicitly:

if (binlog.set_position(file, pos))

{

  /* Handle error */

}

(17)

17

<Insert Picture Here>

Read events

#include <cstdlib> #include <iostream> #include <binlog_api.h> int main(int argc, char *argv[]) {   const char *url = “file:///tmp/binlog.0000001”;   Binary_log binlog(create_transport(url));   binlog.connect();   Binary_log_event *event;   while (true) {     int result = binlog.wait_for_next_event(&event);     if (result == ERR_EOF)       break;     cout << “ at “ << binlog.get_position()          << “ event type “ << event­>get_type_code()          << endl;   }   return EXIT_SUCCESS; }

Get event

(18)

18

Steps summary

Create a transport

create_transport

Connect to server

connect

Set position

set_position

Start event loop

(19)

19

<Insert Picture Here>

Reading information in events

Binlog API

The replication listener

(20)

20

Binlog Event Structure

Post-header

Variable Part

Common Header

Common header

Generic data

Fixed size

Post-header

Event-specific data

Fixed size

Variable part

Event-specific data

Variable size

(21)

21

<Insert Picture Here>

Reading the header

Read common header

header()

Access fields

switch (event­>header()­>type_code) {

case QUERY_EVENT:

  …

case USER_VAR_EVENT:

  …

case FORMAT_DESCRIPTION_EVENT:

  …

}

(22)

22

Binlog Event Common Header

19 Bytes

4 bytes

timestamp

type_code

server_id

event_length

flags

next_position

Data common to all events

Next Position

One-after-end of event

Timestamp

– Statement start time

Flags

– Binlog-in-use – Thread-specific – Suppress “use” – Artificial – Relay-log event
(23)

23

Binlog Event Structure

Post-header

Variable Part

Common Header

Common header

Generic data

Fixed size

Post-header

Event-specific data

Fixed size

Variable part

Event-specific data

Variable size

(24)

24

Query Event

Most common event

Used for statements

Statement logged

literally

… in almost all cases

query

Common Header thread_id exec_time error_code

std::vector<uint8_t> variables

Specia

l case

: nee

d to

be de

coded

db_name

(25)

25

<Insert Picture Here>

Reading event data

Cast to correct event type

Access fields

switch (event­>header()­>type_code) {

case QUERY_EVENT:

  

Query_event *qev =

    static_cast<Query_event*>(event);

  cout << qev­>query << endl;

  break;

case USER_VAR_EVENT:

  …

case FORMAT_DESCRIPTION_EVENT:

  …

}

(26)

26

<Insert Picture Here>

(27)

27

<Insert Picture Here>

Event-driven API

Content handlers

(28)

28

Saving user-defined variables

class 

Save_handler

  : public Content_handler

{ … };

Save_handler::Map vars;

Save_handler save_vars(vars);

binlog.content_handler_pipeline()

  ­>push_back(&save_vars);

(29)

29

<Insert Picture Here>

User-defined variables

class Save_handler : public Content_handler {

public:

  typedef std::map<std::string, std::string> Map;

  Save_handler(Map &container) : m_var(container)

  { }

  Binary_log_event *

  process_event(User_var_event *event) {

    m_var[event­>name] = event­>value;

    return NULL;

  }

private:

  Map &m_var;

};

(30)

30

Replace handler

class 

Replace_vars : 

  public Content_handler

{

  Binary_log_event *

  process_event(Query_log_event *event)

  {

    /* Code to replace variables */

  }

};

Ful

l e

xam

ple

: b

asic

-2

.cp

p

(31)

31

<Insert Picture Here>

Example two:

How to capture live row changes

Binlog API

The replication listener

(32)

32

Row events in the binlog

Table map

Write rows

Write rows

Write rows

Table map

Delete rows

Transaction

Transaction

Header

Map table definition

to table ID

We'll cover this

soon (trust me)

(33)

33

Capturing row events

class 

Row_event_handler : 

  public Content_handler

{

public:

  Binary_log_event *

  process_event(Row_event *event)

  {

    switch(ev­>header()­>type_code)

    {

      case WRITE_ROWS_EVENT:

      case UPDATE_ROWS_EVENT:

      case DELETE_ROWS_EVENT:

         ...

(34)

34

Capturing row events

The *_ROWS_EVENT

uint64_t table_id;

uint16_t flags;

uint64_t columns_len;

uint32_t null_bits_len;

vector<uint8_t> columns_before_image;

vector<uint8_t> used_columns;

vector<uint8_t> row;

Raw row data

Defined in the

table map event

(35)

35

Reading rows

Wrap raw row data in

Row_event_set

Iterate over rows using iterator

Row_event_set rows(row_event, table_map_event);

Row_event_set::iterator it= rows.begin();

You need to have

(36)

36

Reading fields of a row

Row_of_fields

to iterate fields of a row

Turns

row

into

row of fields

sequence

Row_event_set rows(row_event, table_map_event);

for (Row_event_set::iterator it = rows.begin() ;

     it != rows.end() ;

     ++it)

(37)

37

Reading fields of a row

Iterate over fields in Row_of_fields

void table_delete (..., const Row_of_fields& fields)

{

 Row_of_fields::iterator it= fields.begin();

 for (int id = 0 ; it =! fields.end() ; ++it, ++id) {

  std::string str;

  Converter().to(str, *it);

  std::cout << id << "= " << str << std::endl;

 }

}

(38)

38

Decoding a field

Iterate over fields in Row_of_fields

void table_delete (..., const Row_of_fields& fields)

{

 Row_of_fields::iterator it= fields.begin();

 for (int id = 0 ; it =! fields.end() ; ++it, ++id) {

  std::string str;

  Converter().to(str, *it);

  std::cout << id << "= " << str << std::endl;

 }

}

(39)

39

Summary – what's it for?

Replicate to other systems

Hbase, SOLR, etc.

Triggering on specific events

Call the DBA when tables are dropped?

Monitor objects in database

Browsing binary logs

Extract subset of changes (by table, by execution time, etc.)

Statistics

Component in building other solutions

Point-in-time restore

(40)

40

Summary – what we've covered

Reading events

Creating content handlers

Processing queries

Processing rows

Reading fields

(41)

41

Available at labs

http://labs.mysql.com/

Source code available at launchpad

http://launchpad.net/mysql-replication-listener

MySQL High Availability

Get it as free ebook: http://oreilly.com/go/ebookrequest

Valid this week, mention event “MySQL Replication

Update”

(42)
http://oreilly.com/go/ebookrequest

Figure

Table map Write rows Write rows Write rows Table map Delete rowsTransactionTransaction Header

References

Related documents