2001-10-10 04:56:24 +02:00
|
|
|
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB & Sasha
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
|
|
|
|
#include "mysql_priv.h"
|
2003-01-15 09:11:44 +01:00
|
|
|
#ifdef HAVE_REPLICATION
|
|
|
|
|
2001-10-10 04:56:24 +02:00
|
|
|
#include "repl_failsafe.h"
|
2001-10-23 21:28:03 +02:00
|
|
|
#include "sql_repl.h"
|
|
|
|
#include "slave.h"
|
2001-11-11 06:24:12 +01:00
|
|
|
#include "sql_acl.h"
|
|
|
|
#include "log_event.h"
|
2001-10-23 21:28:03 +02:00
|
|
|
#include <mysql.h>
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
#define SLAVE_LIST_CHUNK 128
|
|
|
|
#define SLAVE_ERRMSG_SIZE (FN_REFLEN+64)
|
|
|
|
|
2001-10-10 04:56:24 +02:00
|
|
|
|
|
|
|
RPL_STATUS rpl_status=RPL_NULL;
|
|
|
|
pthread_mutex_t LOCK_rpl_status;
|
|
|
|
pthread_cond_t COND_rpl_status;
|
2001-11-11 06:24:12 +01:00
|
|
|
HASH slave_list;
|
2001-10-10 04:56:24 +02:00
|
|
|
|
2001-10-10 23:36:35 +02:00
|
|
|
const char *rpl_role_type[] = {"MASTER","SLAVE",NullS};
|
|
|
|
TYPELIB rpl_role_typelib = {array_elements(rpl_role_type)-1,"",
|
2004-10-25 14:51:26 +02:00
|
|
|
rpl_role_type, NULL};
|
2001-10-10 04:56:24 +02:00
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
const char* rpl_status_type[]=
|
|
|
|
{
|
|
|
|
"AUTH_MASTER","ACTIVE_SLAVE","IDLE_SLAVE", "LOST_SOLDIER","TROOP_SOLDIER",
|
|
|
|
"RECOVERY_CAPTAIN","NULL",NullS
|
|
|
|
};
|
2001-10-10 04:56:24 +02:00
|
|
|
TYPELIB rpl_status_typelib= {array_elements(rpl_status_type)-1,"",
|
2004-10-25 14:51:26 +02:00
|
|
|
rpl_status_type, NULL};
|
2001-10-10 04:56:24 +02:00
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
static Slave_log_event* find_slave_event(IO_CACHE* log,
|
|
|
|
const char* log_file_name,
|
|
|
|
char* errmsg);
|
|
|
|
|
2003-12-04 22:42:18 +01:00
|
|
|
/*
|
|
|
|
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
|
|
|
|
one year now so should be considered as BADLY BROKEN. Do not enable it.
|
|
|
|
The used functions (to handle LOAD DATA FROM MASTER, plus some small
|
|
|
|
functions like register_slave()) are working.
|
|
|
|
*/
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-10-23 21:28:03 +02:00
|
|
|
static int init_failsafe_rpl_thread(THD* thd)
|
|
|
|
{
|
|
|
|
DBUG_ENTER("init_failsafe_rpl_thread");
|
2004-06-10 14:03:25 +02:00
|
|
|
/*
|
|
|
|
thd->bootstrap is to report errors barely to stderr; if this code is
|
|
|
|
enable again one day, one should check if bootstrap is still needed (maybe
|
|
|
|
this thread has no other error reporting method).
|
|
|
|
*/
|
2001-10-23 21:28:03 +02:00
|
|
|
thd->system_thread = thd->bootstrap = 1;
|
2003-02-27 16:35:51 +01:00
|
|
|
thd->host_or_ip= "";
|
2001-10-23 21:28:03 +02:00
|
|
|
thd->client_capabilities = 0;
|
|
|
|
my_net_init(&thd->net, 0);
|
2002-07-23 17:31:22 +02:00
|
|
|
thd->net.read_timeout = slave_net_timeout;
|
|
|
|
thd->max_client_packet_length=thd->net.max_packet;
|
2001-10-23 21:28:03 +02:00
|
|
|
thd->master_access= ~0;
|
|
|
|
thd->priv_user = 0;
|
|
|
|
pthread_mutex_lock(&LOCK_thread_count);
|
|
|
|
thd->thread_id = thread_id++;
|
|
|
|
pthread_mutex_unlock(&LOCK_thread_count);
|
|
|
|
|
2002-07-23 17:31:22 +02:00
|
|
|
if (init_thr_lock() || thd->store_globals())
|
2001-10-23 21:28:03 +02:00
|
|
|
{
|
2003-05-26 18:01:20 +02:00
|
|
|
close_connection(thd, ER_OUT_OF_RESOURCES, 1); // is this needed?
|
2003-06-10 20:42:29 +02:00
|
|
|
statistic_increment(aborted_connects,&LOCK_status);
|
2001-10-23 21:28:03 +02:00
|
|
|
end_thread(thd,0);
|
|
|
|
DBUG_RETURN(-1);
|
|
|
|
}
|
|
|
|
|
2003-01-28 07:38:28 +01:00
|
|
|
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__)
|
2001-10-23 21:28:03 +02:00
|
|
|
sigset_t set;
|
|
|
|
VOID(sigemptyset(&set)); // Get mask in use
|
|
|
|
VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals));
|
|
|
|
#endif
|
|
|
|
|
2004-11-08 00:13:54 +01:00
|
|
|
thd->mem_root->free= thd->mem_root->used= 0;
|
2002-12-20 13:58:27 +01:00
|
|
|
if (thd->variables.max_join_size == HA_POS_ERROR)
|
2002-07-23 17:31:22 +02:00
|
|
|
thd->options|= OPTION_BIG_SELECTS;
|
2001-10-23 21:28:03 +02:00
|
|
|
|
|
|
|
thd->proc_info="Thread initialized";
|
|
|
|
thd->version=refresh_version;
|
|
|
|
thd->set_time();
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-10-11 21:54:06 +02:00
|
|
|
void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status)
|
|
|
|
{
|
|
|
|
pthread_mutex_lock(&LOCK_rpl_status);
|
|
|
|
if (rpl_status == from_status || rpl_status == RPL_ANY)
|
|
|
|
rpl_status = to_status;
|
2001-10-23 21:28:03 +02:00
|
|
|
pthread_cond_signal(&COND_rpl_status);
|
|
|
|
pthread_mutex_unlock(&LOCK_rpl_status);
|
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
#define get_object(p, obj) \
|
|
|
|
{\
|
|
|
|
uint len = (uint)*p++; \
|
|
|
|
if (p + len > p_end || len >= sizeof(obj)) \
|
|
|
|
goto err; \
|
|
|
|
strmake(obj,(char*) p,len); \
|
|
|
|
p+= len; \
|
|
|
|
}\
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
void unregister_slave(THD* thd, bool only_mine, bool need_mutex)
|
|
|
|
{
|
|
|
|
if (thd->server_id)
|
|
|
|
{
|
2002-06-11 10:20:31 +02:00
|
|
|
if (need_mutex)
|
|
|
|
pthread_mutex_lock(&LOCK_slave_list);
|
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
SLAVE_INFO* old_si;
|
|
|
|
if ((old_si = (SLAVE_INFO*)hash_search(&slave_list,
|
|
|
|
(byte*)&thd->server_id, 4)) &&
|
|
|
|
(!only_mine || old_si->thd == thd))
|
|
|
|
hash_delete(&slave_list, (byte*)old_si);
|
2002-06-11 10:20:31 +02:00
|
|
|
|
|
|
|
if (need_mutex)
|
|
|
|
pthread_mutex_unlock(&LOCK_slave_list);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2002-08-21 21:04:22 +02:00
|
|
|
/*
|
|
|
|
Register slave in 'slave_list' hash table
|
|
|
|
|
|
|
|
RETURN VALUES
|
|
|
|
0 ok
|
|
|
|
1 Error. Error message sent to client
|
|
|
|
*/
|
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
int register_slave(THD* thd, uchar* packet, uint packet_length)
|
|
|
|
{
|
2002-08-21 21:04:22 +02:00
|
|
|
int res;
|
2001-11-11 06:24:12 +01:00
|
|
|
SLAVE_INFO *si;
|
2002-08-21 21:04:22 +02:00
|
|
|
uchar *p= packet, *p_end= packet + packet_length;
|
2001-11-11 06:24:12 +01:00
|
|
|
|
2003-09-26 12:33:13 +02:00
|
|
|
if (check_access(thd, REPL_SLAVE_ACL, any_db,0,0,0))
|
2001-11-11 06:24:12 +01:00
|
|
|
return 1;
|
|
|
|
if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME))))
|
2002-08-21 21:04:22 +02:00
|
|
|
goto err2;
|
2001-11-11 06:24:12 +01:00
|
|
|
|
2002-08-21 21:04:22 +02:00
|
|
|
thd->server_id= si->server_id= uint4korr(p);
|
|
|
|
p+= 4;
|
2001-11-11 06:24:12 +01:00
|
|
|
get_object(p,si->host);
|
|
|
|
get_object(p,si->user);
|
|
|
|
get_object(p,si->password);
|
2002-08-21 21:04:22 +02:00
|
|
|
if (p+10 > p_end)
|
|
|
|
goto err;
|
|
|
|
si->port= uint2korr(p);
|
2001-11-11 06:24:12 +01:00
|
|
|
p += 2;
|
2002-08-21 21:04:22 +02:00
|
|
|
si->rpl_recovery_rank= uint4korr(p);
|
2001-11-11 06:24:12 +01:00
|
|
|
p += 4;
|
2002-08-21 21:04:22 +02:00
|
|
|
if (!(si->master_id= uint4korr(p)))
|
|
|
|
si->master_id= server_id;
|
|
|
|
si->thd= thd;
|
2001-11-11 06:24:12 +01:00
|
|
|
|
2002-08-21 21:04:22 +02:00
|
|
|
pthread_mutex_lock(&LOCK_slave_list);
|
2001-11-11 06:24:12 +01:00
|
|
|
unregister_slave(thd,0,0);
|
2003-09-19 11:44:31 +02:00
|
|
|
res= my_hash_insert(&slave_list, (byte*) si);
|
2001-11-11 06:24:12 +01:00
|
|
|
pthread_mutex_unlock(&LOCK_slave_list);
|
|
|
|
return res;
|
|
|
|
|
|
|
|
err:
|
2002-08-21 21:04:22 +02:00
|
|
|
my_free((gptr) si, MYF(MY_WME));
|
|
|
|
my_message(ER_UNKNOWN_ERROR, "Wrong parameters to function register_slave",
|
|
|
|
MYF(0));
|
|
|
|
err2:
|
|
|
|
return 1;
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
2002-11-07 11:49:02 +01:00
|
|
|
extern "C" uint32
|
2002-11-07 02:54:00 +01:00
|
|
|
*slave_list_key(SLAVE_INFO* si, uint* len,
|
|
|
|
my_bool not_used __attribute__((unused)))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
*len = 4;
|
|
|
|
return &si->server_id;
|
|
|
|
}
|
|
|
|
|
2002-11-07 11:49:02 +01:00
|
|
|
extern "C" void slave_info_free(void *s)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
my_free((gptr) s, MYF(MY_WME));
|
|
|
|
}
|
|
|
|
|
|
|
|
void init_slave_list()
|
|
|
|
{
|
2002-03-14 18:44:42 +01:00
|
|
|
hash_init(&slave_list, system_charset_info, SLAVE_LIST_CHUNK, 0, 0,
|
2002-11-07 02:54:00 +01:00
|
|
|
(hash_get_key) slave_list_key, (hash_free_key) slave_info_free, 0);
|
2001-11-11 06:24:12 +01:00
|
|
|
pthread_mutex_init(&LOCK_slave_list, MY_MUTEX_INIT_FAST);
|
|
|
|
}
|
|
|
|
|
|
|
|
void end_slave_list()
|
|
|
|
{
|
2001-12-20 05:14:11 +01:00
|
|
|
/* No protection by a mutex needed as we are only called at shutdown */
|
|
|
|
if (hash_inited(&slave_list))
|
|
|
|
{
|
|
|
|
hash_free(&slave_list);
|
|
|
|
pthread_mutex_destroy(&LOCK_slave_list);
|
|
|
|
}
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
static int find_target_pos(LEX_MASTER_INFO *mi, IO_CACHE *log, char *errmsg)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
2002-06-11 10:20:31 +02:00
|
|
|
my_off_t log_pos = (my_off_t) mi->pos;
|
2001-11-11 06:24:12 +01:00
|
|
|
uint32 target_server_id = mi->server_id;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
Log_event* ev;
|
2002-06-11 10:20:31 +02:00
|
|
|
if (!(ev = Log_event::read_log_event(log, (pthread_mutex_t*) 0, 0)))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2002-09-11 05:40:08 +02:00
|
|
|
if (ev->log_pos >= log_pos && ev->server_id == target_server_id)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
delete ev;
|
|
|
|
mi->pos = my_b_tell(log);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
delete ev;
|
|
|
|
}
|
2002-06-11 10:20:31 +02:00
|
|
|
/* Impossible */
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
2003-08-20 01:38:31 +02:00
|
|
|
/*
|
|
|
|
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
|
2003-11-20 20:49:05 +01:00
|
|
|
values in Exec_Master_Log_Pos in A->B->C replication setup,
|
2003-08-20 01:38:31 +02:00
|
|
|
synchronization problems in master_pos_wait(), ... So we
|
|
|
|
(Dmitri & Guilhem) removed it.
|
|
|
|
|
|
|
|
So for now this function is broken.
|
|
|
|
*/
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg)
|
|
|
|
{
|
|
|
|
LOG_INFO linfo;
|
2002-08-08 02:12:02 +02:00
|
|
|
char last_log_name[FN_REFLEN];
|
2001-11-11 06:24:12 +01:00
|
|
|
IO_CACHE log;
|
|
|
|
File file = -1, last_file = -1;
|
|
|
|
pthread_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);
|
2002-09-11 05:40:08 +02:00
|
|
|
DBUG_ENTER("translate_master");
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
if (!mysql_bin_log.is_open())
|
|
|
|
{
|
|
|
|
strmov(errmsg,"Binary log is not open");
|
2002-09-11 05:40:08 +02:00
|
|
|
DBUG_RETURN(1);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!server_id_supplied)
|
|
|
|
{
|
|
|
|
strmov(errmsg, "Misconfigured master - server id was not set");
|
2002-09-11 05:40:08 +02:00
|
|
|
DBUG_RETURN(1);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
2002-08-22 15:50:58 +02:00
|
|
|
if (mysql_bin_log.find_log_pos(&linfo, NullS, 1))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
strmov(errmsg,"Could not find first log");
|
2002-09-11 05:40:08 +02:00
|
|
|
DBUG_RETURN(1);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
thd->current_linfo = &linfo;
|
|
|
|
|
|
|
|
bzero((char*) &log,sizeof(log));
|
|
|
|
log_lock = mysql_bin_log.get_log_lock();
|
|
|
|
pthread_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);
|
|
|
|
(void) my_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);
|
|
|
|
|
2002-08-22 15:50:58 +02:00
|
|
|
switch (mysql_bin_log.find_next_log(&linfo, 1)) {
|
2001-11-11 06:24:12 +01:00
|
|
|
case LOG_INFO_EOF:
|
|
|
|
if (last_file >= 0)
|
|
|
|
(void)my_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)
|
|
|
|
(void) my_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:
|
|
|
|
pthread_mutex_unlock(log_lock);
|
|
|
|
end_io_cache(&log);
|
|
|
|
pthread_mutex_lock(&LOCK_thread_count);
|
|
|
|
thd->current_linfo = 0;
|
|
|
|
pthread_mutex_unlock(&LOCK_thread_count);
|
|
|
|
if (file >= 0)
|
|
|
|
(void) my_close(file, MYF(MY_WME));
|
|
|
|
if (last_file >= 0 && last_file != file)
|
|
|
|
(void) my_close(last_file, MYF(MY_WME));
|
|
|
|
|
2002-09-11 05:40:08 +02:00
|
|
|
DBUG_RETURN(error);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
Caller must delete result when done
|
|
|
|
*/
|
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
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);
|
2001-12-06 13:10:51 +01:00
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
if (!(ev = Log_event::read_log_event(log, (pthread_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;
|
|
|
|
}
|
|
|
|
|
2003-08-20 01:38:31 +02:00
|
|
|
/*
|
|
|
|
This function is broken now. See comment for translate_master().
|
|
|
|
*/
|
2001-11-11 06:24:12 +01:00
|
|
|
|
2004-10-20 03:04:37 +02:00
|
|
|
bool show_new_master(THD* thd)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
2002-12-11 08:17:51 +01:00
|
|
|
Protocol *protocol= thd->protocol;
|
2001-11-11 06:24:12 +01:00
|
|
|
DBUG_ENTER("show_new_master");
|
|
|
|
List<Item> field_list;
|
|
|
|
char errmsg[SLAVE_ERRMSG_SIZE];
|
2003-12-19 18:52:13 +01:00
|
|
|
LEX_MASTER_INFO* lex_mi= &thd->lex->mi;
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
errmsg[0]=0; // Safety
|
|
|
|
if (translate_master(thd, lex_mi, errmsg))
|
|
|
|
{
|
|
|
|
if (errmsg[0])
|
now my_printf_error is not better then my_error, but my_error call is shorter
used only one implementation of format parser of (printf)
fixed multistatement
include/mysqld_error.h:
newerror messages
mysql-test/t/key.test:
unknown error replaced with real error
mysys/my_error.c:
my_error & my_printf_error use my_vsprintf
sql/field_conv.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/ha_innodb.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_cmpfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_func.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_strfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/lock.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/log.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/parse_file.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/procedure.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/protocol.cc:
no need reset thd->lex->found_colon to break multiline sequance now, send_error called too late
sql/repl_failsafe.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/set_var.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/share/czech/errmsg.txt:
new errors converted from unknown error
sql/share/danish/errmsg.txt:
new errors converted from unknown error
sql/share/dutch/errmsg.txt:
new errors converted from unknown error
sql/share/english/errmsg.txt:
new errors converted from unknown error
sql/share/estonian/errmsg.txt:
new errors converted from unknown error
sql/share/french/errmsg.txt:
new errors converted from unknown error
sql/share/german/errmsg.txt:
new errors converted from unknown error
sql/share/greek/errmsg.txt:
new errors converted from unknown error
sql/share/hungarian/errmsg.txt:
new errors converted from unknown error
sql/share/italian/errmsg.txt:
new errors converted from unknown error
sql/share/japanese/errmsg.txt:
new errors converted from unknown error
sql/share/korean/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian-ny/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian/errmsg.txt:
new errors converted from unknown error
sql/share/polish/errmsg.txt:
new errors converted from unknown error
sql/share/portuguese/errmsg.txt:
new errors converted from unknown error
sql/share/romanian/errmsg.txt:
new errors converted from unknown error
sql/share/russian/errmsg.txt:
new errors converted from unknown error
sql/share/serbian/errmsg.txt:
new errors converted from unknown error
sql/share/slovak/errmsg.txt:
new errors converted from unknown error
sql/share/spanish/errmsg.txt:
new errors converted from unknown error
sql/share/swedish/errmsg.txt:
new errors converted from unknown error
sql/share/ukrainian/errmsg.txt:
new errors converted from unknown error
sql/slave.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp_head.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_acl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_analyse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_base.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_class.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_db.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_delete.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_insert.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_load.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_map.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_parse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
multi-row command fixed
sql/sql_prepare.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
remover send_error ingected from 4.1
sql/sql_rename.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_repl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_select.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_show.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_trigger.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_udf.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_update.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_view.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_yacc.yy:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
strings/my_vsnprintf.c:
* format support added to my_vsprint
2004-11-13 18:35:51 +01:00
|
|
|
my_error(ER_ERROR_WHEN_EXECUTING_COMMAND, MYF(0),
|
|
|
|
"SHOW NEW MASTER", errmsg);
|
2004-10-20 03:04:37 +02:00
|
|
|
DBUG_RETURN(TRUE);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
field_list.push_back(new Item_empty_string("Log_name", 20));
|
2002-12-11 08:17:51 +01:00
|
|
|
field_list.push_back(new Item_return_int("Log_pos", 10,
|
|
|
|
MYSQL_TYPE_LONGLONG));
|
Port of cursors to be pushed into 5.0 tree:
- client side part is simple and may be considered stable
- server side part now just joggles with THD state to save execution
state and has no additional locking wisdom.
Lot's of it are to be rewritten.
include/mysql.h:
Cursor patch to push into the main tree, client library part (considered
stable):
- new statement attribute STMT_ATTR_CURSOR_TYPE
- MYSQL_STMT::flags to store statement cursor type
- MYSQL_STMT::server_status to store server status (i. e. if the server
was able to open a cursor for this query).
include/mysql_com.h:
Cursor patch to push into the main tree, client library part (considered
stable):
- new COMmand, COM_FETCH, to fetch K rows from read-only cursor.
By design should support scrollable cursors as well.
- a few new server statuses:
SERVER_STATUS_CURSOR_EXISTS is sent by server in reply to COM_EXECUTE,
when cursor was successfully opened for this query
SERVER_STATUS_LAST_ROW_SENT is sent along with the last row to prevent one
more round trip just for finding out that all rows were fetched from
this cursor (this is server mem savier also).
- and finally, all possible values of STMT_ATTR_CURSOR_TYPE,
while now we support only CURSORT_TYPE_NO_CURSOR and
CURSOR_TYPE_READ_ONLY
libmysql/libmysql.c:
Cursor patch to push into the main tree, client library part (considered
stable):
- simple additions to mysql_stmt_fetch implementation to read data
from an opened cursor: we can read up to iteration count rows per
one request; read rows are buffered in the same way as rows of
mysql_stmt_store_result.
- now send stmt->flags to server to let him now if we wish to have
a cursor for this statement.
- support for setting/getting statement cursor type.
libmysqld/examples/Makefile.am:
Testing cursors was originally implemented in C++. Now when these tests
go into client_test, it's time to convert it to C++ as well.
libmysqld/lib_sql.cc:
- cleanup: send_fields flags are now named.
sql/ha_innodb.cc:
- cleanup: send_fields flags are now named.
sql/mysql_priv.h:
- cursors support: declaration for server-side handler of COM_FETCH
sql/protocol.cc:
- cleanup: send_fields flags are now named.
- we can't anymore assert that field_types[field_pos] is sensible:
if we have COM_EXCUTE(stmt1), COM_EXECUTE(stmt2), COM_FETCH(stmt1)
field_types[field_pos] will point to fields of stmt2.
sql/protocol.h:
- cleanup: send_fields flag_s_ are now named.
sql/protocol_cursor.cc:
- cleanup: send_fields flags are now named.
sql/repl_failsafe.cc:
- cleanup: send_fields flags are now named.
sql/slave.cc:
- cleanup: send_fields flags are now named.
sql/sp.cc:
- cleanup: send_fields flags are now named.
sql/sp_head.cc:
- cleanup: send_fields flags are now named.
sql/sql_acl.cc:
- cleanup: send_fields flags are now named.
sql/sql_class.cc:
- cleanup: send_fields flags are now named.
sql/sql_class.h:
- cleanup: send_fields flags are now named.
sql/sql_error.cc:
- cleanup: send_fields flags are now named.
sql/sql_handler.cc:
- cleanup: send_fields flags are now named.
sql/sql_help.cc:
- cleanup: send_fields flags are now named.
sql/sql_parse.cc:
Server side support for cursors:
- handle COM_FETCH
- enforce assumption that whenever we free thd->free_list,
we reset it to zero. This way it's much easier to handle free_list
in prepared statements implementation.
sql/sql_prepare.cc:
Server side support for cursors:
- implementation of mysql_stmt_fetch (fetch some rows from open cursor).
- management of cursors memory is quite tricky now.
- execute_stmt can't be reused anymore in mysql_stmt_execute and
mysql_sql_stmt_execute
sql/sql_repl.cc:
- cleanup: send_fields flags are now named.
sql/sql_select.cc:
Server side support for cursors:
- implementation of Cursor::open, Cursor::fetch (buggy when it comes to
non-equi joins), cursor cleanups.
- -4 -3 -0 constants indicating return value of sub_select and end_send are
to be renamed to something more readable:
it turned out to be not so simple, so it should come with the other patch.
sql/sql_select.h:
Server side support for cursors:
- declaration of Cursor class.
- JOIN::fetch_limit contains runtime value of rows fetched via cursor.
sql/sql_show.cc:
- cleanup: send_fields flags are now named.
sql/sql_table.cc:
- cleanup: send_fields flags are now named.
sql/sql_union.cc:
- if there was a cursor, don't cleanup unit: we'll need it to fetch
the rest of the rows.
tests/Makefile.am:
Now client_test is in C++.
tests/client_test.cc:
A few elementary tests for cursors.
BitKeeper/etc/ignore:
Added libmysqld/examples/client_test.cc to the ignore list
2004-08-03 12:32:21 +02:00
|
|
|
if (protocol->send_fields(&field_list,
|
|
|
|
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
2004-10-20 03:04:37 +02:00
|
|
|
DBUG_RETURN(TRUE);
|
2002-12-11 08:17:51 +01:00
|
|
|
protocol->prepare_for_resend();
|
2003-03-18 08:34:19 +01:00
|
|
|
protocol->store(lex_mi->log_file_name, &my_charset_bin);
|
2002-12-11 08:17:51 +01:00
|
|
|
protocol->store((ulonglong) lex_mi->pos);
|
|
|
|
if (protocol->write())
|
2004-10-20 03:04:37 +02:00
|
|
|
DBUG_RETURN(TRUE);
|
2002-10-02 12:33:08 +02:00
|
|
|
send_eof(thd);
|
2004-10-20 03:04:37 +02:00
|
|
|
DBUG_RETURN(FALSE);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-03-08 18:53:32 +01:00
|
|
|
/*
|
|
|
|
Asks the master for the list of its other connected slaves.
|
2003-06-14 10:37:42 +02:00
|
|
|
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.
|
2003-03-08 18:53:32 +01:00
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
update_slave_list()
|
|
|
|
mysql pre-existing connection to the master
|
|
|
|
mi master info
|
|
|
|
|
|
|
|
NOTES
|
|
|
|
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
|
2003-06-14 10:37:42 +02:00
|
|
|
REPLICATION SLAVE privilege, it will pop in this function because
|
|
|
|
SHOW SLAVE HOSTS will fail on the master.
|
2003-03-08 18:53:32 +01:00
|
|
|
|
|
|
|
RETURN VALUES
|
|
|
|
1 error
|
|
|
|
0 success
|
|
|
|
*/
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2003-03-08 18:53:32 +01:00
|
|
|
int update_slave_list(MYSQL* mysql, MASTER_INFO* mi)
|
2001-10-23 21:28:03 +02:00
|
|
|
{
|
|
|
|
MYSQL_RES* res=0;
|
|
|
|
MYSQL_ROW row;
|
|
|
|
const char* error=0;
|
|
|
|
bool have_auth_info;
|
|
|
|
int port_ind;
|
2002-08-21 21:04:22 +02:00
|
|
|
DBUG_ENTER("update_slave_list");
|
2001-12-06 13:10:51 +01:00
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
if (mysql_real_query(mysql,"SHOW SLAVE HOSTS",16) ||
|
|
|
|
!(res = mysql_store_result(mysql)))
|
2001-10-23 21:28:03 +02:00
|
|
|
{
|
2003-05-02 18:07:41 +02:00
|
|
|
error= mysql_error(mysql);
|
2001-10-23 21:28:03 +02:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
switch (mysql_num_fields(res)) {
|
2001-10-23 21:28:03 +02:00
|
|
|
case 5:
|
|
|
|
have_auth_info = 0;
|
|
|
|
port_ind=2;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
have_auth_info = 1;
|
|
|
|
port_ind=4;
|
|
|
|
break;
|
|
|
|
default:
|
2003-03-08 18:53:32 +01:00
|
|
|
error= "the master returned an invalid number of fields for SHOW SLAVE \
|
|
|
|
HOSTS";
|
2001-10-23 21:28:03 +02:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
pthread_mutex_lock(&LOCK_slave_list);
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
while ((row= mysql_fetch_row(res)))
|
2001-10-23 21:28:03 +02:00
|
|
|
{
|
|
|
|
uint32 server_id;
|
|
|
|
SLAVE_INFO* si, *old_si;
|
|
|
|
server_id = atoi(row[0]);
|
2002-06-11 10:20:31 +02:00
|
|
|
if ((old_si= (SLAVE_INFO*)hash_search(&slave_list,
|
|
|
|
(byte*)&server_id,4)))
|
2001-10-23 21:28:03 +02:00
|
|
|
si = old_si;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME))))
|
|
|
|
{
|
2003-03-08 18:53:32 +01:00
|
|
|
error= "the slave is out of memory";
|
2001-10-23 21:28:03 +02:00
|
|
|
pthread_mutex_unlock(&LOCK_slave_list);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
si->server_id = server_id;
|
2003-09-19 11:44:31 +02:00
|
|
|
my_hash_insert(&slave_list, (byte*)si);
|
2001-10-23 21:28:03 +02:00
|
|
|
}
|
2002-06-11 10:20:31 +02:00
|
|
|
strmake(si->host, row[1], sizeof(si->host)-1);
|
2001-10-23 21:28:03 +02:00
|
|
|
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)
|
|
|
|
{
|
2002-06-11 10:20:31 +02:00
|
|
|
strmake(si->user, row[2], sizeof(si->user)-1);
|
|
|
|
strmake(si->password, row[3], sizeof(si->password)-1);
|
2001-10-23 21:28:03 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
pthread_mutex_unlock(&LOCK_slave_list);
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-10-23 21:28:03 +02:00
|
|
|
err:
|
|
|
|
if (res)
|
2003-05-02 18:07:41 +02:00
|
|
|
mysql_free_result(res);
|
2001-10-23 21:28:03 +02:00
|
|
|
if (error)
|
|
|
|
{
|
2003-03-08 18:53:32 +01:00
|
|
|
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);
|
2002-08-21 21:04:22 +02:00
|
|
|
DBUG_RETURN(1);
|
2001-10-23 21:28:03 +02:00
|
|
|
}
|
2002-08-21 21:04:22 +02:00
|
|
|
DBUG_RETURN(0);
|
2001-10-23 21:28:03 +02:00
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-10-23 21:28:03 +02:00
|
|
|
int find_recovery_captain(THD* thd, MYSQL* mysql)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-10-23 21:28:03 +02:00
|
|
|
pthread_handler_decl(handle_failsafe_rpl,arg)
|
|
|
|
{
|
|
|
|
DBUG_ENTER("handle_failsafe_rpl");
|
|
|
|
THD *thd = new THD;
|
|
|
|
thd->thread_stack = (char*)&thd;
|
|
|
|
MYSQL* recovery_captain = 0;
|
2004-07-31 22:33:20 +02:00
|
|
|
const char* msg;
|
|
|
|
|
2001-10-23 21:28:03 +02:00
|
|
|
pthread_detach_this_thread();
|
2003-05-02 18:07:41 +02:00
|
|
|
if (init_failsafe_rpl_thread(thd) || !(recovery_captain=mysql_init(0)))
|
2001-10-23 21:28:03 +02:00
|
|
|
{
|
|
|
|
sql_print_error("Could not initialize failsafe replication thread");
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
pthread_mutex_lock(&LOCK_rpl_status);
|
2004-07-31 22:33:20 +02:00
|
|
|
msg= thd->enter_cond(&COND_rpl_status,
|
|
|
|
&LOCK_rpl_status, "Waiting for request");
|
2001-10-23 21:28:03 +02:00
|
|
|
while (!thd->killed && !abort_loop)
|
|
|
|
{
|
|
|
|
bool break_req_chain = 0;
|
|
|
|
pthread_cond_wait(&COND_rpl_status, &LOCK_rpl_status);
|
2002-01-20 03:16:52 +01:00
|
|
|
thd->proc_info="Processing request";
|
2001-10-23 21:28:03 +02:00
|
|
|
while (!break_req_chain)
|
|
|
|
{
|
2002-06-11 10:20:31 +02:00
|
|
|
switch (rpl_status) {
|
2001-10-23 21:28:03 +02:00
|
|
|
case RPL_LOST_SOLDIER:
|
|
|
|
if (find_recovery_captain(thd, recovery_captain))
|
|
|
|
rpl_status=RPL_TROOP_SOLDIER;
|
|
|
|
else
|
|
|
|
rpl_status=RPL_RECOVERY_CAPTAIN;
|
|
|
|
break_req_chain=1; /* for now until other states are implemented */
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break_req_chain=1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-07-31 22:33:20 +02:00
|
|
|
thd->exit_cond(msg);
|
2001-10-23 21:28:03 +02:00
|
|
|
err:
|
|
|
|
if (recovery_captain)
|
2003-05-02 18:07:41 +02:00
|
|
|
mysql_close(recovery_captain);
|
2001-10-23 21:28:03 +02:00
|
|
|
delete thd;
|
|
|
|
my_thread_end();
|
|
|
|
pthread_exit(0);
|
|
|
|
DBUG_RETURN(0);
|
2001-10-11 21:54:06 +02:00
|
|
|
}
|
2001-10-10 04:56:24 +02:00
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2004-10-20 03:04:37 +02:00
|
|
|
bool show_slave_hosts(THD* thd)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
List<Item> field_list;
|
2002-12-11 08:17:51 +01:00
|
|
|
Protocol *protocol= thd->protocol;
|
2001-11-11 06:24:12 +01:00
|
|
|
DBUG_ENTER("show_slave_hosts");
|
|
|
|
|
2002-12-11 08:17:51 +01:00
|
|
|
field_list.push_back(new Item_return_int("Server_id", 10,
|
|
|
|
MYSQL_TYPE_LONG));
|
2001-11-11 06:24:12 +01:00
|
|
|
field_list.push_back(new Item_empty_string("Host", 20));
|
|
|
|
if (opt_show_slave_auth_info)
|
|
|
|
{
|
|
|
|
field_list.push_back(new Item_empty_string("User",20));
|
|
|
|
field_list.push_back(new Item_empty_string("Password",20));
|
|
|
|
}
|
2002-12-11 08:17:51 +01:00
|
|
|
field_list.push_back(new Item_return_int("Port", 7, MYSQL_TYPE_LONG));
|
|
|
|
field_list.push_back(new Item_return_int("Rpl_recovery_rank", 7,
|
|
|
|
MYSQL_TYPE_LONG));
|
|
|
|
field_list.push_back(new Item_return_int("Master_id", 10,
|
|
|
|
MYSQL_TYPE_LONG));
|
2001-11-11 06:24:12 +01:00
|
|
|
|
Port of cursors to be pushed into 5.0 tree:
- client side part is simple and may be considered stable
- server side part now just joggles with THD state to save execution
state and has no additional locking wisdom.
Lot's of it are to be rewritten.
include/mysql.h:
Cursor patch to push into the main tree, client library part (considered
stable):
- new statement attribute STMT_ATTR_CURSOR_TYPE
- MYSQL_STMT::flags to store statement cursor type
- MYSQL_STMT::server_status to store server status (i. e. if the server
was able to open a cursor for this query).
include/mysql_com.h:
Cursor patch to push into the main tree, client library part (considered
stable):
- new COMmand, COM_FETCH, to fetch K rows from read-only cursor.
By design should support scrollable cursors as well.
- a few new server statuses:
SERVER_STATUS_CURSOR_EXISTS is sent by server in reply to COM_EXECUTE,
when cursor was successfully opened for this query
SERVER_STATUS_LAST_ROW_SENT is sent along with the last row to prevent one
more round trip just for finding out that all rows were fetched from
this cursor (this is server mem savier also).
- and finally, all possible values of STMT_ATTR_CURSOR_TYPE,
while now we support only CURSORT_TYPE_NO_CURSOR and
CURSOR_TYPE_READ_ONLY
libmysql/libmysql.c:
Cursor patch to push into the main tree, client library part (considered
stable):
- simple additions to mysql_stmt_fetch implementation to read data
from an opened cursor: we can read up to iteration count rows per
one request; read rows are buffered in the same way as rows of
mysql_stmt_store_result.
- now send stmt->flags to server to let him now if we wish to have
a cursor for this statement.
- support for setting/getting statement cursor type.
libmysqld/examples/Makefile.am:
Testing cursors was originally implemented in C++. Now when these tests
go into client_test, it's time to convert it to C++ as well.
libmysqld/lib_sql.cc:
- cleanup: send_fields flags are now named.
sql/ha_innodb.cc:
- cleanup: send_fields flags are now named.
sql/mysql_priv.h:
- cursors support: declaration for server-side handler of COM_FETCH
sql/protocol.cc:
- cleanup: send_fields flags are now named.
- we can't anymore assert that field_types[field_pos] is sensible:
if we have COM_EXCUTE(stmt1), COM_EXECUTE(stmt2), COM_FETCH(stmt1)
field_types[field_pos] will point to fields of stmt2.
sql/protocol.h:
- cleanup: send_fields flag_s_ are now named.
sql/protocol_cursor.cc:
- cleanup: send_fields flags are now named.
sql/repl_failsafe.cc:
- cleanup: send_fields flags are now named.
sql/slave.cc:
- cleanup: send_fields flags are now named.
sql/sp.cc:
- cleanup: send_fields flags are now named.
sql/sp_head.cc:
- cleanup: send_fields flags are now named.
sql/sql_acl.cc:
- cleanup: send_fields flags are now named.
sql/sql_class.cc:
- cleanup: send_fields flags are now named.
sql/sql_class.h:
- cleanup: send_fields flags are now named.
sql/sql_error.cc:
- cleanup: send_fields flags are now named.
sql/sql_handler.cc:
- cleanup: send_fields flags are now named.
sql/sql_help.cc:
- cleanup: send_fields flags are now named.
sql/sql_parse.cc:
Server side support for cursors:
- handle COM_FETCH
- enforce assumption that whenever we free thd->free_list,
we reset it to zero. This way it's much easier to handle free_list
in prepared statements implementation.
sql/sql_prepare.cc:
Server side support for cursors:
- implementation of mysql_stmt_fetch (fetch some rows from open cursor).
- management of cursors memory is quite tricky now.
- execute_stmt can't be reused anymore in mysql_stmt_execute and
mysql_sql_stmt_execute
sql/sql_repl.cc:
- cleanup: send_fields flags are now named.
sql/sql_select.cc:
Server side support for cursors:
- implementation of Cursor::open, Cursor::fetch (buggy when it comes to
non-equi joins), cursor cleanups.
- -4 -3 -0 constants indicating return value of sub_select and end_send are
to be renamed to something more readable:
it turned out to be not so simple, so it should come with the other patch.
sql/sql_select.h:
Server side support for cursors:
- declaration of Cursor class.
- JOIN::fetch_limit contains runtime value of rows fetched via cursor.
sql/sql_show.cc:
- cleanup: send_fields flags are now named.
sql/sql_table.cc:
- cleanup: send_fields flags are now named.
sql/sql_union.cc:
- if there was a cursor, don't cleanup unit: we'll need it to fetch
the rest of the rows.
tests/Makefile.am:
Now client_test is in C++.
tests/client_test.cc:
A few elementary tests for cursors.
BitKeeper/etc/ignore:
Added libmysqld/examples/client_test.cc to the ignore list
2004-08-03 12:32:21 +02:00
|
|
|
if (protocol->send_fields(&field_list,
|
|
|
|
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
2004-10-20 03:04:37 +02:00
|
|
|
DBUG_RETURN(TRUE);
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
pthread_mutex_lock(&LOCK_slave_list);
|
|
|
|
|
|
|
|
for (uint i = 0; i < slave_list.records; ++i)
|
|
|
|
{
|
|
|
|
SLAVE_INFO* si = (SLAVE_INFO*) hash_element(&slave_list, i);
|
2002-12-11 08:17:51 +01:00
|
|
|
protocol->prepare_for_resend();
|
|
|
|
protocol->store((uint32) si->server_id);
|
2003-03-18 08:34:19 +01:00
|
|
|
protocol->store(si->host, &my_charset_bin);
|
2001-11-11 06:24:12 +01:00
|
|
|
if (opt_show_slave_auth_info)
|
|
|
|
{
|
2003-03-18 08:34:19 +01:00
|
|
|
protocol->store(si->user, &my_charset_bin);
|
|
|
|
protocol->store(si->password, &my_charset_bin);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
2002-12-11 08:17:51 +01:00
|
|
|
protocol->store((uint32) si->port);
|
|
|
|
protocol->store((uint32) si->rpl_recovery_rank);
|
|
|
|
protocol->store((uint32) si->master_id);
|
|
|
|
if (protocol->write())
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
pthread_mutex_unlock(&LOCK_slave_list);
|
2004-10-20 03:04:37 +02:00
|
|
|
DBUG_RETURN(TRUE);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
pthread_mutex_unlock(&LOCK_slave_list);
|
2002-10-02 12:33:08 +02:00
|
|
|
send_eof(thd);
|
2004-10-20 03:04:37 +02:00
|
|
|
DBUG_RETURN(FALSE);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
int connect_to_master(THD *thd, MYSQL* mysql, MASTER_INFO* mi)
|
|
|
|
{
|
2002-08-08 02:12:02 +02:00
|
|
|
DBUG_ENTER("connect_to_master");
|
2002-05-31 02:31:25 +02:00
|
|
|
|
2002-08-08 02:12:02 +02:00
|
|
|
if (!mi->host || !*mi->host) /* empty host */
|
|
|
|
{
|
2002-08-21 21:04:22 +02:00
|
|
|
strmov(mysql->net.last_error, "Master is not configured");
|
2002-08-08 02:12:02 +02:00
|
|
|
DBUG_RETURN(1);
|
|
|
|
}
|
2003-06-14 10:37:42 +02:00
|
|
|
mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (char *) &slave_net_timeout);
|
|
|
|
mysql_options(mysql, MYSQL_OPT_READ_TIMEOUT, (char *) &slave_net_timeout);
|
2003-09-01 13:16:20 +02:00
|
|
|
|
|
|
|
#ifdef HAVE_OPENSSL
|
|
|
|
if (mi->ssl)
|
|
|
|
mysql_ssl_set(mysql,
|
|
|
|
mi->ssl_key[0]?mi->ssl_key:0,
|
|
|
|
mi->ssl_cert[0]?mi->ssl_cert:0,
|
|
|
|
mi->ssl_ca[0]?mi->ssl_ca:0,
|
|
|
|
mi->ssl_capath[0]?mi->ssl_capath:0,
|
|
|
|
mi->ssl_cipher[0]?mi->ssl_cipher:0);
|
|
|
|
#endif
|
|
|
|
|
2003-06-14 10:37:42 +02:00
|
|
|
mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset_info->csname);
|
|
|
|
mysql_options(mysql, MYSQL_SET_CHARSET_DIR, (char *) charsets_dir);
|
2003-05-02 18:07:41 +02:00
|
|
|
if (!mysql_real_connect(mysql, mi->host, mi->user, mi->password, 0,
|
2003-05-31 12:15:46 +02:00
|
|
|
mi->port, 0, 0))
|
2002-08-08 02:12:02 +02:00
|
|
|
DBUG_RETURN(1);
|
|
|
|
DBUG_RETURN(0);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static inline void cleanup_mysql_results(MYSQL_RES* db_res,
|
2002-06-11 10:20:31 +02:00
|
|
|
MYSQL_RES** cur, MYSQL_RES** start)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
2002-06-11 10:20:31 +02:00
|
|
|
for (; cur >= start; --cur)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
if (*cur)
|
2003-05-02 18:07:41 +02:00
|
|
|
mysql_free_result(*cur);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
2003-05-02 18:07:41 +02:00
|
|
|
mysql_free_result(db_res);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-08-21 21:04:22 +02:00
|
|
|
static int fetch_db_tables(THD *thd, MYSQL *mysql, const char *db,
|
|
|
|
MYSQL_RES *table_res, MASTER_INFO *mi)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
MYSQL_ROW row;
|
2003-05-02 18:07:41 +02:00
|
|
|
for (row = mysql_fetch_row(table_res); row;
|
|
|
|
row = mysql_fetch_row(table_res))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
TABLE_LIST table;
|
2002-08-21 21:04:22 +02:00
|
|
|
const char* table_name= row[0];
|
2001-11-11 06:24:12 +01:00
|
|
|
int error;
|
|
|
|
if (table_rules_on)
|
|
|
|
{
|
2004-02-01 14:30:32 +01:00
|
|
|
bzero((char*) &table, sizeof(table)); //just for safe
|
2002-08-21 21:04:22 +02:00
|
|
|
table.db= (char*) db;
|
|
|
|
table.real_name= (char*) table_name;
|
|
|
|
table.updating= 1;
|
2004-04-07 12:25:24 +02:00
|
|
|
|
2001-11-11 06:24:12 +01:00
|
|
|
if (!tables_ok(thd, &table))
|
|
|
|
continue;
|
|
|
|
}
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
/* download master's table and overwrite slave's table */
|
|
|
|
if ((error= fetch_master_table(thd, db, table_name, mi, mysql, 1)))
|
2001-11-11 06:24:12 +01:00
|
|
|
return error;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-08-08 02:12:02 +02:00
|
|
|
/*
|
|
|
|
Load all MyISAM tables from master to this slave.
|
|
|
|
|
|
|
|
REQUIREMENTS
|
|
|
|
- No active transaction (flush_relay_log_info would not work in this case)
|
|
|
|
*/
|
2001-11-11 06:24:12 +01:00
|
|
|
|
2004-10-20 03:04:37 +02:00
|
|
|
bool load_master_data(THD* thd)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
MYSQL mysql;
|
|
|
|
MYSQL_RES* master_status_res = 0;
|
|
|
|
int error = 0;
|
2002-01-20 03:16:52 +01:00
|
|
|
const char* errmsg=0;
|
|
|
|
int restart_thread_mask;
|
2003-10-08 11:01:58 +02:00
|
|
|
HA_CREATE_INFO create_info;
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
mysql_init(&mysql);
|
2001-11-11 06:24:12 +01:00
|
|
|
|
2002-06-05 22:04:38 +02:00
|
|
|
/*
|
|
|
|
We do not want anyone messing with the slave at all for the entire
|
|
|
|
duration of the data load.
|
|
|
|
*/
|
Fix for BUG#2921 "Replication problem on mutex lock in mySQL-4.0.18":
re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks (like BUG#2921
when two START SLAVE, but when two STOP SLAVE too).
Removing unused variables.
sql/item_func.cc:
We don't need LOCK_active_mi just to MASTER_POS_WAIT().
sql/repl_failsafe.cc:
no need for macro
sql/set_var.cc:
no need for macro
sql/slave.cc:
Re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks.
Removing unused variables.
sql/slave.h:
Re-using LOCK_active_mi to serialize administrative replication commands.
Macros unneeded. Removing unneeded variables.
sql/sql_parse.cc:
found unused variable.
Replacing macros.
sql/sql_show.cc:
replacing macros
2004-03-11 16:23:35 +01:00
|
|
|
pthread_mutex_lock(&LOCK_active_mi);
|
2002-01-20 03:16:52 +01:00
|
|
|
lock_slave_threads(active_mi);
|
|
|
|
init_thread_mask(&restart_thread_mask,active_mi,0 /*not inverse*/);
|
|
|
|
if (restart_thread_mask &&
|
|
|
|
(error=terminate_slave_threads(active_mi,restart_thread_mask,
|
|
|
|
1 /*skip lock*/)))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
2004-11-12 13:34:00 +01:00
|
|
|
my_message(error, ER(error), MYF(0));
|
2002-01-20 03:16:52 +01:00
|
|
|
unlock_slave_threads(active_mi);
|
Fix for BUG#2921 "Replication problem on mutex lock in mySQL-4.0.18":
re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks (like BUG#2921
when two START SLAVE, but when two STOP SLAVE too).
Removing unused variables.
sql/item_func.cc:
We don't need LOCK_active_mi just to MASTER_POS_WAIT().
sql/repl_failsafe.cc:
no need for macro
sql/set_var.cc:
no need for macro
sql/slave.cc:
Re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks.
Removing unused variables.
sql/slave.h:
Re-using LOCK_active_mi to serialize administrative replication commands.
Macros unneeded. Removing unneeded variables.
sql/sql_parse.cc:
found unused variable.
Replacing macros.
sql/sql_show.cc:
replacing macros
2004-03-11 16:23:35 +01:00
|
|
|
pthread_mutex_unlock(&LOCK_active_mi);
|
2004-10-20 03:04:37 +02:00
|
|
|
return TRUE;
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
2002-01-20 03:16:52 +01:00
|
|
|
|
|
|
|
if (connect_to_master(thd, &mysql, active_mi))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
now my_printf_error is not better then my_error, but my_error call is shorter
used only one implementation of format parser of (printf)
fixed multistatement
include/mysqld_error.h:
newerror messages
mysql-test/t/key.test:
unknown error replaced with real error
mysys/my_error.c:
my_error & my_printf_error use my_vsprintf
sql/field_conv.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/ha_innodb.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_cmpfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_func.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_strfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/lock.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/log.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/parse_file.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/procedure.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/protocol.cc:
no need reset thd->lex->found_colon to break multiline sequance now, send_error called too late
sql/repl_failsafe.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/set_var.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/share/czech/errmsg.txt:
new errors converted from unknown error
sql/share/danish/errmsg.txt:
new errors converted from unknown error
sql/share/dutch/errmsg.txt:
new errors converted from unknown error
sql/share/english/errmsg.txt:
new errors converted from unknown error
sql/share/estonian/errmsg.txt:
new errors converted from unknown error
sql/share/french/errmsg.txt:
new errors converted from unknown error
sql/share/german/errmsg.txt:
new errors converted from unknown error
sql/share/greek/errmsg.txt:
new errors converted from unknown error
sql/share/hungarian/errmsg.txt:
new errors converted from unknown error
sql/share/italian/errmsg.txt:
new errors converted from unknown error
sql/share/japanese/errmsg.txt:
new errors converted from unknown error
sql/share/korean/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian-ny/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian/errmsg.txt:
new errors converted from unknown error
sql/share/polish/errmsg.txt:
new errors converted from unknown error
sql/share/portuguese/errmsg.txt:
new errors converted from unknown error
sql/share/romanian/errmsg.txt:
new errors converted from unknown error
sql/share/russian/errmsg.txt:
new errors converted from unknown error
sql/share/serbian/errmsg.txt:
new errors converted from unknown error
sql/share/slovak/errmsg.txt:
new errors converted from unknown error
sql/share/spanish/errmsg.txt:
new errors converted from unknown error
sql/share/swedish/errmsg.txt:
new errors converted from unknown error
sql/share/ukrainian/errmsg.txt:
new errors converted from unknown error
sql/slave.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp_head.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_acl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_analyse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_base.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_class.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_db.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_delete.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_insert.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_load.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_map.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_parse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
multi-row command fixed
sql/sql_prepare.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
remover send_error ingected from 4.1
sql/sql_rename.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_repl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_select.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_show.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_trigger.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_udf.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_update.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_view.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_yacc.yy:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
strings/my_vsnprintf.c:
* format support added to my_vsprint
2004-11-13 18:35:51 +01:00
|
|
|
my_error(error= ER_CONNECT_TO_MASTER, MYF(0), mysql_error(&mysql));
|
2001-11-11 06:24:12 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
// now that we are connected, get all database and tables in each
|
|
|
|
{
|
|
|
|
MYSQL_RES *db_res, **table_res, **table_res_end, **cur_table_res;
|
|
|
|
uint num_dbs;
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
if (mysql_real_query(&mysql, "SHOW DATABASES", 14) ||
|
|
|
|
!(db_res = mysql_store_result(&mysql)))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
now my_printf_error is not better then my_error, but my_error call is shorter
used only one implementation of format parser of (printf)
fixed multistatement
include/mysqld_error.h:
newerror messages
mysql-test/t/key.test:
unknown error replaced with real error
mysys/my_error.c:
my_error & my_printf_error use my_vsprintf
sql/field_conv.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/ha_innodb.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_cmpfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_func.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_strfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/lock.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/log.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/parse_file.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/procedure.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/protocol.cc:
no need reset thd->lex->found_colon to break multiline sequance now, send_error called too late
sql/repl_failsafe.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/set_var.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/share/czech/errmsg.txt:
new errors converted from unknown error
sql/share/danish/errmsg.txt:
new errors converted from unknown error
sql/share/dutch/errmsg.txt:
new errors converted from unknown error
sql/share/english/errmsg.txt:
new errors converted from unknown error
sql/share/estonian/errmsg.txt:
new errors converted from unknown error
sql/share/french/errmsg.txt:
new errors converted from unknown error
sql/share/german/errmsg.txt:
new errors converted from unknown error
sql/share/greek/errmsg.txt:
new errors converted from unknown error
sql/share/hungarian/errmsg.txt:
new errors converted from unknown error
sql/share/italian/errmsg.txt:
new errors converted from unknown error
sql/share/japanese/errmsg.txt:
new errors converted from unknown error
sql/share/korean/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian-ny/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian/errmsg.txt:
new errors converted from unknown error
sql/share/polish/errmsg.txt:
new errors converted from unknown error
sql/share/portuguese/errmsg.txt:
new errors converted from unknown error
sql/share/romanian/errmsg.txt:
new errors converted from unknown error
sql/share/russian/errmsg.txt:
new errors converted from unknown error
sql/share/serbian/errmsg.txt:
new errors converted from unknown error
sql/share/slovak/errmsg.txt:
new errors converted from unknown error
sql/share/spanish/errmsg.txt:
new errors converted from unknown error
sql/share/swedish/errmsg.txt:
new errors converted from unknown error
sql/share/ukrainian/errmsg.txt:
new errors converted from unknown error
sql/slave.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp_head.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_acl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_analyse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_base.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_class.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_db.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_delete.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_insert.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_load.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_map.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_parse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
multi-row command fixed
sql/sql_prepare.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
remover send_error ingected from 4.1
sql/sql_rename.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_repl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_select.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_show.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_trigger.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_udf.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_update.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_view.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_yacc.yy:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
strings/my_vsnprintf.c:
* format support added to my_vsprint
2004-11-13 18:35:51 +01:00
|
|
|
my_error(error= ER_QUERY_ON_MASTER, MYF(0), mysql_error(&mysql));
|
2001-11-11 06:24:12 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
if (!(num_dbs = (uint) mysql_num_rows(db_res)))
|
2001-11-11 06:24:12 +01:00
|
|
|
goto err;
|
2002-06-05 22:04:38 +02:00
|
|
|
/*
|
|
|
|
In theory, the master could have no databases at all
|
|
|
|
and run with skip-grant
|
|
|
|
*/
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
if (!(table_res = (MYSQL_RES**)thd->alloc(num_dbs * sizeof(MYSQL_RES*))))
|
|
|
|
{
|
2004-11-12 13:34:00 +01:00
|
|
|
my_message(error = ER_OUTOFMEMORY, ER(ER_OUTOFMEMORY), MYF(0));
|
2001-11-11 06:24:12 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
2002-06-05 22:04:38 +02:00
|
|
|
/*
|
|
|
|
This is a temporary solution until we have online backup
|
|
|
|
capabilities - to be replaced once online backup is working
|
|
|
|
we wait to issue FLUSH TABLES WITH READ LOCK for as long as we
|
|
|
|
can to minimize the lock time.
|
|
|
|
*/
|
2003-05-02 18:07:41 +02:00
|
|
|
if (mysql_real_query(&mysql, "FLUSH TABLES WITH READ LOCK", 27) ||
|
|
|
|
mysql_real_query(&mysql, "SHOW MASTER STATUS",18) ||
|
|
|
|
!(master_status_res = mysql_store_result(&mysql)))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
now my_printf_error is not better then my_error, but my_error call is shorter
used only one implementation of format parser of (printf)
fixed multistatement
include/mysqld_error.h:
newerror messages
mysql-test/t/key.test:
unknown error replaced with real error
mysys/my_error.c:
my_error & my_printf_error use my_vsprintf
sql/field_conv.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/ha_innodb.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_cmpfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_func.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_strfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/lock.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/log.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/parse_file.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/procedure.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/protocol.cc:
no need reset thd->lex->found_colon to break multiline sequance now, send_error called too late
sql/repl_failsafe.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/set_var.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/share/czech/errmsg.txt:
new errors converted from unknown error
sql/share/danish/errmsg.txt:
new errors converted from unknown error
sql/share/dutch/errmsg.txt:
new errors converted from unknown error
sql/share/english/errmsg.txt:
new errors converted from unknown error
sql/share/estonian/errmsg.txt:
new errors converted from unknown error
sql/share/french/errmsg.txt:
new errors converted from unknown error
sql/share/german/errmsg.txt:
new errors converted from unknown error
sql/share/greek/errmsg.txt:
new errors converted from unknown error
sql/share/hungarian/errmsg.txt:
new errors converted from unknown error
sql/share/italian/errmsg.txt:
new errors converted from unknown error
sql/share/japanese/errmsg.txt:
new errors converted from unknown error
sql/share/korean/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian-ny/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian/errmsg.txt:
new errors converted from unknown error
sql/share/polish/errmsg.txt:
new errors converted from unknown error
sql/share/portuguese/errmsg.txt:
new errors converted from unknown error
sql/share/romanian/errmsg.txt:
new errors converted from unknown error
sql/share/russian/errmsg.txt:
new errors converted from unknown error
sql/share/serbian/errmsg.txt:
new errors converted from unknown error
sql/share/slovak/errmsg.txt:
new errors converted from unknown error
sql/share/spanish/errmsg.txt:
new errors converted from unknown error
sql/share/swedish/errmsg.txt:
new errors converted from unknown error
sql/share/ukrainian/errmsg.txt:
new errors converted from unknown error
sql/slave.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp_head.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_acl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_analyse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_base.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_class.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_db.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_delete.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_insert.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_load.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_map.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_parse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
multi-row command fixed
sql/sql_prepare.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
remover send_error ingected from 4.1
sql/sql_rename.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_repl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_select.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_show.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_trigger.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_udf.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_update.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_view.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_yacc.yy:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
strings/my_vsnprintf.c:
* format support added to my_vsprint
2004-11-13 18:35:51 +01:00
|
|
|
my_error(error= ER_QUERY_ON_MASTER, MYF(0), mysql_error(&mysql));
|
2001-11-11 06:24:12 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
2002-06-05 22:04:38 +02:00
|
|
|
/*
|
|
|
|
Go through every table in every database, and if the replication
|
|
|
|
rules allow replicating it, get it
|
|
|
|
*/
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
table_res_end = table_res + num_dbs;
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
for (cur_table_res = table_res; cur_table_res < table_res_end;
|
|
|
|
cur_table_res++)
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
// since we know how many rows we have, this can never be NULL
|
2003-05-02 18:07:41 +02:00
|
|
|
MYSQL_ROW row = mysql_fetch_row(db_res);
|
2001-11-11 06:24:12 +01:00
|
|
|
char* db = row[0];
|
|
|
|
|
|
|
|
/*
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
Do not replicate databases excluded by rules. We also test
|
|
|
|
replicate_wild_*_table rules (replicate_wild_ignore_table='db1.%' will
|
|
|
|
be considered as "ignore the 'db1' database as a whole, as it already
|
|
|
|
works for CREATE DATABASE and DROP DATABASE).
|
|
|
|
Also skip 'mysql' database - in most cases the user will
|
2001-11-11 06:24:12 +01:00
|
|
|
mess up and not exclude mysql database with the rules when
|
|
|
|
he actually means to - in this case, he is up for a surprise if
|
|
|
|
his priv tables get dropped and downloaded from master
|
2002-01-20 03:16:52 +01:00
|
|
|
TODO - add special option, not enabled
|
2001-11-11 06:24:12 +01:00
|
|
|
by default, to allow inclusion of mysql database into load
|
|
|
|
data from master
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (!db_ok(db, replicate_do_db, replicate_ignore_db) ||
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
!db_ok_with_wild_table(db) ||
|
2002-06-11 10:20:31 +02:00
|
|
|
!strcmp(db,"mysql"))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
*cur_table_res = 0;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2003-10-08 11:01:58 +02:00
|
|
|
bzero((char*) &create_info, sizeof(create_info));
|
|
|
|
create_info.options= HA_LEX_CREATE_IF_NOT_EXISTS;
|
|
|
|
|
|
|
|
if (mysql_create_db(thd, db, &create_info, 1))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
cleanup_mysql_results(db_res, cur_table_res - 1, table_res);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
if (mysql_select_db(&mysql, db) ||
|
|
|
|
mysql_real_query(&mysql, "SHOW TABLES", 11) ||
|
|
|
|
!(*cur_table_res = mysql_store_result(&mysql)))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
now my_printf_error is not better then my_error, but my_error call is shorter
used only one implementation of format parser of (printf)
fixed multistatement
include/mysqld_error.h:
newerror messages
mysql-test/t/key.test:
unknown error replaced with real error
mysys/my_error.c:
my_error & my_printf_error use my_vsprintf
sql/field_conv.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/ha_innodb.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_cmpfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_func.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_strfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/lock.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/log.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/parse_file.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/procedure.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/protocol.cc:
no need reset thd->lex->found_colon to break multiline sequance now, send_error called too late
sql/repl_failsafe.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/set_var.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/share/czech/errmsg.txt:
new errors converted from unknown error
sql/share/danish/errmsg.txt:
new errors converted from unknown error
sql/share/dutch/errmsg.txt:
new errors converted from unknown error
sql/share/english/errmsg.txt:
new errors converted from unknown error
sql/share/estonian/errmsg.txt:
new errors converted from unknown error
sql/share/french/errmsg.txt:
new errors converted from unknown error
sql/share/german/errmsg.txt:
new errors converted from unknown error
sql/share/greek/errmsg.txt:
new errors converted from unknown error
sql/share/hungarian/errmsg.txt:
new errors converted from unknown error
sql/share/italian/errmsg.txt:
new errors converted from unknown error
sql/share/japanese/errmsg.txt:
new errors converted from unknown error
sql/share/korean/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian-ny/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian/errmsg.txt:
new errors converted from unknown error
sql/share/polish/errmsg.txt:
new errors converted from unknown error
sql/share/portuguese/errmsg.txt:
new errors converted from unknown error
sql/share/romanian/errmsg.txt:
new errors converted from unknown error
sql/share/russian/errmsg.txt:
new errors converted from unknown error
sql/share/serbian/errmsg.txt:
new errors converted from unknown error
sql/share/slovak/errmsg.txt:
new errors converted from unknown error
sql/share/spanish/errmsg.txt:
new errors converted from unknown error
sql/share/swedish/errmsg.txt:
new errors converted from unknown error
sql/share/ukrainian/errmsg.txt:
new errors converted from unknown error
sql/slave.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp_head.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_acl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_analyse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_base.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_class.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_db.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_delete.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_insert.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_load.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_map.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_parse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
multi-row command fixed
sql/sql_prepare.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
remover send_error ingected from 4.1
sql/sql_rename.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_repl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_select.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_show.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_trigger.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_udf.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_update.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_view.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_yacc.yy:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
strings/my_vsnprintf.c:
* format support added to my_vsprint
2004-11-13 18:35:51 +01:00
|
|
|
my_error(error= ER_QUERY_ON_MASTER, MYF(0), mysql_error(&mysql));
|
2001-11-11 06:24:12 +01:00
|
|
|
cleanup_mysql_results(db_res, cur_table_res - 1, table_res);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
2002-01-20 03:16:52 +01:00
|
|
|
if ((error = fetch_db_tables(thd,&mysql,db,*cur_table_res,active_mi)))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
|
|
|
// we do not report the error - fetch_db_tables handles it
|
|
|
|
cleanup_mysql_results(db_res, cur_table_res, table_res);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup_mysql_results(db_res, cur_table_res - 1, table_res);
|
|
|
|
|
2004-03-17 10:35:03 +01:00
|
|
|
// adjust replication coordinates from the master
|
2001-11-11 06:24:12 +01:00
|
|
|
if (master_status_res)
|
|
|
|
{
|
2003-05-02 18:07:41 +02:00
|
|
|
MYSQL_ROW row = mysql_fetch_row(master_status_res);
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
We need this check because the master may not be running with
|
|
|
|
log-bin, but it will still allow us to do all the steps
|
|
|
|
of LOAD DATA FROM MASTER - no reason to forbid it, really,
|
2002-06-11 10:20:31 +02:00
|
|
|
although it does not make much sense for the user to do it
|
2001-11-11 06:24:12 +01:00
|
|
|
*/
|
2003-07-28 15:33:46 +02:00
|
|
|
if (row && row[0] && row[1])
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
2004-03-17 10:35:03 +01:00
|
|
|
/*
|
|
|
|
If the slave's master info is not inited, we init it, then we write
|
|
|
|
the new coordinates to it. Must call init_master_info() *before*
|
|
|
|
setting active_mi, because init_master_info() sets active_mi with
|
|
|
|
defaults.
|
|
|
|
*/
|
2004-05-12 01:38:57 +02:00
|
|
|
int error;
|
|
|
|
|
2004-11-25 09:26:45 +01:00
|
|
|
if (init_master_info(active_mi, master_info_file, relay_log_info_file,
|
|
|
|
0, (SLAVE_IO | SLAVE_SQL)))
|
2004-11-12 13:34:00 +01:00
|
|
|
my_message(ER_MASTER_INFO, ER(ER_MASTER_INFO), MYF(0));
|
2002-01-20 03:16:52 +01:00
|
|
|
strmake(active_mi->master_log_name, row[0],
|
|
|
|
sizeof(active_mi->master_log_name));
|
2004-05-12 01:38:57 +02:00
|
|
|
active_mi->master_log_pos= my_strtoll10(row[1], (char**) 0, &error);
|
2004-03-19 14:17:56 +01:00
|
|
|
/* at least in recent versions, the condition below should be false */
|
2002-06-08 20:02:01 +02:00
|
|
|
if (active_mi->master_log_pos < BIN_LOG_HEADER_SIZE)
|
|
|
|
active_mi->master_log_pos = BIN_LOG_HEADER_SIZE;
|
2003-11-23 17:02:59 +01:00
|
|
|
/*
|
|
|
|
Relay log's IO_CACHE may not be inited (even if we are sure that some
|
|
|
|
host was specified; there could have been a problem when replication
|
|
|
|
started, which led to relay log's IO_CACHE to not be inited.
|
|
|
|
*/
|
|
|
|
flush_master_info(active_mi, 0);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
2003-05-02 18:07:41 +02:00
|
|
|
mysql_free_result(master_status_res);
|
2001-11-11 06:24:12 +01:00
|
|
|
}
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
if (mysql_real_query(&mysql, "UNLOCK TABLES", 13))
|
2001-11-11 06:24:12 +01:00
|
|
|
{
|
now my_printf_error is not better then my_error, but my_error call is shorter
used only one implementation of format parser of (printf)
fixed multistatement
include/mysqld_error.h:
newerror messages
mysql-test/t/key.test:
unknown error replaced with real error
mysys/my_error.c:
my_error & my_printf_error use my_vsprintf
sql/field_conv.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/ha_innodb.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_cmpfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_func.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_strfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/lock.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/log.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/parse_file.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/procedure.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/protocol.cc:
no need reset thd->lex->found_colon to break multiline sequance now, send_error called too late
sql/repl_failsafe.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/set_var.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/share/czech/errmsg.txt:
new errors converted from unknown error
sql/share/danish/errmsg.txt:
new errors converted from unknown error
sql/share/dutch/errmsg.txt:
new errors converted from unknown error
sql/share/english/errmsg.txt:
new errors converted from unknown error
sql/share/estonian/errmsg.txt:
new errors converted from unknown error
sql/share/french/errmsg.txt:
new errors converted from unknown error
sql/share/german/errmsg.txt:
new errors converted from unknown error
sql/share/greek/errmsg.txt:
new errors converted from unknown error
sql/share/hungarian/errmsg.txt:
new errors converted from unknown error
sql/share/italian/errmsg.txt:
new errors converted from unknown error
sql/share/japanese/errmsg.txt:
new errors converted from unknown error
sql/share/korean/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian-ny/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian/errmsg.txt:
new errors converted from unknown error
sql/share/polish/errmsg.txt:
new errors converted from unknown error
sql/share/portuguese/errmsg.txt:
new errors converted from unknown error
sql/share/romanian/errmsg.txt:
new errors converted from unknown error
sql/share/russian/errmsg.txt:
new errors converted from unknown error
sql/share/serbian/errmsg.txt:
new errors converted from unknown error
sql/share/slovak/errmsg.txt:
new errors converted from unknown error
sql/share/spanish/errmsg.txt:
new errors converted from unknown error
sql/share/swedish/errmsg.txt:
new errors converted from unknown error
sql/share/ukrainian/errmsg.txt:
new errors converted from unknown error
sql/slave.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp_head.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_acl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_analyse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_base.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_class.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_db.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_delete.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_insert.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_load.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_map.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_parse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
multi-row command fixed
sql/sql_prepare.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
remover send_error ingected from 4.1
sql/sql_rename.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_repl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_select.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_show.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_trigger.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_udf.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_update.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_view.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_yacc.yy:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
strings/my_vsnprintf.c:
* format support added to my_vsprint
2004-11-13 18:35:51 +01:00
|
|
|
my_error(error= ER_QUERY_ON_MASTER, MYF(0), mysql_error(&mysql));
|
2001-11-11 06:24:12 +01:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
}
|
2002-01-20 03:16:52 +01:00
|
|
|
thd->proc_info="purging old relay logs";
|
2002-08-08 02:12:02 +02:00
|
|
|
if (purge_relay_logs(&active_mi->rli,thd,
|
|
|
|
0 /* not only reset, but also reinit */,
|
2002-01-20 03:16:52 +01:00
|
|
|
&errmsg))
|
|
|
|
{
|
now my_printf_error is not better then my_error, but my_error call is shorter
used only one implementation of format parser of (printf)
fixed multistatement
include/mysqld_error.h:
newerror messages
mysql-test/t/key.test:
unknown error replaced with real error
mysys/my_error.c:
my_error & my_printf_error use my_vsprintf
sql/field_conv.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/ha_innodb.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_cmpfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_func.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/item_strfunc.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/lock.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/log.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/parse_file.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/procedure.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/protocol.cc:
no need reset thd->lex->found_colon to break multiline sequance now, send_error called too late
sql/repl_failsafe.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/set_var.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/share/czech/errmsg.txt:
new errors converted from unknown error
sql/share/danish/errmsg.txt:
new errors converted from unknown error
sql/share/dutch/errmsg.txt:
new errors converted from unknown error
sql/share/english/errmsg.txt:
new errors converted from unknown error
sql/share/estonian/errmsg.txt:
new errors converted from unknown error
sql/share/french/errmsg.txt:
new errors converted from unknown error
sql/share/german/errmsg.txt:
new errors converted from unknown error
sql/share/greek/errmsg.txt:
new errors converted from unknown error
sql/share/hungarian/errmsg.txt:
new errors converted from unknown error
sql/share/italian/errmsg.txt:
new errors converted from unknown error
sql/share/japanese/errmsg.txt:
new errors converted from unknown error
sql/share/korean/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian-ny/errmsg.txt:
new errors converted from unknown error
sql/share/norwegian/errmsg.txt:
new errors converted from unknown error
sql/share/polish/errmsg.txt:
new errors converted from unknown error
sql/share/portuguese/errmsg.txt:
new errors converted from unknown error
sql/share/romanian/errmsg.txt:
new errors converted from unknown error
sql/share/russian/errmsg.txt:
new errors converted from unknown error
sql/share/serbian/errmsg.txt:
new errors converted from unknown error
sql/share/slovak/errmsg.txt:
new errors converted from unknown error
sql/share/spanish/errmsg.txt:
new errors converted from unknown error
sql/share/swedish/errmsg.txt:
new errors converted from unknown error
sql/share/ukrainian/errmsg.txt:
new errors converted from unknown error
sql/slave.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sp_head.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_acl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_analyse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_base.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_class.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_db.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_delete.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_handler.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_insert.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_load.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_map.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_parse.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
multi-row command fixed
sql/sql_prepare.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
remover send_error ingected from 4.1
sql/sql_rename.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_repl.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_select.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_show.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_trigger.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_udf.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_update.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_view.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/sql_yacc.yy:
now my_printf_error is not better then my_error, but my_error call is shorter
sql/table.cc:
now my_printf_error is not better then my_error, but my_error call is shorter
strings/my_vsnprintf.c:
* format support added to my_vsprint
2004-11-13 18:35:51 +01:00
|
|
|
my_error(ER_RELAY_LOG_FAIL, MYF(0), errmsg);
|
2002-01-20 03:16:52 +01:00
|
|
|
unlock_slave_threads(active_mi);
|
Fix for BUG#2921 "Replication problem on mutex lock in mySQL-4.0.18":
re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks (like BUG#2921
when two START SLAVE, but when two STOP SLAVE too).
Removing unused variables.
sql/item_func.cc:
We don't need LOCK_active_mi just to MASTER_POS_WAIT().
sql/repl_failsafe.cc:
no need for macro
sql/set_var.cc:
no need for macro
sql/slave.cc:
Re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks.
Removing unused variables.
sql/slave.h:
Re-using LOCK_active_mi to serialize administrative replication commands.
Macros unneeded. Removing unneeded variables.
sql/sql_parse.cc:
found unused variable.
Replacing macros.
sql/sql_show.cc:
replacing macros
2004-03-11 16:23:35 +01:00
|
|
|
pthread_mutex_unlock(&LOCK_active_mi);
|
2004-10-20 03:04:37 +02:00
|
|
|
return TRUE;
|
2002-01-20 03:16:52 +01:00
|
|
|
}
|
|
|
|
pthread_mutex_lock(&active_mi->rli.data_lock);
|
Replication: new code to not modify in-memory log positions until the COMMIT
is executed, even if the transaction spans on >=2 relay logs (bug #53).
New variable relay_log_purge =0|1
New test to verify bug #53
sql/log.cc:
Now we purge a relay log only when we are sure we won't need it,
i.e. we have executed the final query (if autocommit=1) or the COMMIT.
sql/log_event.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
sql/mysql_priv.h:
new option relay_log_purge (the user can now decide himself
if he wants his relay logs to be automatically purged or not,
we don't make unsafe guesses like before)
sql/mysqld.cc:
new option --innodb (replaces --skip-innodb).
Useful for the test suite : we have skip-innodb in mysql-test-run,
but we can ('-opt.info' file) choose to start the server with
InnoDB for this test only.
New option --bdb
sql/repl_failsafe.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
sql/set_var.cc:
new variable relay_log_purge
sql/slave.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
Now we purge a relay log only when we are sure we won't need it,
i.e. we have executed the final query (if autocommit=1) or the COMMIT
sql/slave.h:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
sql/sql_class.h:
prototypes change
sql/sql_parse.cc:
removed thd argument (was not used in the function's body)
sql/sql_repl.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
Turn relay_log_purge silently off when someone does CHANGE
MASTER TO RELAY_LOG_*
2003-04-24 15:29:25 +02:00
|
|
|
active_mi->rli.group_master_log_pos = active_mi->master_log_pos;
|
|
|
|
strmake(active_mi->rli.group_master_log_name,active_mi->master_log_name,
|
|
|
|
sizeof(active_mi->rli.group_master_log_name)-1);
|
2003-09-13 22:13:41 +02:00
|
|
|
/*
|
|
|
|
Cancel the previous START SLAVE UNTIL, as the fact to download
|
|
|
|
a new copy logically makes UNTIL irrelevant.
|
|
|
|
*/
|
|
|
|
clear_until_condition(&active_mi->rli);
|
|
|
|
|
Replication: new code to not modify in-memory log positions until the COMMIT
is executed, even if the transaction spans on >=2 relay logs (bug #53).
New variable relay_log_purge =0|1
New test to verify bug #53
sql/log.cc:
Now we purge a relay log only when we are sure we won't need it,
i.e. we have executed the final query (if autocommit=1) or the COMMIT.
sql/log_event.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
sql/mysql_priv.h:
new option relay_log_purge (the user can now decide himself
if he wants his relay logs to be automatically purged or not,
we don't make unsafe guesses like before)
sql/mysqld.cc:
new option --innodb (replaces --skip-innodb).
Useful for the test suite : we have skip-innodb in mysql-test-run,
but we can ('-opt.info' file) choose to start the server with
InnoDB for this test only.
New option --bdb
sql/repl_failsafe.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
sql/set_var.cc:
new variable relay_log_purge
sql/slave.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
Now we purge a relay log only when we are sure we won't need it,
i.e. we have executed the final query (if autocommit=1) or the COMMIT
sql/slave.h:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
sql/sql_class.h:
prototypes change
sql/sql_parse.cc:
removed thd argument (was not used in the function's body)
sql/sql_repl.cc:
Better tracking of the relay log's name and position
lastly executed, even if we are in a transaction which spans on
2 or more relay logs.
Turn relay_log_purge silently off when someone does CHANGE
MASTER TO RELAY_LOG_*
2003-04-24 15:29:25 +02:00
|
|
|
/*
|
|
|
|
No need to update rli.event* coordinates, they will be when the slave
|
|
|
|
threads start ; only rli.group* coordinates are necessary here.
|
|
|
|
*/
|
2002-02-07 23:29:46 +01:00
|
|
|
flush_relay_log_info(&active_mi->rli);
|
2002-01-20 03:16:52 +01:00
|
|
|
pthread_cond_broadcast(&active_mi->rli.data_cond);
|
|
|
|
pthread_mutex_unlock(&active_mi->rli.data_lock);
|
|
|
|
thd->proc_info = "starting slave";
|
|
|
|
if (restart_thread_mask)
|
|
|
|
{
|
2002-06-11 10:20:31 +02:00
|
|
|
error=start_slave_threads(0 /* mutex not needed */,
|
|
|
|
1 /* wait for start */,
|
|
|
|
active_mi,master_info_file,relay_log_info_file,
|
|
|
|
restart_thread_mask);
|
2002-01-20 03:16:52 +01:00
|
|
|
}
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
err:
|
2002-01-20 03:16:52 +01:00
|
|
|
unlock_slave_threads(active_mi);
|
Fix for BUG#2921 "Replication problem on mutex lock in mySQL-4.0.18":
re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks (like BUG#2921
when two START SLAVE, but when two STOP SLAVE too).
Removing unused variables.
sql/item_func.cc:
We don't need LOCK_active_mi just to MASTER_POS_WAIT().
sql/repl_failsafe.cc:
no need for macro
sql/set_var.cc:
no need for macro
sql/slave.cc:
Re-using unused LOCK_active_mi to serialize all administrative
commands related to replication:
START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER, init_slave()
(replication autostart at server startup), end_slave() (replication
autostop at server shutdown), LOAD DATA FROM MASTER.
This protects us against a handful of deadlocks.
Removing unused variables.
sql/slave.h:
Re-using LOCK_active_mi to serialize administrative replication commands.
Macros unneeded. Removing unneeded variables.
sql/sql_parse.cc:
found unused variable.
Replacing macros.
sql/sql_show.cc:
replacing macros
2004-03-11 16:23:35 +01:00
|
|
|
pthread_mutex_unlock(&LOCK_active_mi);
|
2002-01-20 03:16:52 +01:00
|
|
|
thd->proc_info = 0;
|
|
|
|
|
2003-05-02 18:07:41 +02:00
|
|
|
mysql_close(&mysql); // safe to call since we always do mysql_init()
|
2001-11-11 06:24:12 +01:00
|
|
|
if (!error)
|
2002-10-02 12:33:08 +02:00
|
|
|
send_ok(thd);
|
2001-11-11 06:24:12 +01:00
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
2002-12-16 14:33:29 +01:00
|
|
|
|
2003-01-15 09:11:44 +01:00
|
|
|
#endif /* HAVE_REPLICATION */
|
2002-12-16 14:33:29 +01:00
|
|
|
|