mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
WL#5670: Proposal: Remove SHOW NEW MASTER statement
Removes SHOW NEW MASTER statement and all related code. Also removes the unused function update_slave_list from repl_failsafe.cc. mysql-test/r/signal_code.result: Updated result file. The output of SHOW PROCEDURE CODE has changed, because the numerical values of some SQLCOM_ commands have changes. This is not a problem, because SHOW PROCEDURE CODE only exists in debug builds and the numerical values of SQLCOM_ constants are not exposed elsewhere. mysql-test/r/sp-code.result: Updated result file. The output of SHOW PROCEDURE CODE has changed, because the numerical values of some SQLCOM_ commands have changes. This is not a problem, because SHOW PROCEDURE CODE only exists in debug builds and the numerical values of SQLCOM_ constants are not exposed elsewhere. sql/mysqld.cc: Remove SQLCOM_SHOW_NEW_MASTER. sql/repl_failsafe.cc: Remove show_new_master, which was only used by the removed SHOW NEW MASTER statement. Remove translate_master, which was only used by show_new_master. Remove find_slave_event, which was only used by translate_master. Remove find_target_pos, which was only used by translate_master. Remove cmp_master_pos, which was only used by translate_master. Remove update_slave_list, which was not used at all. sql/repl_failsafe.h: Remove declarations of functions removed by this patch: update_slave_list, show_new_master, translate_master, update_slave_list Remove declarations of functions that did not exist before this patch: handle_failsafe_rpl, load_master_data Remove declaration of function that is static in slave.cc: connect_to_master sql/sp_head.cc: Removed SQLCOM_SHOW_NEW_MASTER sql/sql_lex.h: Removed SQLCOM_SHOW_NEW_MASTER sql/sql_parse.cc: Removed SQLCOM_SHOW_NEW_MASTER sql/sql_repl.cc: Removed cmp_master_pos(char*,ulonglong,char*,ulonglong), which was only used by cmp_master_pos*Slave_log_event* sev, LEX_MASTER_INFO* mi) in repl_failsafe.cc, which has been removed. sql/sql_repl.h: removed cmp_master_pos sql/sql_yacc.yy: removed syntax SHOW NEW MASTER.
This commit is contained in:
@ -20,16 +20,16 @@ return 0;
|
|||||||
end $$
|
end $$
|
||||||
show procedure code signal_proc;
|
show procedure code signal_proc;
|
||||||
Pos Instruction
|
Pos Instruction
|
||||||
0 stmt 131 "SIGNAL foo"
|
0 stmt 130 "SIGNAL foo"
|
||||||
1 stmt 131 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
1 stmt 130 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||||
2 stmt 132 "RESIGNAL foo"
|
2 stmt 131 "RESIGNAL foo"
|
||||||
3 stmt 132 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
3 stmt 131 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||||
drop procedure signal_proc;
|
drop procedure signal_proc;
|
||||||
show function code signal_func;
|
show function code signal_func;
|
||||||
Pos Instruction
|
Pos Instruction
|
||||||
0 stmt 131 "SIGNAL foo"
|
0 stmt 130 "SIGNAL foo"
|
||||||
1 stmt 131 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
1 stmt 130 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||||
2 stmt 132 "RESIGNAL foo"
|
2 stmt 131 "RESIGNAL foo"
|
||||||
3 stmt 132 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
3 stmt 131 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||||
4 freturn 3 0
|
4 freturn 3 0
|
||||||
drop function signal_func;
|
drop function signal_func;
|
||||||
|
@ -155,11 +155,11 @@ Pos Instruction
|
|||||||
0 stmt 9 "drop temporary table if exists sudoku..."
|
0 stmt 9 "drop temporary table if exists sudoku..."
|
||||||
1 stmt 1 "create temporary table sudoku_work ( ..."
|
1 stmt 1 "create temporary table sudoku_work ( ..."
|
||||||
2 stmt 1 "create temporary table sudoku_schedul..."
|
2 stmt 1 "create temporary table sudoku_schedul..."
|
||||||
3 stmt 89 "call sudoku_init()"
|
3 stmt 88 "call sudoku_init()"
|
||||||
4 jump_if_not 7(8) p_naive@0
|
4 jump_if_not 7(8) p_naive@0
|
||||||
5 stmt 4 "update sudoku_work set cnt = 0 where ..."
|
5 stmt 4 "update sudoku_work set cnt = 0 where ..."
|
||||||
6 jump 8
|
6 jump 8
|
||||||
7 stmt 89 "call sudoku_count()"
|
7 stmt 88 "call sudoku_count()"
|
||||||
8 stmt 6 "insert into sudoku_schedule (row,col)..."
|
8 stmt 6 "insert into sudoku_schedule (row,col)..."
|
||||||
9 set v_scounter@2 0
|
9 set v_scounter@2 0
|
||||||
10 set v_i@3 1
|
10 set v_i@3 1
|
||||||
|
@ -3028,7 +3028,6 @@ SHOW_VAR com_status_vars[]= {
|
|||||||
{"show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS},
|
{"show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS},
|
||||||
{"show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS},
|
{"show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS},
|
||||||
{"show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS},
|
{"show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS},
|
||||||
{"show_new_master", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_NEW_MASTER]), SHOW_LONG_STATUS},
|
|
||||||
{"show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS},
|
{"show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS},
|
||||||
{"show_plugins", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PLUGINS]), SHOW_LONG_STATUS},
|
{"show_plugins", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PLUGINS]), SHOW_LONG_STATUS},
|
||||||
{"show_privileges", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PRIVILEGES]), SHOW_LONG_STATUS},
|
{"show_privileges", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PRIVILEGES]), SHOW_LONG_STATUS},
|
||||||
|
@ -56,10 +56,6 @@ const char* rpl_status_type[]=
|
|||||||
"RECOVERY_CAPTAIN","NULL",NullS
|
"RECOVERY_CAPTAIN","NULL",NullS
|
||||||
};
|
};
|
||||||
|
|
||||||
static Slave_log_event* find_slave_event(IO_CACHE* log,
|
|
||||||
const char* log_file_name,
|
|
||||||
char* errmsg);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
All of the functions defined in this file which are not used (the ones to
|
All of the functions defined in this file which are not used (the ones to
|
||||||
handle failsafe) are not used; their code has not been updated for more than
|
handle failsafe) are not used; their code has not been updated for more than
|
||||||
@ -91,13 +87,6 @@ void change_rpl_status(ulong from_status, ulong to_status)
|
|||||||
}\
|
}\
|
||||||
|
|
||||||
|
|
||||||
static inline int cmp_master_pos(Slave_log_event* sev, LEX_MASTER_INFO* mi)
|
|
||||||
{
|
|
||||||
return cmp_master_pos(sev->master_log, sev->master_pos, mi->log_file_name,
|
|
||||||
mi->pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void unregister_slave(THD* thd, bool only_mine, bool need_mutex)
|
void unregister_slave(THD* thd, bool only_mine, bool need_mutex)
|
||||||
{
|
{
|
||||||
if (thd->server_id)
|
if (thd->server_id)
|
||||||
@ -228,361 +217,6 @@ void end_slave_list()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_target_pos(LEX_MASTER_INFO *mi, IO_CACHE *log, char *errmsg)
|
|
||||||
{
|
|
||||||
my_off_t log_pos = (my_off_t) mi->pos;
|
|
||||||
uint32 target_server_id = mi->server_id;
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
Log_event* ev;
|
|
||||||
if (!(ev= Log_event::read_log_event(log, (mysql_mutex_t*) 0, 0)))
|
|
||||||
{
|
|
||||||
if (log->error > 0)
|
|
||||||
strmov(errmsg, "Binary log truncated in the middle of event");
|
|
||||||
else if (log->error < 0)
|
|
||||||
strmov(errmsg, "I/O error reading binary log");
|
|
||||||
else
|
|
||||||
strmov(errmsg, "Could not find target event in the binary log");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev->log_pos >= log_pos && ev->server_id == target_server_id)
|
|
||||||
{
|
|
||||||
delete ev;
|
|
||||||
mi->pos = my_b_tell(log);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
delete ev;
|
|
||||||
}
|
|
||||||
/* Impossible */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@details
|
|
||||||
Before 4.0.15 we had a member of THD called log_pos, it was meant for
|
|
||||||
failsafe replication code in repl_failsafe.cc which is disabled until
|
|
||||||
it is reworked. Event's log_pos used to be preserved through
|
|
||||||
log-slave-updates to make code in repl_failsafe.cc work (this
|
|
||||||
function, SHOW NEW MASTER); but on the other side it caused unexpected
|
|
||||||
values in Exec_Master_Log_Pos in A->B->C replication setup,
|
|
||||||
synchronization problems in master_pos_wait(), ... So we
|
|
||||||
(Dmitri & Guilhem) removed it.
|
|
||||||
|
|
||||||
So for now this function is broken.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg)
|
|
||||||
{
|
|
||||||
LOG_INFO linfo;
|
|
||||||
char last_log_name[FN_REFLEN];
|
|
||||||
IO_CACHE log;
|
|
||||||
File file = -1, last_file = -1;
|
|
||||||
mysql_mutex_t *log_lock;
|
|
||||||
const char* errmsg_p;
|
|
||||||
Slave_log_event* sev = 0;
|
|
||||||
my_off_t last_pos = 0;
|
|
||||||
int error = 1;
|
|
||||||
int cmp_res;
|
|
||||||
LINT_INIT(cmp_res);
|
|
||||||
DBUG_ENTER("translate_master");
|
|
||||||
|
|
||||||
if (!mysql_bin_log.is_open())
|
|
||||||
{
|
|
||||||
strmov(errmsg,"Binary log is not open");
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!server_id_supplied)
|
|
||||||
{
|
|
||||||
strmov(errmsg, "Misconfigured master - server id was not set");
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mysql_bin_log.find_log_pos(&linfo, NullS, 1))
|
|
||||||
{
|
|
||||||
strmov(errmsg,"Could not find first log");
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
|
||||||
thd->current_linfo = &linfo;
|
|
||||||
|
|
||||||
bzero((char*) &log,sizeof(log));
|
|
||||||
log_lock = mysql_bin_log.get_log_lock();
|
|
||||||
mysql_mutex_lock(log_lock);
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((file=open_binlog(&log, linfo.log_file_name, &errmsg_p)) < 0)
|
|
||||||
{
|
|
||||||
strmov(errmsg, errmsg_p);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(sev = find_slave_event(&log, linfo.log_file_name, errmsg)))
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
cmp_res = cmp_master_pos(sev, mi);
|
|
||||||
delete sev;
|
|
||||||
|
|
||||||
if (!cmp_res)
|
|
||||||
{
|
|
||||||
/* Copy basename */
|
|
||||||
fn_format(mi->log_file_name, linfo.log_file_name, "","",1);
|
|
||||||
mi->pos = my_b_tell(&log);
|
|
||||||
goto mi_inited;
|
|
||||||
}
|
|
||||||
else if (cmp_res > 0)
|
|
||||||
{
|
|
||||||
if (!last_pos)
|
|
||||||
{
|
|
||||||
strmov(errmsg,
|
|
||||||
"Slave event in first log points past the target position");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
end_io_cache(&log);
|
|
||||||
mysql_file_close(file, MYF(MY_WME));
|
|
||||||
if (init_io_cache(&log, (file = last_file), IO_SIZE, READ_CACHE, 0, 0,
|
|
||||||
MYF(MY_WME)))
|
|
||||||
{
|
|
||||||
errmsg[0] = 0;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
strmov(last_log_name, linfo.log_file_name);
|
|
||||||
last_pos = my_b_tell(&log);
|
|
||||||
|
|
||||||
switch (mysql_bin_log.find_next_log(&linfo, 1)) {
|
|
||||||
case LOG_INFO_EOF:
|
|
||||||
if (last_file >= 0)
|
|
||||||
mysql_file_close(last_file, MYF(MY_WME));
|
|
||||||
last_file = -1;
|
|
||||||
goto found_log;
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
strmov(errmsg, "Error reading log index");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
end_io_cache(&log);
|
|
||||||
if (last_file >= 0)
|
|
||||||
mysql_file_close(last_file, MYF(MY_WME));
|
|
||||||
last_file = file;
|
|
||||||
}
|
|
||||||
|
|
||||||
found_log:
|
|
||||||
my_b_seek(&log, last_pos);
|
|
||||||
if (find_target_pos(mi,&log,errmsg))
|
|
||||||
goto err;
|
|
||||||
fn_format(mi->log_file_name, last_log_name, "","",1); /* Copy basename */
|
|
||||||
|
|
||||||
mi_inited:
|
|
||||||
error = 0;
|
|
||||||
err:
|
|
||||||
mysql_mutex_unlock(log_lock);
|
|
||||||
end_io_cache(&log);
|
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
|
||||||
thd->current_linfo = 0;
|
|
||||||
mysql_mutex_unlock(&LOCK_thread_count);
|
|
||||||
if (file >= 0)
|
|
||||||
mysql_file_close(file, MYF(MY_WME));
|
|
||||||
if (last_file >= 0 && last_file != file)
|
|
||||||
mysql_file_close(last_file, MYF(MY_WME));
|
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Caller must delete result when done.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static Slave_log_event* find_slave_event(IO_CACHE* log,
|
|
||||||
const char* log_file_name,
|
|
||||||
char* errmsg)
|
|
||||||
{
|
|
||||||
Log_event* ev;
|
|
||||||
int i;
|
|
||||||
bool slave_event_found = 0;
|
|
||||||
LINT_INIT(ev);
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
if (!(ev= Log_event::read_log_event(log, (mysql_mutex_t*)0, 0)))
|
|
||||||
{
|
|
||||||
my_snprintf(errmsg, SLAVE_ERRMSG_SIZE,
|
|
||||||
"Error reading event in log '%s'",
|
|
||||||
(char*)log_file_name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (ev->get_type_code() == SLAVE_EVENT)
|
|
||||||
{
|
|
||||||
slave_event_found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delete ev;
|
|
||||||
}
|
|
||||||
if (!slave_event_found)
|
|
||||||
{
|
|
||||||
my_snprintf(errmsg, SLAVE_ERRMSG_SIZE,
|
|
||||||
"Could not find slave event in log '%s'",
|
|
||||||
(char*)log_file_name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Slave_log_event*)ev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
This function is broken now.
|
|
||||||
|
|
||||||
@seealso translate_master()
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool show_new_master(THD* thd)
|
|
||||||
{
|
|
||||||
Protocol *protocol= thd->protocol;
|
|
||||||
DBUG_ENTER("show_new_master");
|
|
||||||
List<Item> field_list;
|
|
||||||
char errmsg[SLAVE_ERRMSG_SIZE];
|
|
||||||
LEX_MASTER_INFO* lex_mi= &thd->lex->mi;
|
|
||||||
|
|
||||||
errmsg[0]=0; // Safety
|
|
||||||
if (translate_master(thd, lex_mi, errmsg))
|
|
||||||
{
|
|
||||||
if (errmsg[0])
|
|
||||||
my_error(ER_ERROR_WHEN_EXECUTING_COMMAND, MYF(0),
|
|
||||||
"SHOW NEW MASTER", errmsg);
|
|
||||||
DBUG_RETURN(TRUE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
field_list.push_back(new Item_empty_string("Log_name", 20));
|
|
||||||
field_list.push_back(new Item_return_int("Log_pos", 10,
|
|
||||||
MYSQL_TYPE_LONGLONG));
|
|
||||||
if (protocol->send_result_set_metadata(&field_list,
|
|
||||||
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
|
||||||
DBUG_RETURN(TRUE);
|
|
||||||
protocol->prepare_for_resend();
|
|
||||||
protocol->store(lex_mi->log_file_name, &my_charset_bin);
|
|
||||||
protocol->store((ulonglong) lex_mi->pos);
|
|
||||||
if (protocol->write())
|
|
||||||
DBUG_RETURN(TRUE);
|
|
||||||
my_eof(thd);
|
|
||||||
DBUG_RETURN(FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Asks the master for the list of its other connected slaves.
|
|
||||||
|
|
||||||
This is for failsafe replication:
|
|
||||||
in order for failsafe replication to work, the servers involved in
|
|
||||||
replication must know of each other. We accomplish this by having each
|
|
||||||
slave report to the master how to reach it, and on connection, each
|
|
||||||
slave receives information about where the other slaves are.
|
|
||||||
|
|
||||||
@param mysql pre-existing connection to the master
|
|
||||||
@param mi master info
|
|
||||||
|
|
||||||
@note
|
|
||||||
mi is used only to give detailed error messages which include the
|
|
||||||
hostname/port of the master, the username used by the slave to connect to
|
|
||||||
the master.
|
|
||||||
If the user used by the slave to connect to the master does not have the
|
|
||||||
REPLICATION SLAVE privilege, it will pop in this function because
|
|
||||||
SHOW SLAVE HOSTS will fail on the master.
|
|
||||||
|
|
||||||
@retval
|
|
||||||
1 error
|
|
||||||
@retval
|
|
||||||
0 success
|
|
||||||
*/
|
|
||||||
|
|
||||||
int update_slave_list(MYSQL* mysql, Master_info* mi)
|
|
||||||
{
|
|
||||||
MYSQL_RES* res=0;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
const char* error=0;
|
|
||||||
bool have_auth_info;
|
|
||||||
int port_ind;
|
|
||||||
DBUG_ENTER("update_slave_list");
|
|
||||||
|
|
||||||
if (mysql_real_query(mysql, STRING_WITH_LEN("SHOW SLAVE HOSTS")) ||
|
|
||||||
!(res = mysql_store_result(mysql)))
|
|
||||||
{
|
|
||||||
error= mysql_error(mysql);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (mysql_num_fields(res)) {
|
|
||||||
case 5:
|
|
||||||
have_auth_info = 0;
|
|
||||||
port_ind=2;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
have_auth_info = 1;
|
|
||||||
port_ind=4;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
error= "the master returned an invalid number of fields for SHOW SLAVE \
|
|
||||||
HOSTS";
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
mysql_mutex_lock(&LOCK_slave_list);
|
|
||||||
|
|
||||||
while ((row= mysql_fetch_row(res)))
|
|
||||||
{
|
|
||||||
uint32 log_server_id;
|
|
||||||
SLAVE_INFO* si, *old_si;
|
|
||||||
log_server_id = atoi(row[0]);
|
|
||||||
if ((old_si= (SLAVE_INFO*)my_hash_search(&slave_list,
|
|
||||||
(uchar*)&log_server_id,4)))
|
|
||||||
si = old_si;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME))))
|
|
||||||
{
|
|
||||||
error= "the slave is out of memory";
|
|
||||||
mysql_mutex_unlock(&LOCK_slave_list);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
si->server_id = log_server_id;
|
|
||||||
if (my_hash_insert(&slave_list, (uchar*)si))
|
|
||||||
{
|
|
||||||
error= "the slave is out of memory";
|
|
||||||
mysql_mutex_unlock(&LOCK_slave_list);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strmake(si->host, row[1], sizeof(si->host)-1);
|
|
||||||
si->port = atoi(row[port_ind]);
|
|
||||||
si->rpl_recovery_rank = atoi(row[port_ind+1]);
|
|
||||||
si->master_id = atoi(row[port_ind+2]);
|
|
||||||
if (have_auth_info)
|
|
||||||
{
|
|
||||||
strmake(si->user, row[2], sizeof(si->user)-1);
|
|
||||||
strmake(si->password, row[3], sizeof(si->password)-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mysql_mutex_unlock(&LOCK_slave_list);
|
|
||||||
|
|
||||||
err:
|
|
||||||
if (res)
|
|
||||||
mysql_free_result(res);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
sql_print_error("While trying to obtain the list of slaves from the master "
|
|
||||||
"'%s:%d', user '%s' got the following error: '%s'",
|
|
||||||
mi->host, mi->port, mi->user, error);
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Execute a SHOW SLAVE HOSTS statement.
|
Execute a SHOW SLAVE HOSTS statement.
|
||||||
|
@ -33,19 +33,12 @@ extern mysql_cond_t COND_rpl_status;
|
|||||||
extern TYPELIB rpl_role_typelib;
|
extern TYPELIB rpl_role_typelib;
|
||||||
extern const char* rpl_role_type[], *rpl_status_type[];
|
extern const char* rpl_role_type[], *rpl_status_type[];
|
||||||
|
|
||||||
pthread_handler_t handle_failsafe_rpl(void *arg);
|
|
||||||
void change_rpl_status(ulong from_status, ulong to_status);
|
void change_rpl_status(ulong from_status, ulong to_status);
|
||||||
int find_recovery_captain(THD* thd, MYSQL* mysql);
|
int find_recovery_captain(THD* thd, MYSQL* mysql);
|
||||||
int update_slave_list(MYSQL* mysql, Master_info* mi);
|
|
||||||
|
|
||||||
extern HASH slave_list;
|
extern HASH slave_list;
|
||||||
|
|
||||||
bool load_master_data(THD* thd);
|
|
||||||
int connect_to_master(THD *thd, MYSQL* mysql, Master_info* mi);
|
|
||||||
|
|
||||||
bool show_new_master(THD* thd);
|
|
||||||
bool show_slave_hosts(THD* thd);
|
bool show_slave_hosts(THD* thd);
|
||||||
int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg);
|
|
||||||
void init_slave_list();
|
void init_slave_list();
|
||||||
void end_slave_list();
|
void end_slave_list();
|
||||||
int register_slave(THD* thd, uchar* packet, uint packet_length);
|
int register_slave(THD* thd, uchar* packet, uint packet_length);
|
||||||
|
@ -237,7 +237,6 @@ sp_get_flags_for_command(LEX *lex)
|
|||||||
case SQLCOM_SHOW_EVENTS:
|
case SQLCOM_SHOW_EVENTS:
|
||||||
case SQLCOM_SHOW_KEYS:
|
case SQLCOM_SHOW_KEYS:
|
||||||
case SQLCOM_SHOW_MASTER_STAT:
|
case SQLCOM_SHOW_MASTER_STAT:
|
||||||
case SQLCOM_SHOW_NEW_MASTER:
|
|
||||||
case SQLCOM_SHOW_OPEN_TABLES:
|
case SQLCOM_SHOW_OPEN_TABLES:
|
||||||
case SQLCOM_SHOW_PRIVILEGES:
|
case SQLCOM_SHOW_PRIVILEGES:
|
||||||
case SQLCOM_SHOW_PROCESSLIST:
|
case SQLCOM_SHOW_PROCESSLIST:
|
||||||
|
@ -162,7 +162,7 @@ enum enum_sql_command {
|
|||||||
SQLCOM_SHOW_OPEN_TABLES,
|
SQLCOM_SHOW_OPEN_TABLES,
|
||||||
SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,
|
SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,
|
||||||
SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI,
|
SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI,
|
||||||
SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO,
|
SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_DO,
|
||||||
SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
|
SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
|
||||||
SQLCOM_SHOW_STORAGE_ENGINES, SQLCOM_SHOW_PRIVILEGES,
|
SQLCOM_SHOW_STORAGE_ENGINES, SQLCOM_SHOW_PRIVILEGES,
|
||||||
SQLCOM_HELP, SQLCOM_CREATE_USER, SQLCOM_DROP_USER, SQLCOM_RENAME_USER,
|
SQLCOM_HELP, SQLCOM_CREATE_USER, SQLCOM_DROP_USER, SQLCOM_RENAME_USER,
|
||||||
@ -269,8 +269,7 @@ typedef struct st_lex_server_options
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Structure to hold parameters for CHANGE MASTER or START/STOP SLAVE
|
Structure to hold parameters for CHANGE MASTER, START SLAVE, and STOP SLAVE.
|
||||||
or SHOW NEW MASTER.
|
|
||||||
|
|
||||||
Remark: this should not be confused with Master_info (and perhaps
|
Remark: this should not be confused with Master_info (and perhaps
|
||||||
would better be renamed to st_lex_replication_info). Some fields,
|
would better be renamed to st_lex_replication_info). Some fields,
|
||||||
|
@ -316,7 +316,6 @@ void init_update_queries(void)
|
|||||||
sql_command_flags[SQLCOM_SHOW_VARIABLES]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE;
|
sql_command_flags[SQLCOM_SHOW_VARIABLES]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE;
|
||||||
sql_command_flags[SQLCOM_SHOW_CHARSETS]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE;
|
sql_command_flags[SQLCOM_SHOW_CHARSETS]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE;
|
||||||
sql_command_flags[SQLCOM_SHOW_COLLATIONS]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE;
|
sql_command_flags[SQLCOM_SHOW_COLLATIONS]= CF_STATUS_COMMAND | CF_REEXECUTION_FRAGILE;
|
||||||
sql_command_flags[SQLCOM_SHOW_NEW_MASTER]= CF_STATUS_COMMAND;
|
|
||||||
sql_command_flags[SQLCOM_SHOW_BINLOGS]= CF_STATUS_COMMAND;
|
sql_command_flags[SQLCOM_SHOW_BINLOGS]= CF_STATUS_COMMAND;
|
||||||
sql_command_flags[SQLCOM_SHOW_SLAVE_HOSTS]= CF_STATUS_COMMAND;
|
sql_command_flags[SQLCOM_SHOW_SLAVE_HOSTS]= CF_STATUS_COMMAND;
|
||||||
sql_command_flags[SQLCOM_SHOW_BINLOG_EVENTS]= CF_STATUS_COMMAND;
|
sql_command_flags[SQLCOM_SHOW_BINLOG_EVENTS]= CF_STATUS_COMMAND;
|
||||||
@ -2145,19 +2144,6 @@ case SQLCOM_PREPARE:
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SQLCOM_SHOW_NEW_MASTER:
|
|
||||||
{
|
|
||||||
if (check_global_access(thd, REPL_SLAVE_ACL))
|
|
||||||
goto error;
|
|
||||||
/* This query don't work now. See comment in repl_failsafe.cc */
|
|
||||||
#ifndef WORKING_NEW_MASTER
|
|
||||||
my_error(ER_NOT_SUPPORTED_YET, MYF(0), "SHOW NEW MASTER");
|
|
||||||
goto error;
|
|
||||||
#else
|
|
||||||
res = show_new_master(thd);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
case SQLCOM_SHOW_SLAVE_HOSTS:
|
case SQLCOM_SHOW_SLAVE_HOSTS:
|
||||||
|
@ -1694,23 +1694,6 @@ int reset_master(THD* thd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1,
|
|
||||||
const char* log_file_name2, ulonglong log_pos2)
|
|
||||||
{
|
|
||||||
int res;
|
|
||||||
size_t log_file_name1_len= strlen(log_file_name1);
|
|
||||||
size_t log_file_name2_len= strlen(log_file_name2);
|
|
||||||
|
|
||||||
// We assume that both log names match up to '.'
|
|
||||||
if (log_file_name1_len == log_file_name2_len)
|
|
||||||
{
|
|
||||||
if ((res= strcmp(log_file_name1, log_file_name2)))
|
|
||||||
return res;
|
|
||||||
return (log_pos1 < log_pos2) ? -1 : (log_pos1 == log_pos2) ? 0 : 1;
|
|
||||||
}
|
|
||||||
return ((log_file_name1_len < log_file_name2_len) ? -1 : 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Execute a SHOW BINLOG EVENTS statement.
|
Execute a SHOW BINLOG EVENTS statement.
|
||||||
|
@ -43,8 +43,6 @@ int start_slave(THD* thd, Master_info* mi, bool net_report);
|
|||||||
int stop_slave(THD* thd, Master_info* mi, bool net_report);
|
int stop_slave(THD* thd, Master_info* mi, bool net_report);
|
||||||
bool change_master(THD* thd, Master_info* mi);
|
bool change_master(THD* thd, Master_info* mi);
|
||||||
bool mysql_show_binlog_events(THD* thd);
|
bool mysql_show_binlog_events(THD* thd);
|
||||||
int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1,
|
|
||||||
const char* log_file_name2, ulonglong log_pos2);
|
|
||||||
int reset_slave(THD *thd, Master_info* mi);
|
int reset_slave(THD *thd, Master_info* mi);
|
||||||
int reset_master(THD* thd);
|
int reset_master(THD* thd);
|
||||||
bool purge_master_logs(THD* thd, const char* to_log);
|
bool purge_master_logs(THD* thd, const char* to_log);
|
||||||
|
@ -10921,19 +10921,6 @@ show_param:
|
|||||||
if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS))
|
if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
| NEW_SYM MASTER_SYM FOR_SYM SLAVE
|
|
||||||
WITH MASTER_LOG_FILE_SYM EQ
|
|
||||||
TEXT_STRING_sys /* $8 */
|
|
||||||
AND_SYM MASTER_LOG_POS_SYM EQ
|
|
||||||
ulonglong_num /* $12 */
|
|
||||||
AND_SYM MASTER_SERVER_ID_SYM EQ
|
|
||||||
ulong_num /* $16 */
|
|
||||||
{
|
|
||||||
Lex->sql_command = SQLCOM_SHOW_NEW_MASTER;
|
|
||||||
Lex->mi.log_file_name = $8.str;
|
|
||||||
Lex->mi.pos = $12;
|
|
||||||
Lex->mi.server_id = $16;
|
|
||||||
}
|
|
||||||
| master_or_binary LOGS_SYM
|
| master_or_binary LOGS_SYM
|
||||||
{
|
{
|
||||||
Lex->sql_command = SQLCOM_SHOW_BINLOGS;
|
Lex->sql_command = SQLCOM_SHOW_BINLOGS;
|
||||||
|
Reference in New Issue
Block a user