Loading mysql-test/r/binlog-backup-restore.resultdeleted 100644 → 0 +0 −5 Original line number Diff line number Diff line n 11 12 13 14 mysql-test/t/binlog-backup-restore.testdeleted 100644 → 0 +0 −18 Original line number Diff line number Diff line reset master; drop table if exists t1; create table t1(n int); insert into t1 values (1),(2),(3),(4); flush logs; update t1 set n = n + 10; save_master_pos; flush tables with read lock; system rm -rf var/tmp/backup; system mkdir -p var/tmp/backup; system cp var/master-data/master-bin.* var/tmp/backup; unlock tables; drop table t1; eval change master to master_host='$MYSQL_TEST_DIR/var/tmp/backup/master-bin'; slave start; sync_with_master; select * from t1; sql/slave.cc +6 −140 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ #include <myisam.h> #include "mini_client.h" #include "slave.h" #include "sql_repl.h" #include <thr_alarm.h> #include <my_dir.h> Loading Loading @@ -442,101 +441,6 @@ int fetch_nx_table(THD* thd, MASTER_INFO* mi) return error; } void MASTER_INFO::close_virtual_master() { vm_binlog.close_index(); end_io_cache(&vm_cache); if(vm_fd >= 0) { my_close(vm_fd, MYF(0)); vm_fd = -1; } } int MASTER_INFO::setup_virtual_master() { vm_binlog.init(LOG_BIN); vm_binlog.set_index_file_name(host); if(vm_binlog.open_index(O_RDONLY)) { sql_print_error("virtual master: could not open index file '%s': \ (%d)", host, my_errno); return 1; } if(vm_binlog.find_first_log(&vm_linfo,log_file_name)) { sql_print_error("virtual master: could not find first log"); return 1; } if(open_log()) return 1; return 0; } int MASTER_INFO::open_log() { const char* errmsg = "Unknown error"; if(vm_fd >= 0) { end_io_cache(&vm_cache); my_close(vm_fd, MYF(0)); } // if backup-up logs have relative paths, assume they are relative to // the directory that has the log index, not cwd char logname_buf[FN_REFLEN+1], *logname; if(vm_linfo.log_file_name[0] == FN_LIBCHAR) logname = vm_linfo.log_file_name; else { char* end = strnmov(logname_buf, host, sizeof(logname_buf)); for(; *end != FN_LIBCHAR; --end); // we will always find it, first // char of host is always FN_LIBCHAR for virtual master strncpy(end + 1, vm_linfo.log_file_name, sizeof(logname_buf) - (end - logname_buf)); logname = logname_buf; } if((vm_fd = open_binlog(&vm_cache, logname, &errmsg)) < 0) { sql_print_error("virtual master: error opening binlog '%s': %s", vm_linfo.log_file_name, errmsg); return 1; } strncpy(log_file_name, vm_linfo.log_file_name, sizeof(log_file_name)); return 0; } uint MASTER_INFO::read_event() { for(;!(vm_ev = Log_event::read_log_event(&vm_cache, 0));) { if(!vm_cache.error) // eof - try next log { switch(vm_binlog.find_next_log(&vm_linfo)) { case LOG_INFO_EOF: return 0; case 0: if(open_log()) return packet_error; continue; default: sql_print_error("virtual master: could not read next log"); return packet_error; } } } return vm_ev->get_data_size() + LOG_EVENT_HEADER_LEN; } void end_master_info(MASTER_INFO* mi) { if(mi->fd >= 0) Loading @@ -546,8 +450,6 @@ void end_master_info(MASTER_INFO* mi) mi->fd = -1; } mi->inited = 0; if(mi->virtual_master) mi->close_virtual_master(); } int init_master_info(MASTER_INFO* mi) Loading Loading @@ -643,7 +545,6 @@ int init_master_info(MASTER_INFO* mi) } mi->inited = 1; mi->virtual_master = (mi->host[0] == FN_LIBCHAR); // now change the cache from READ to WRITE - must do this // before flush_master_info reinit_io_cache(&mi->file, WRITE_CACHE, 0L,0,1); Loading Loading @@ -841,9 +742,6 @@ static int safe_sleep(THD* thd, int sec) static int request_dump(MYSQL* mysql, MASTER_INFO* mi) { if(mi->virtual_master) return 0; char buf[FN_REFLEN + 10]; int len; int binlog_flags = 0; // for now Loading Loading @@ -897,9 +795,6 @@ command"); static uint read_event(MYSQL* mysql, MASTER_INFO *mi) { if(mi->virtual_master) return mi->read_event(); uint len = packet_error; // for convinience lets think we start by // being in the interrupted state :-) Loading Loading @@ -965,18 +860,16 @@ point. If you are sure that your master is ok, run this query manually on the\ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) { Log_event * ev = (mi->virtual_master) ? mi->vm_ev : Log_event::read_log_event((const char*)net->read_pos + 1, Log_event * ev = Log_event::read_log_event((const char*)net->read_pos + 1, event_len); char llbuff[22]; if (ev) { int type_code = ev->get_type_code(); if ((!mi->virtual_master && ev->server_id == ::server_id) || slave_skip_counter) if (ev->server_id == ::server_id || slave_skip_counter) { if(type_code == LOAD_EVENT && !mi->virtual_master) if(type_code == LOAD_EVENT) skip_load_data_infile(net); mi->inc_pos(event_len); Loading Loading @@ -1078,14 +971,6 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) case LOAD_EVENT: { if(mi->virtual_master) { delete ev; sql_print_error("LOAD DATA INFILE does not yet work with virtual \ master. Perform in manually, then restart slave with SET SQL_SKIP_COUNTER=1;\ SLAVE START"); return 1; } Load_log_event* lev = (Load_log_event*)ev; init_sql_alloc(&thd->mem_root, 8192,0); thd->db = rewrite_db((char*)lev->db); Loading @@ -1108,7 +993,6 @@ SLAVE START"); // the table will be opened in mysql_load if(table_rules_on && !tables_ok(thd, &tables)) { if(!mi->virtual_master) skip_load_data_infile(net); } else Loading Loading @@ -1173,7 +1057,6 @@ SLAVE START"); { // we will just ask the master to send us /dev/null if we do not // want to load the data :-) if(!mi->virtual_master) skip_load_data_infile(net); } Loading Loading @@ -1411,20 +1294,8 @@ try again, log '%s' at postion %s", RPL_LOG_NAME, goto err; } if(!event_len && glob_mi.virtual_master) { sql_print_error("Virtual master replication finished"); goto err; } if (event_len == packet_error) { if(glob_mi.virtual_master) { sql_print_error("Virtual master replication encountered \ error while reading event, replication terminated"); goto err; } thd->proc_info = "Waiting to reconnect after a failed read"; if(mysql->net.vio) vio_close(mysql->net.vio); Loading Loading @@ -1532,8 +1403,6 @@ position %s", static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) { if(mi->virtual_master) return mi->setup_virtual_master(); int slave_was_killed; #ifndef DBUG_OFF events_till_disconnect = disconnect_slave_event_count; Loading Loading @@ -1563,9 +1432,6 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) { if(mi->virtual_master) return mi->setup_virtual_master(); int slave_was_killed; char llbuff[22]; Loading sql/slave.h +1 −14 Original line number Diff line number Diff line Loading @@ -16,14 +16,8 @@ typedef struct st_master_info pthread_mutex_t lock; pthread_cond_t cond; bool inited; bool virtual_master; // for replay of binlogs from a directory MYSQL_LOG vm_binlog; LOG_INFO vm_linfo; IO_CACHE vm_cache; int vm_fd; Log_event* vm_ev; st_master_info():pending(0),fd(-1),inited(0),virtual_master(0),vm_fd(-1) st_master_info():pending(0),fd(-1),inited(0) { host[0] = 0; user[0] = 0; password[0] = 0; pthread_mutex_init(&lock, MY_MUTEX_INIT_FAST); Loading @@ -34,8 +28,6 @@ typedef struct st_master_info { pthread_mutex_destroy(&lock); pthread_cond_destroy(&cond); if(virtual_master) close_virtual_master(); } inline void inc_pending(ulonglong val) { Loading @@ -59,11 +51,6 @@ typedef struct st_master_info } int wait_for_pos(THD* thd, String* log_name, ulonglong log_pos); int setup_virtual_master(); void close_virtual_master(); uint read_event(); int open_log(); } MASTER_INFO; typedef struct st_table_rule_ent Loading Loading
mysql-test/r/binlog-backup-restore.resultdeleted 100644 → 0 +0 −5 Original line number Diff line number Diff line n 11 12 13 14
mysql-test/t/binlog-backup-restore.testdeleted 100644 → 0 +0 −18 Original line number Diff line number Diff line reset master; drop table if exists t1; create table t1(n int); insert into t1 values (1),(2),(3),(4); flush logs; update t1 set n = n + 10; save_master_pos; flush tables with read lock; system rm -rf var/tmp/backup; system mkdir -p var/tmp/backup; system cp var/master-data/master-bin.* var/tmp/backup; unlock tables; drop table t1; eval change master to master_host='$MYSQL_TEST_DIR/var/tmp/backup/master-bin'; slave start; sync_with_master; select * from t1;
sql/slave.cc +6 −140 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ #include <myisam.h> #include "mini_client.h" #include "slave.h" #include "sql_repl.h" #include <thr_alarm.h> #include <my_dir.h> Loading Loading @@ -442,101 +441,6 @@ int fetch_nx_table(THD* thd, MASTER_INFO* mi) return error; } void MASTER_INFO::close_virtual_master() { vm_binlog.close_index(); end_io_cache(&vm_cache); if(vm_fd >= 0) { my_close(vm_fd, MYF(0)); vm_fd = -1; } } int MASTER_INFO::setup_virtual_master() { vm_binlog.init(LOG_BIN); vm_binlog.set_index_file_name(host); if(vm_binlog.open_index(O_RDONLY)) { sql_print_error("virtual master: could not open index file '%s': \ (%d)", host, my_errno); return 1; } if(vm_binlog.find_first_log(&vm_linfo,log_file_name)) { sql_print_error("virtual master: could not find first log"); return 1; } if(open_log()) return 1; return 0; } int MASTER_INFO::open_log() { const char* errmsg = "Unknown error"; if(vm_fd >= 0) { end_io_cache(&vm_cache); my_close(vm_fd, MYF(0)); } // if backup-up logs have relative paths, assume they are relative to // the directory that has the log index, not cwd char logname_buf[FN_REFLEN+1], *logname; if(vm_linfo.log_file_name[0] == FN_LIBCHAR) logname = vm_linfo.log_file_name; else { char* end = strnmov(logname_buf, host, sizeof(logname_buf)); for(; *end != FN_LIBCHAR; --end); // we will always find it, first // char of host is always FN_LIBCHAR for virtual master strncpy(end + 1, vm_linfo.log_file_name, sizeof(logname_buf) - (end - logname_buf)); logname = logname_buf; } if((vm_fd = open_binlog(&vm_cache, logname, &errmsg)) < 0) { sql_print_error("virtual master: error opening binlog '%s': %s", vm_linfo.log_file_name, errmsg); return 1; } strncpy(log_file_name, vm_linfo.log_file_name, sizeof(log_file_name)); return 0; } uint MASTER_INFO::read_event() { for(;!(vm_ev = Log_event::read_log_event(&vm_cache, 0));) { if(!vm_cache.error) // eof - try next log { switch(vm_binlog.find_next_log(&vm_linfo)) { case LOG_INFO_EOF: return 0; case 0: if(open_log()) return packet_error; continue; default: sql_print_error("virtual master: could not read next log"); return packet_error; } } } return vm_ev->get_data_size() + LOG_EVENT_HEADER_LEN; } void end_master_info(MASTER_INFO* mi) { if(mi->fd >= 0) Loading @@ -546,8 +450,6 @@ void end_master_info(MASTER_INFO* mi) mi->fd = -1; } mi->inited = 0; if(mi->virtual_master) mi->close_virtual_master(); } int init_master_info(MASTER_INFO* mi) Loading Loading @@ -643,7 +545,6 @@ int init_master_info(MASTER_INFO* mi) } mi->inited = 1; mi->virtual_master = (mi->host[0] == FN_LIBCHAR); // now change the cache from READ to WRITE - must do this // before flush_master_info reinit_io_cache(&mi->file, WRITE_CACHE, 0L,0,1); Loading Loading @@ -841,9 +742,6 @@ static int safe_sleep(THD* thd, int sec) static int request_dump(MYSQL* mysql, MASTER_INFO* mi) { if(mi->virtual_master) return 0; char buf[FN_REFLEN + 10]; int len; int binlog_flags = 0; // for now Loading Loading @@ -897,9 +795,6 @@ command"); static uint read_event(MYSQL* mysql, MASTER_INFO *mi) { if(mi->virtual_master) return mi->read_event(); uint len = packet_error; // for convinience lets think we start by // being in the interrupted state :-) Loading Loading @@ -965,18 +860,16 @@ point. If you are sure that your master is ok, run this query manually on the\ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) { Log_event * ev = (mi->virtual_master) ? mi->vm_ev : Log_event::read_log_event((const char*)net->read_pos + 1, Log_event * ev = Log_event::read_log_event((const char*)net->read_pos + 1, event_len); char llbuff[22]; if (ev) { int type_code = ev->get_type_code(); if ((!mi->virtual_master && ev->server_id == ::server_id) || slave_skip_counter) if (ev->server_id == ::server_id || slave_skip_counter) { if(type_code == LOAD_EVENT && !mi->virtual_master) if(type_code == LOAD_EVENT) skip_load_data_infile(net); mi->inc_pos(event_len); Loading Loading @@ -1078,14 +971,6 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) case LOAD_EVENT: { if(mi->virtual_master) { delete ev; sql_print_error("LOAD DATA INFILE does not yet work with virtual \ master. Perform in manually, then restart slave with SET SQL_SKIP_COUNTER=1;\ SLAVE START"); return 1; } Load_log_event* lev = (Load_log_event*)ev; init_sql_alloc(&thd->mem_root, 8192,0); thd->db = rewrite_db((char*)lev->db); Loading @@ -1108,7 +993,6 @@ SLAVE START"); // the table will be opened in mysql_load if(table_rules_on && !tables_ok(thd, &tables)) { if(!mi->virtual_master) skip_load_data_infile(net); } else Loading Loading @@ -1173,7 +1057,6 @@ SLAVE START"); { // we will just ask the master to send us /dev/null if we do not // want to load the data :-) if(!mi->virtual_master) skip_load_data_infile(net); } Loading Loading @@ -1411,20 +1294,8 @@ try again, log '%s' at postion %s", RPL_LOG_NAME, goto err; } if(!event_len && glob_mi.virtual_master) { sql_print_error("Virtual master replication finished"); goto err; } if (event_len == packet_error) { if(glob_mi.virtual_master) { sql_print_error("Virtual master replication encountered \ error while reading event, replication terminated"); goto err; } thd->proc_info = "Waiting to reconnect after a failed read"; if(mysql->net.vio) vio_close(mysql->net.vio); Loading Loading @@ -1532,8 +1403,6 @@ position %s", static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) { if(mi->virtual_master) return mi->setup_virtual_master(); int slave_was_killed; #ifndef DBUG_OFF events_till_disconnect = disconnect_slave_event_count; Loading Loading @@ -1563,9 +1432,6 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) { if(mi->virtual_master) return mi->setup_virtual_master(); int slave_was_killed; char llbuff[22]; Loading
sql/slave.h +1 −14 Original line number Diff line number Diff line Loading @@ -16,14 +16,8 @@ typedef struct st_master_info pthread_mutex_t lock; pthread_cond_t cond; bool inited; bool virtual_master; // for replay of binlogs from a directory MYSQL_LOG vm_binlog; LOG_INFO vm_linfo; IO_CACHE vm_cache; int vm_fd; Log_event* vm_ev; st_master_info():pending(0),fd(-1),inited(0),virtual_master(0),vm_fd(-1) st_master_info():pending(0),fd(-1),inited(0) { host[0] = 0; user[0] = 0; password[0] = 0; pthread_mutex_init(&lock, MY_MUTEX_INIT_FAST); Loading @@ -34,8 +28,6 @@ typedef struct st_master_info { pthread_mutex_destroy(&lock); pthread_cond_destroy(&cond); if(virtual_master) close_virtual_master(); } inline void inc_pending(ulonglong val) { Loading @@ -59,11 +51,6 @@ typedef struct st_master_info } int wait_for_pos(THD* thd, String* log_name, ulonglong log_pos); int setup_virtual_master(); void close_virtual_master(); uint read_event(); int open_log(); } MASTER_INFO; typedef struct st_table_rule_ent Loading