Bug #24733 RESET MASTER run before dump with --delete-master-logs

  
  fixed by using flush logs, dumping, then doing PURGE MASTER LOGS TO 'binfile', instead
of deleting the log files at the beginning.
  
  NOTE: previously the delete-master-logs  would reset the log names back to
filename.00001. Now the trailing number doesn't get reset. This may need to be
documented. 
parent e50116e9
...@@ -3268,10 +3268,41 @@ static int do_unlock_tables(MYSQL *mysql_con) ...@@ -3268,10 +3268,41 @@ static int do_unlock_tables(MYSQL *mysql_con)
return mysql_query_with_error_report(mysql_con, 0, "UNLOCK TABLES"); return mysql_query_with_error_report(mysql_con, 0, "UNLOCK TABLES");
} }
static int get_bin_log_name(MYSQL *mysql_con,
char* buff_log_name, uint buff_len)
{
MYSQL_RES *res;
MYSQL_ROW row;
if (mysql_query(mysql, "SHOW MASTER STATUS") ||
!(res= mysql_store_result(mysql)))
return 1;
if (!(row= mysql_fetch_row(res)))
{
mysql_free_result(res);
return 1;
}
/*
Only one row is returned, and the first column is the name of the
active log.
*/
strmake(buff_log_name, row[0], buff_len - 1);
static int do_reset_master(MYSQL *mysql_con) mysql_free_result(res);
return 0;
}
static int purge_bin_logs_to(MYSQL *mysql_con, char* log_name)
{ {
return mysql_query_with_error_report(mysql_con, 0, "RESET MASTER"); DYNAMIC_STRING str;
int err;
init_dynamic_string_checked(&str, "PURGE BINARY LOGS TO '", 1024, 1024);
dynstr_append_checked(&str, log_name);
dynstr_append_checked(&str, "'");
err = mysql_query_with_error_report(mysql_con, 0, str.str);
dynstr_free(&str);
return err;
} }
...@@ -3795,6 +3826,7 @@ static void dynstr_realloc_checked(DYNAMIC_STRING *str, ulong additional_size) ...@@ -3795,6 +3826,7 @@ static void dynstr_realloc_checked(DYNAMIC_STRING *str, ulong additional_size)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char bin_log_name[FN_REFLEN];
int exit_code; int exit_code;
MY_INIT("mysqldump"); MY_INIT("mysqldump");
...@@ -3831,8 +3863,13 @@ int main(int argc, char **argv) ...@@ -3831,8 +3863,13 @@ int main(int argc, char **argv)
goto err; goto err;
if (opt_single_transaction && start_transaction(mysql)) if (opt_single_transaction && start_transaction(mysql))
goto err; goto err;
if (opt_delete_master_logs && do_reset_master(mysql)) if (opt_delete_master_logs)
{
if (mysql_refresh(mysql, REFRESH_LOG) ||
get_bin_log_name(mysql, bin_log_name, sizeof(bin_log_name)))
goto err; goto err;
flush_logs= 0;
}
if (opt_lock_all_tables || opt_master_data) if (opt_lock_all_tables || opt_master_data)
{ {
if (flush_logs && mysql_refresh(mysql, REFRESH_LOG)) if (flush_logs && mysql_refresh(mysql, REFRESH_LOG))
...@@ -3856,6 +3893,18 @@ int main(int argc, char **argv) ...@@ -3856,6 +3893,18 @@ int main(int argc, char **argv)
/* One or more databases, all tables */ /* One or more databases, all tables */
dump_databases(argv); dump_databases(argv);
} }
/* ensure dumped data flushed */
if (md_result_file && fflush(md_result_file))
{
if (!first_error)
first_error= EX_MYSQLERR;
goto err;
}
/* everything successful, purge the old logs files */
if (opt_delete_master_logs && purge_bin_logs_to(mysql, bin_log_name))
goto err;
#ifdef HAVE_SMEM #ifdef HAVE_SMEM
my_free(shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR)); my_free(shared_memory_base_name,MYF(MY_ALLOW_ZERO_PTR));
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment