int main(int argc, char **argv) { std::string connectionStr("mysql://*****:*****@localhost:13000"); if (argc > 1) { if (argv[1] == strstr(argv[1], "mysql://")) { connectionStr.assign(argv[1]); } } std::cout << "Trying to connect to <" << connectionStr << ">\n"; std::unique_ptr<system::Binary_log_driver> drv(mysql::system::create_transport(connectionStr.c_str())); mysql::Binary_log binlog(drv.get()); /* Attach a custom event parser which produces user defined events */ mysql::Basic_transaction_parser transaction_parser; Incident_handler incident_handler; Replay_binlog replay_handler; binlog.content_handler_pipeline()->push_back(&transaction_parser); binlog.content_handler_pipeline()->push_back(&incident_handler); binlog.content_handler_pipeline()->push_back(&replay_handler); int ret = binlog.connect(); if (0 != ret) { std::cerr << "Can't connect to the master.\n"; return -1; } if (binlog.set_position(4) != ERR_OK) { std::cerr << "Can't reposition the binary log reader.\n"; return -1; } Binary_log_event *event; bool quit = false; while (!quit) { /* Pull events from the master. This is the heart beat of the event listener. */ if (binlog.wait_for_next_event(&event)) { quit = true; continue; } /* Print the event */ std::cout << "MainLoop: Event type: [" << mysql::system::get_event_type_str(event->get_event_type()) << "] length: " << event->header()->event_length << " next pos: " << event->header()->next_position << std::endl; /* Perform a special action based on event type */ switch (event->get_event_type()) { case mysql::QUERY_EVENT: { const mysql::Query_event *qev = static_cast<const mysql::Query_event *>(event); std::cout << "query= " << qev->query << " db= " << qev->db_name << std::endl << std::endl; if (qev->query.find("DROP TABLE REPLICATION_LISTENER") != std::string::npos || qev->query.find("DROP TABLE `REPLICATION_LISTENER`") != std::string::npos) { quit = true; } } break; case mysql::ROTATE_EVENT: { mysql::Rotate_event *rot = static_cast<mysql::Rotate_event *>(event); std::cout << "filename= " << rot->binlog_file.c_str() << " pos= " << rot->binlog_pos << std::endl << std::endl; } break; } delete event; } return 0; }
int main(int argc, char** argv) { if (argc < 2) { fprintf(stderr,"Usage:\n\treplaybinlog URL\n\nExample:\n\treplaybinlog mysql://root:[email protected]:3306\n\n"); return (EXIT_FAILURE); } mysql::Binary_log binlog(mysql::system::create_transport(argv[1])); if (argc > 2) { // Set ssl ca certificate binlog.set_ssl_ca(std::string(argv[2])); // Set ssl cipher list //binlog.set_ssl_cipher("AES256-SHA"); //RDS ssl_cipher list //binlog.set_ssl_cipher("EXP1024-RC4-SHA:EXP1024-DES-CBC-SHA:AES256-SHA:AES128-SHA:DES-CBC3-SHA:DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:RC4-SHA:RC4-MD5:EXP-RC4-MD5:NULL-SHA:NULL-MD5:DES-CBC3-MD5:DES-CBC-MD5:EXP-RC2-CBC-MD5:RC2-CBC-MD5:EXP-RC4-MD5:RC4-MD5:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:ADH-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ADH-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:ADH-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:EXP-KRB5-RC4-MD5:EXP-KRB5-RC2-CBC-MD5:EXP-KRB5-DES-CBC-MD5:KRB5-RC4-MD5:KRB5-DES-CBC-MD5:ADH-RC4-MD5:EXP-ADH-RC4-MD5:DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-RC4-SHA:EXP1024-DHE-DSS-DES-CBC-SHA:EXP-KRB5-RC4-SHA:EXP-KRB5-RC2-CBC-SHA:EXP-KRB5-DES-CBC-SHA:KRB5-RC4-SHA:KRB5-DES-CBC-SHA:ADH-DES-CBC-SHA:EXP-ADH-DES-CBC-SHA:EDH-RSA-DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA"); } /* Attach a custom event parser which produces user defined events */ mysql::Basic_transaction_parser transaction_parser; Incident_handler incident_hndlr; Replay_binlog replay_hndlr; binlog.content_handler_pipeline()->push_back(&transaction_parser); binlog.content_handler_pipeline()->push_back(&incident_hndlr); binlog.content_handler_pipeline()->push_back(&replay_hndlr); if (binlog.connect()) { fprintf(stderr,"Can't connect to the master.\n"); return (EXIT_FAILURE); } if (binlog.set_position(4) != ERR_OK) { fprintf(stderr,"Can't reposition the binary log reader.\n"); return (EXIT_FAILURE); } Binary_log_event *event; bool quit= false; while(!quit) { /* Pull events from the master. This is the heart beat of the event listener. */ if (binlog.wait_for_next_event(&event)) { quit= true; continue; } /* Print the event */ std::cout << "Event type: " << mysql::system::get_event_type_str(event->get_event_type()) << " length: " << event->header()->event_length << " next pos: " << event->header()->next_position << std::endl; /* Perform a special action based on event type */ switch(event->header()->type_code) { case mysql::QUERY_EVENT: { const mysql::Query_event *qev= static_cast<const mysql::Query_event *>(event); std::cout << "query= " << qev->query << " db= " << qev->db_name << std::endl << std::endl; if (qev->query.find("DROP TABLE REPLICATION_LISTENER") != std::string::npos || qev->query.find("DROP TABLE `REPLICATION_LISTENER`") != std::string::npos) { quit= true; } } break; case mysql::ROTATE_EVENT: { mysql::Rotate_event *rot= static_cast<mysql::Rotate_event *>(event); std::cout << "filename= " << rot->binlog_file.c_str() << " pos= " << rot->binlog_pos << std::endl << std::endl; } break; } // end switch delete event; } // end loop return (EXIT_SUCCESS); }