ruby-binlog

Description

ruby-binlog is Ruby binding for MySQL Binary log API.

Install

gem install ruby-binlog

Required Privileges

  • SUPER

  • REPLICATION SLAVE

  • EVENT

Example

#!/usr/bin/env ruby
require "rubygems"
require "binlog"
require "pstore"

$db = PStore.new("/tmp/foo")

#master_log_file = "mysql-bin.000001"
#master_log_pos = 4

master_log_file = nil
master_log_pos = nil

$db.transaction do
  master_log_file = $db["master_log_file"]
  master_log_pos = $db["master_log_pos"]
end

def save_position(master_log_file, master_log_pos)
  $db.transaction do
    $db["master_log_file"] = master_log_file
    $db["master_log_pos"] = master_log_pos
  end
end

begin
  # XXX: Do not reuse a client instance, after connection goes out.
  client = Binlog::Client.new("mysql://repl:[email protected]")
  sleep 0.3 until client.connect

  if master_log_file and master_log_pos
    client.set_position(master_log_file, master_log_pos)
  end

  while event = client.wait_for_next_event
    puts "(#{event.event_type})"
    master_log_pos = event.next_position

    case event
    when Binlog::QueryEvent
      puts event.db_name
      puts event.query
      save_position(master_log_file, master_log_pos)
    when Binlog::RowEvent
      puts event.event_type
      puts event.db_name
      puts event.table_name
      p event.columns
      p event.rows
      save_position(master_log_file, master_log_pos)
    when Binlog::RotateEvent
      master_log_file = event.binlog_file
      master_log_pos = event.binlog_pos
      save_position(master_log_file, master_log_pos)
    end
  end
rescue Binlog::Error => e
  puts e
  retry if client.closed?
  raise e
end

Notice

The following type are not supported in row mode.

  • DECIMAL

  • INT24

  • DATE

  • TIME

  • YEAR

  • BIT

  • ENUM

  • SET

  • GEOMETRY

see the following urls: