diff options
author | unknown <monty@donna.mysql.com> | 2001-01-25 22:38:53 +0200 |
---|---|---|
committer | unknown <monty@donna.mysql.com> | 2001-01-25 22:38:53 +0200 |
commit | 002b51000fcec9ff8c45afe12ddd3728f6035ff0 (patch) | |
tree | e4dc09a7c816c372ba7388b1bece80f8b7d0e815 | |
parent | c6a67ce9dc3b3ec5b9055d158c7c41d35db4fb50 (diff) | |
parent | b302ee39bc8e5f26f3fe95b47a3f42ad11cc5f40 (diff) | |
download | mariadb-git-002b51000fcec9ff8c45afe12ddd3728f6035ff0.tar.gz |
Merge work:/my/mysql into donna.mysql.com:/home/my/bk/mysql
Docs/manual.texi:
Auto merged
sql/slave.cc:
Auto merged
sql/sql_repl.cc:
Auto merged
49 files changed, 393 insertions, 85 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index e28142a5752..0e4a7b9d9ab 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -40776,12 +40776,13 @@ not yet 100 % confident in this code. @itemize @bullet @item Changed code to get around compiler bug in Compaq C++ on OSF1, that broke -@code{BACKUP, RESTORE, CHECK, REPAIR, and ANALYZE TABLE}. +@code{BACKUP}, @code{RESTORE}, @code{CHECK}, @code{REPAIR}, and +@code{ANALYZE TABLE}. @item Added option @code{FULL} to @code{SHOW COLUMNS}. Now we only show the privilege list for the columns if this option is given. @item -Fixed bug in @code{SHOW LOGS} when there wheren't any BDB logs. +Fixed bug in @code{SHOW LOGS} when there weren't any BDB logs. @item Fixed a timing problem in replication that could delay sending an update to the client until a new update was done. @@ -40791,13 +40792,13 @@ to keep this code compatible with @code{SHOW FIELDS}. @item @code{MERGE} tables didn't work on windows. @item -Fixed problem with @code{SET PASSWORD=...} on windows. +Fixed problem with @code{SET PASSWORD=...} on Windows. @item Added missing @file{my_config.h} to RPM distribution. @item @code{TRIM("foo" from "foo")} didn't return an empty string. @item -Added @code{--with-version-suffix} to configure. +Added @code{--with-version-suffix} to @code{configure}. @item Fixed coredump when client aborted connection without @code{mysql_close()}. @item diff --git a/client/mysqltest.c b/client/mysqltest.c index 992583bb230..953f770240b 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -485,14 +485,19 @@ int do_echo(struct st_query* q) return 0; } -int do_sync_with_master() +int do_sync_with_master(struct st_query* q) { MYSQL_RES* res; MYSQL_ROW row; MYSQL* mysql = &cur_con->mysql; char query_buf[FN_REFLEN+128]; + int offset = 0; + char* p = q->first_argument; + if(*p) + offset = atoi(p); + sprintf(query_buf, "select master_pos_wait('%s', %ld)", master_pos.file, - master_pos.pos); + master_pos.pos + offset); if(mysql_query(mysql, query_buf)) die("At line %u: failed in %s: %d: %s", start_lineno, query_buf, mysql_errno(mysql), mysql_error(mysql)); @@ -1458,7 +1463,7 @@ int main(int argc, char** argv) q->require_file=require_file; save_file[0]=0; } - error |= run_query(&cur_con->mysql, q, QUERY_SEND|QUERY_REAP); + error |= run_query(&cur_con->mysql, q, flags); break; } case Q_SEND: diff --git a/include/my_sys.h b/include/my_sys.h index 0f010fc71af..a3c2a631ddf 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -425,7 +425,7 @@ extern int my_printf_error _VARARGS((uint my_err, const char *format, __attribute__ ((format (printf, 2, 4)))); extern int my_vsnprintf( char *str, size_t n, const char *format, va_list ap ); - +extern int my_snprintf(char* to, size_t n, const char* fmt, ...); extern int my_message(uint my_err, const char *str,myf MyFlags); extern int my_message_no_curses(uint my_err, const char *str,myf MyFlags); extern int my_message_curses(uint my_err, const char *str,myf MyFlags); diff --git a/include/mysqld_error.h b/include/mysqld_error.h index 0391c3e6c4e..c84b0c08c77 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -198,4 +198,9 @@ #define ER_CRASHED_ON_REPAIR 1195 #define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196 #define ER_TRANS_CACHE_FULL 1197 -#define ER_ERROR_MESSAGES 198 +#define ER_SLAVE_MUST_STOP 1198 +#define ER_SLAVE_NOT_RUNNING 1199 +#define ER_BAD_SLAVE 1200 +#define ER_MASTER_INFO 1201 +#define ER_SLAVE_THREAD 1202 +#define ER_ERROR_MESSAGES 203 diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index a63e909d823..79fee8d493a 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -72,6 +72,7 @@ cd .. BASEDIR=`pwd` cd $CWD MYSQL_TEST_DIR=$BASEDIR/mysql-test +export MYSQL_TEST_DIR STD_DATA=$MYSQL_TEST_DIR/std_data hostname=`hostname` # Installed in the mysql privilege table @@ -336,6 +337,11 @@ gcov_collect () { start_master() { [ x$MASTER_RUNNING = 1 ] && return + #run master initialization shell script if one exists + if [ -f "$master_init_script" ] ; + then + /bin/sh $master_init_script + fi cd $BASEDIR # for gcov # Remove old berkeley db log files that can confuse the server $RM -f $MASTER_MYDDIR/log.* @@ -375,6 +381,13 @@ start_slave() { [ x$SKIP_SLAVE = x1 ] && return [ x$SLAVE_RUNNING = 1 ] && return + + #run slave initialization shell script if one exists + if [ -f "$slave_init_script" ] ; + then + /bin/sh $slave_init_script + fi + if [ -z "$SLAVE_MASTER_INFO" ] ; then master_info="--master-user=root \ --master-connect-retry=1 \ @@ -502,6 +515,8 @@ run_testcase () tname=`$BASENAME $tf .test` master_opt_file=$TESTDIR/$tname-master.opt slave_opt_file=$TESTDIR/$tname-slave.opt + master_init_script=$TESTDIR/$tname-master.sh + slave_init_script=$TESTDIR/$tname-slave.sh slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0` diff --git a/mysql-test/r/backup.result b/mysql-test/r/backup.result index a801e1cd28d..4b7b62f3ee8 100644 --- a/mysql-test/r/backup.result +++ b/mysql-test/r/backup.result @@ -37,3 +37,7 @@ k 223 245 267 +Table Op Msg_type Msg_text +test.t1 restore status OK +Table Op Msg_type Msg_text +test.t1 backup status OK diff --git a/mysql-test/r/rpl000014.result b/mysql-test/r/rpl000014.result index 9e45b9c10a3..d2cb8ee5436 100644 --- a/mysql-test/r/rpl000014.result +++ b/mysql-test/r/rpl000014.result @@ -1,13 +1,13 @@ File Position Binlog_do_db Binlog_ignore_db master-bin.001 73 -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 1 master-bin.001 73 Yes -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 1 master-bin.001 73 No -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 1 master-bin.001 73 Yes -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 1 master-bin.001 173 Yes +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 1 master-bin.001 73 Yes 0 0 +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 1 master-bin.001 73 No 0 0 +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 1 master-bin.001 73 Yes 0 0 +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 1 master-bin.001 173 Yes 0 0 File Position Binlog_do_db Binlog_ignore_db master-bin.001 73 n diff --git a/mysql-test/r/rpl000015.result b/mysql-test/r/rpl000015.result index 59a1a21be17..5899d76c82f 100644 --- a/mysql-test/r/rpl000015.result +++ b/mysql-test/r/rpl000015.result @@ -1,13 +1,13 @@ File Position Binlog_do_db Binlog_ignore_db master-bin.001 73 -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db - 0 0 0 No -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 test 3306 60 4 No -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 60 4 No -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 60 master-bin.001 73 Yes +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter + 0 0 0 No 0 0 +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 test 3306 60 4 No 0 0 +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 60 4 No 0 0 +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 60 master-bin.001 73 Yes 0 0 n 10 45 diff --git a/mysql-test/r/rpl000016.result b/mysql-test/r/rpl000016.result index ae5b83a4a85..39ea7234e2a 100644 --- a/mysql-test/r/rpl000016.result +++ b/mysql-test/r/rpl000016.result @@ -1,5 +1,5 @@ -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 60 master-bin.001 216 Yes +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 60 master-bin.001 216 Yes 0 0 s Could not break slave Tried hard @@ -9,10 +9,17 @@ master-bin.002 master-bin.003 Log_name master-bin.003 -Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db -127.0.0.1 root 9306 60 master-bin.003 128 Yes +Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter +127.0.0.1 root 9306 60 master-bin.003 184 Yes 0 0 m 34 +65 67 123 -65 +1234 +Log_name +master-bin.003 +master-bin.004 +master-bin.005 +count(*) +100 diff --git a/mysql-test/r/rpl000017.result b/mysql-test/r/rpl000017.result new file mode 100644 index 00000000000..e4f324047f8 --- /dev/null +++ b/mysql-test/r/rpl000017.result @@ -0,0 +1,2 @@ +n +24 diff --git a/mysql-test/t/backup.test b/mysql-test/t/backup.test index 396576badb7..17b06d73814 100644 --- a/mysql-test/t/backup.test +++ b/mysql-test/t/backup.test @@ -26,6 +26,19 @@ select n from t1; select m from t2; select k from t3; drop table t1,t2,t3; -#restore table t1 from '../tmp'; -#connection con2; -#lock tables t1 write; +restore table t1 from '../tmp'; +connection con2; +send lock tables t1 write; +connection con1; +send backup table t1 to '../tmp'; +connection con2; +reap; +unlock tables; +connection con1; +reap; + + + + + + diff --git a/mysql-test/t/rpl000012.test b/mysql-test/t/rpl000012.test index 495cb81167e..eddd3ede1d7 100644 --- a/mysql-test/t/rpl000012.test +++ b/mysql-test/t/rpl000012.test @@ -10,20 +10,26 @@ connection master1; create temporary table t1 (n int); insert into t1 values (4),(5); insert into t2 select * from t1; +save_master_pos; disconnect master; +connection slave; + +#add 1 to the saved position, so we will catch drop table on disconnect +#for sure +sync_with_master 1; connection master1; insert into t2 values(6); -disconnect master1; -connect (master2,localhost,root,,test,0,mysql-master.sock); -connection master2; save_master_pos; +disconnect master1; connection slave; -sync_with_master; +#same trick - make sure we catch drop of temporary table on disconnect +sync_with_master 1; @r/rpl000012.result select * from t2; @r/rpl000012.status.result show status like 'Slave_open_temp_tables'; # # Clean up # +connect (master2,localhost,root,,test,0,mysql-master.sock); connection master2; drop table if exists t1,t2; save_master_pos; diff --git a/mysql-test/t/rpl000013.test b/mysql-test/t/rpl000013.test index f5056839791..f870d017fa3 100644 --- a/mysql-test/t/rpl000013.test +++ b/mysql-test/t/rpl000013.test @@ -13,20 +13,24 @@ connection master1; create temporary table t1 (n int); insert into t1 values (4),(5); insert into t2 select * from t1; +save_master_pos; disconnect master; +connection slave; +#add 1 to catch drop table +sync_with_master 1; connection master1; insert into t2 values(6); -disconnect master1; -connect (master2,localhost,root,,test,0,mysql-master.sock); -connection master2; save_master_pos; +disconnect master1; connection slave; -sync_with_master; +# same trick to go one more event +sync_with_master 1; @r/rpl000013.result select * from t2; @r/rpl000013.status.result show status like 'Slave_open_temp_tables'; # # Clean up # +connect (master2,localhost,root,,test,0,mysql-master.sock); connection master2; drop table if exists t1,t2; save_master_pos; diff --git a/mysql-test/t/rpl000016-master.opt b/mysql-test/t/rpl000016-master.opt new file mode 100644 index 00000000000..f27601e0d7d --- /dev/null +++ b/mysql-test/t/rpl000016-master.opt @@ -0,0 +1 @@ +-O max_binlog_size=2048 diff --git a/mysql-test/t/rpl000016.test b/mysql-test/t/rpl000016.test index f9ef99c62b6..fd30188ea89 100644 --- a/mysql-test/t/rpl000016.test +++ b/mysql-test/t/rpl000016.test @@ -26,10 +26,40 @@ select * from t1; connection master; flush logs; drop table if exists t2; -create table t2(m int); +create table t2(m int not null primary key); insert into t2 values (34),(67),(123); +save_master_pos; flush logs; show master logs; + +#now lets make some duplicate key mess and see if we can recover from it + +#first insert a value on the slave +connection slave; +sync_with_master; +insert into t2 values(1234); + +#same value on the master +connection master; +save_master_pos; +insert into t2 values(1234); +connection slave; +sync_with_master; + +#the slave may have already stopped, so we ignore the error +!slave stop; + +#restart slave skipping one event +set sql_slave_skip_counter=1; +slave start; + +connection master; +save_master_pos; + +#let slave catch up +connection slave; +sync_with_master; +connection master; purge master logs to 'master-bin.003'; show master logs; insert into t2 values (65); @@ -38,6 +68,25 @@ connection slave; sync_with_master; show slave status; select * from t2; -drop table if exists t1,t2; connection master; -drop table if exists t1,t2; +let $1=100; +drop table if exists t3; +create table t3 (n int); +while ($1) +{ + insert into t3 values(4); + dec $1; +} +show master logs; +save_master_pos; +connection slave; +slave stop; +slave start; +sync_with_master; +select count(*) from t3 where n = 4; +#clean up +connection master; +drop table if exists t1,t2,t3; +save_master_pos; +connection slave; +sync_with_master; diff --git a/mysql-test/t/rpl000017-slave.opt b/mysql-test/t/rpl000017-slave.opt new file mode 100644 index 00000000000..58a964c90d0 --- /dev/null +++ b/mysql-test/t/rpl000017-slave.opt @@ -0,0 +1 @@ +--skip-slave-start diff --git a/mysql-test/t/rpl000017-slave.sh b/mysql-test/t/rpl000017-slave.sh new file mode 100755 index 00000000000..fe875f1a778 --- /dev/null +++ b/mysql-test/t/rpl000017-slave.sh @@ -0,0 +1,9 @@ +cat > $MYSQL_TEST_DIR/var/slave-data/master.info <<EOF +master-bin.001 +4 +127.0.0.1 +root + +9306 +1 +EOF diff --git a/mysql-test/t/rpl000017.test b/mysql-test/t/rpl000017.test new file mode 100644 index 00000000000..c93d861bec8 --- /dev/null +++ b/mysql-test/t/rpl000017.test @@ -0,0 +1,19 @@ +connect (master,localhost,root,,test,0,mysql-master.sock); +connect (slave,localhost,root,,test,0,mysql-slave.sock); +connection master; +reset master; +connection slave; +slave start; +connection master; +drop table if exists t1; +create table t1(n int); +insert into t1 values(24); +save_master_pos; +connection slave; +sync_with_master; +select * from t1; +connection master; +drop table t1; +save_master_pos; +connection slave; +sync_with_master; diff --git a/mysys/mf_tempfile.c b/mysys/mf_tempfile.c index 6204c4d0407..b2c0e89b9e4 100644 --- a/mysys/mf_tempfile.c +++ b/mysys/mf_tempfile.c @@ -40,7 +40,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix, myf MyFlags __attribute__((unused))) { File file= -1; - DBUG_ENTER("open_temp_file"); + DBUG_ENTER("create_temp_file"); #if defined(_MSC_VER) { char temp[FN_REFLEN],*end,*res,**old_env,*temp_env[1]; diff --git a/mysys/my_vsnprintf.c b/mysys/my_vsnprintf.c index 030846ea63b..669b8be61b1 100644 --- a/mysys/my_vsnprintf.c +++ b/mysys/my_vsnprintf.c @@ -21,6 +21,13 @@ #include <stdarg.h> #include <m_ctype.h> +int my_snprintf(char* to, size_t n, const char* fmt, ...) +{ + va_list args; + va_start(args,fmt); + return my_vsnprintf(to, n, fmt, args); +} + int my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap) { char *start=to, *end=to+n-1; diff --git a/sql/gen_lex_hash.cc b/sql/gen_lex_hash.cc index efaf7411c55..78ffb266366 100644 --- a/sql/gen_lex_hash.cc +++ b/sql/gen_lex_hash.cc @@ -472,8 +472,8 @@ int main(int argc,char **argv) int error; MY_INIT(argv[0]); - start_value=4424889L; best_t1=3207460L; best_t2=481534L; best_type=0; /* mode=4451 add=8 type: 0 */ - if (get_options(argc,(char **) argv)) + start_value=5315771L; best_t1=6916833L; best_t2=3813748L; best_type=3; /* mode=5839 add=5 type: 0 */ + if (get_options(argc,(char **) argv)) exit(1); make_max_length_table(); diff --git a/sql/lex.h b/sql/lex.h index 946cba49bce..6f030aa524d 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -283,6 +283,7 @@ static SYMBOL symbols[] = { { "SQL_QUOTE_SHOW_CREATE",SYM(SQL_QUOTE_SHOW_CREATE), 0, 0}, { "SQL_SAFE_UPDATES", SYM(SQL_SAFE_UPDATES),0,0}, { "SQL_SELECT_LIMIT", SYM(SQL_SELECT_LIMIT),0,0}, + { "SQL_SLAVE_SKIP_COUNTER", SYM(SQL_SLAVE_SKIP_COUNTER),0,0}, { "SQL_SMALL_RESULT", SYM(SQL_SMALL_RESULT),0,0}, { "SQL_WARNINGS", SYM(SQL_WARNINGS),0,0}, { "STRAIGHT_JOIN", SYM(STRAIGHT_JOIN),0,0}, diff --git a/sql/log.cc b/sql/log.cc index 5ce9a7a4deb..80001acacd2 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -28,6 +28,7 @@ MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log; extern I_List<i_string> binlog_do_db, binlog_ignore_db; +extern ulong max_binlog_size; static bool test_if_number(const char *str, long *res, bool allow_wildcards); @@ -609,6 +610,8 @@ bool MYSQL_LOG::write(Query_log_event* event_info) { /* In most cases this is only called if 'is_open()' is true */ bool error=0; + bool should_rotate = 0; + if (!inited) // Can't use mutex if not init return 0; VOID(pthread_mutex_lock(&LOCK_log)); @@ -655,7 +658,7 @@ bool MYSQL_LOG::write(Query_log_event* event_info) file == &log_file && flush_io_cache(file)) goto err; error=0; - + should_rotate = (file == &log_file && my_b_tell(file) >= max_binlog_size); err: if (error) { @@ -669,6 +672,8 @@ err: VOID(pthread_cond_broadcast(&COND_binlog_update)); } VOID(pthread_mutex_unlock(&LOCK_log)); + if(should_rotate) + new_file(); return error; } @@ -682,6 +687,7 @@ bool MYSQL_LOG::write(IO_CACHE *cache) { VOID(pthread_mutex_lock(&LOCK_log)); bool error=1; + if (is_open()) { uint length; @@ -722,7 +728,8 @@ err: else VOID(pthread_cond_broadcast(&COND_binlog_update)); - VOID(pthread_mutex_unlock(&LOCK_log)); + VOID(pthread_mutex_unlock(&LOCK_log)); + return error; } @@ -730,6 +737,8 @@ err: bool MYSQL_LOG::write(Load_log_event* event_info) { bool error=0; + bool should_rotate = 0; + if (inited) { VOID(pthread_mutex_lock(&LOCK_log)); @@ -745,11 +754,16 @@ bool MYSQL_LOG::write(Load_log_event* event_info) sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno); error=write_error=1; } + should_rotate = (my_b_tell(&log_file) >= max_binlog_size); VOID(pthread_cond_broadcast(&COND_binlog_update)); } } VOID(pthread_mutex_unlock(&LOCK_log)); } + + if(should_rotate) + new_file(); + return error; } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 62ee256b9da..0033c795f0f 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -238,7 +238,7 @@ ulong keybuff_size,sortbuff_size,max_item_sort_length,table_cache_size, query_buff_size, lower_case_table_names, mysqld_net_retry_count, net_interactive_timeout, slow_launch_time = 2L, net_read_timeout,net_write_timeout,slave_open_temp_tables=0, - open_files_limit=0; + open_files_limit=0, max_binlog_size; ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0; volatile ulong cached_thread_count=0; @@ -2571,6 +2571,8 @@ CHANGEABLE_VAR changeable_vars[] = { 1024*1024L, 80, 64*1024*1024L, MALLOC_OVERHEAD, 1024 }, { "max_binlog_cache_size", (long*) &max_binlog_cache_size, ~0L, IO_SIZE, ~0L, 0, IO_SIZE }, + { "max_binlog_size", (long*) &max_binlog_size, + 1024*1024L*1024L, 1024, 1024*1024L*1024L, 0, 1 }, { "max_connections", (long*) &max_connections, 100, 1, 16384, 0, 1 }, { "max_connect_errors", (long*) &max_connect_errors, @@ -2672,7 +2674,8 @@ struct show_var_st init_vars[]= { {"low_priority_updates", (char*) &low_priority_updates, SHOW_BOOL}, {"lower_case_table_names", (char*) &lower_case_table_names, SHOW_LONG}, {"max_allowed_packet", (char*) &max_allowed_packet, SHOW_LONG}, - {"max_binlog_cache_size", (char*) &max_binlog_cache_size, SHOW_LONG}, + {"max_binlog_cache_size", (char*) &max_binlog_cache_size, SHOW_LONG}, + {"max_binlog_size", (char*) &max_binlog_size, SHOW_LONG}, {"max_connections", (char*) &max_connections, SHOW_LONG}, {"max_connect_errors", (char*) &max_connect_errors, SHOW_LONG}, {"max_delayed_threads", (char*) &max_insert_delayed_threads, SHOW_LONG}, diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index c10d59dc21c..319d8a88149 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -208,3 +208,8 @@ "Tabulka '%-.64s' je ozna-BХena jako poru╧enА a poslednМ (automatickА?) oprava se nezdaЬila",-A "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt index 79d7ae5efc4..43aad2f71e4 100644 --- a/sql/share/danish/errmsg.txt +++ b/sql/share/danish/errmsg.txt @@ -202,3 +202,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt index 1cfdbee8d43..86d8e095d20 100644 --- a/sql/share/dutch/errmsg.txt +++ b/sql/share/dutch/errmsg.txt @@ -199,3 +199,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 4900e4bd7ad..e11a182c6b7 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -187,7 +187,7 @@ "Got error %d during CHECKPOINT", "Aborted connection %ld to db: '%-.64s' user: '%-.32s' host: `%-.64s' (%-.64s)", "The handler for the table does not support binary table dump", -"Binlog closed while trying to FLUSH MASTER", +"Binlog closed, cannot RESET MASTER", "Failed rebuilding the index of dumped table '%-.64s'", "Error from master: '%-.64s'", "Net error reading from master", @@ -199,3 +199,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt index cb609f66432..227b6336562 100644 --- a/sql/share/estonian/errmsg.txt +++ b/sql/share/estonian/errmsg.txt @@ -203,3 +203,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt index 0e1b9cf8e01..594da49c32e 100644 --- a/sql/share/french/errmsg.txt +++ b/sql/share/french/errmsg.txt @@ -199,3 +199,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt index 4d36544fedc..621cef7affa 100644 --- a/sql/share/german/errmsg.txt +++ b/sql/share/german/errmsg.txt @@ -202,3 +202,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index eb43678ddcf..0be996a0e8a 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -199,3 +199,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index eacc8a967a9..20e1af723fa 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -201,3 +201,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt index f5e333696cf..699ab815e2a 100644 --- a/sql/share/italian/errmsg.txt +++ b/sql/share/italian/errmsg.txt @@ -199,3 +199,8 @@ "La tabella '%-.64s' e' segnalata come rovinata e l'ultima ricostruzione (automatica?) e' fallita", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index 4b7a3fd30e1..04b411239ae 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -201,3 +201,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index d772f8c46d5..e1efb0c15ae 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -199,3 +199,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index d6c29026c0b..5484b58425e 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -201,3 +201,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index 4d0c1ef87f0..4db4af5457f 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -201,3 +201,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index a77f64b8b37..5e90cf05b8e 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -203,3 +203,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt index 946a64df5d0..1cd257e9ab1 100644 --- a/sql/share/portuguese/errmsg.txt +++ b/sql/share/portuguese/errmsg.txt @@ -199,3 +199,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index 7c325b9c662..cc453ff4dfc 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -203,3 +203,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt index 7a83573e0ff..d3564e5ef5b 100644 --- a/sql/share/russian/errmsg.txt +++ b/sql/share/russian/errmsg.txt @@ -179,7 +179,7 @@ "Результат содержит больше одной строки", "Таблица этого типа обязана иметь PRIMARY KEY", "Эта копия MySQL скомпилирована без поддержки RAID", -"You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", +"MySQL работает в режиме защиты от дураков (safe_mode) - не могу UPDATE без WHERE с каким-небудь KEY", "Индекс '%-.64s' не найден в таблице '%-.64s'", "Не могу открыть таблицу", "Данный тип таблиц не поддерживает check/repair", @@ -190,15 +190,20 @@ "Ошибка %d во время CHECKPOINT", "Прерванное соединение %ld к базе данных: '%-.64s' пользователь: '%-.32s' хост: `%-.64s' (%-.64s)", "Этот тип таблиц не поддерживает binary table dump", -"Binlog closed while trying to FLUSH MASTER", -"Failed rebuilding the index of dumped table '%-.64s'", -"Error from master: '%-.64s'", -"Net error reading from master", -"Net error writing to master", +"Репликационный лог закрыт, не могу сделать RESET MASTER", +"Ошибка при восстановлении индекса перекачанной таблицы '%-.64s'", +"Ошибка на мастере: '%-.64s'", +"Сетевая ошибка при чтении с мастера", +"Сетевая ошибка при писании мастеру", "FULLTEXT индекс, соответствующий заданному списку столбцов, не найден", -"Can't execute the given command because you have active locked tables or an active transaction", +"Не могу выполнить комманду из-за активных locked таблиц или активной транзакции", "Неизвестная системная переменная '%-.64'", "Таблица '%-.64s' помечена как испорченная и должна быть исправлена", "Таблица '%-.64s' помечена как испорченная и последняя попытка исправления (автоматическая?) не удалась", -"Warning: Some non-transactional changed tables couldn't be rolled back", -"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"Предупреждение: некоторые нетранзакционные таблицы не подчиняются ROLLBACK", +"Многозапросная транзакция требует увеличения 'max_binlog_cache_size' - увеличте эту переменную и попробуйте еще раз", +"Эта операция невозможна с активным slave, надо SLAVE STOP", +"Эта операция невозможна с пассивным slave, надо SLAVE START", +"Этот сервер не slave, исправьте в конфигурационном файле или коммандой CHANGE MASTER TO", +"Не получилось инициализировать структуру master info, проверте persmissions на файле master.info", +"Не могу создать процесс SLAVE, проверьте системные ресурсы", diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index 774047be656..47d51506019 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -207,3 +207,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt index 0003e435183..6fc6451c0da 100644 --- a/sql/share/spanish/errmsg.txt +++ b/sql/share/spanish/errmsg.txt @@ -200,3 +200,8 @@ "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Warning: Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index ee3d913e51a..a47bdf7428e 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -199,3 +199,8 @@ "Tabell '%-.64s' Дr crashad och senast (automatiska?) reparation misslyckades", "Warning: NЕgra icke transaktionella tabeller kunde inte ЕterstДllas vid ROLLBACK", "Transaktionen krДvde mera Дn 'max_binlog_cache_size' minne. UtЖka denna mysqld variabel och fЖrsЖk pЕ nytt", +"This operation cannot be performed with a running slave, run SLAVE STOP first", +"This operation requires a running slave, configure slave and do SLAVE START", +"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", +"Could not initialize master info structure, check permisions on master.info", +"Could not create slave thread, check system resources", diff --git a/sql/slave.cc b/sql/slave.cc index 38c0b5afb9f..22d76c54ecd 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -34,10 +34,13 @@ DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table; bool do_table_inited = 0, ignore_table_inited = 0; bool wild_do_table_inited = 0, wild_ignore_table_inited = 0; bool table_rules_on = 0; - +uint32 slave_skip_counter = 0; +static TABLE* save_temporary_tables = 0; // when slave thread exits, we need to remember the temporary tables so we // can re-use them on slave start -static TABLE* save_temporary_tables = 0; + +static int last_slave_errno = 0; +static char last_slave_error[1024] = ""; #ifndef DBUG_OFF int disconnect_slave_event_count = 0, abort_slave_event_count = 0; static int events_till_disconnect = -1, events_till_abort = -1; @@ -506,14 +509,14 @@ int init_master_info(MASTER_INFO* mi) return 1; } - if (!(length=my_b_gets(&mi->file, mi->log_file_name, - sizeof(mi->log_file_name)))) + if ((length=my_b_gets(&mi->file, mi->log_file_name, + sizeof(mi->log_file_name))) < 1) { msg="Error reading log file name from master info file "; goto error; } - mi->log_file_name[length]= 0; // kill \n + mi->log_file_name[length-1]= 0; // kill \n char buf[FN_REFLEN]; if(!my_b_gets(&mi->file, buf, sizeof(buf))) { @@ -570,6 +573,9 @@ int show_master_info(THD* thd) field_list.push_back(new Item_empty_string("Slave_Running", 3)); field_list.push_back(new Item_empty_string("Replicate_do_db", 20)); field_list.push_back(new Item_empty_string("Replicate_ignore_db", 20)); + field_list.push_back(new Item_empty_string("Last_errno", 4)); + field_list.push_back(new Item_empty_string("Last_error", 20)); + field_list.push_back(new Item_empty_string("Skip_counter", 12)); if(send_fields(thd, field_list, 1)) DBUG_RETURN(-1); @@ -589,6 +595,9 @@ int show_master_info(THD* thd) pthread_mutex_unlock(&LOCK_slave); net_store_data(packet, &replicate_do_db); net_store_data(packet, &replicate_ignore_db); + net_store_data(packet, (uint32)last_slave_errno); + net_store_data(packet, last_slave_error); + net_store_data(packet, slave_skip_counter); if (my_net_write(&thd->net, (char*)thd->packet.ptr(), packet->length())) DBUG_RETURN(-1); @@ -833,13 +842,14 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) if (ev) { int type_code = ev->get_type_code(); - if (ev->server_id == ::server_id) + if (ev->server_id == ::server_id || slave_skip_counter) { if(type_code == LOAD_EVENT) skip_load_data_infile(net); mi->inc_pos(event_len); flush_master_info(mi); + --slave_skip_counter; delete ev; return 0; // avoid infinite update loops } @@ -853,6 +863,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) { Query_log_event* qev = (Query_log_event*)ev; int q_len = qev->q_len; + int expected_error,actual_error = 0; init_sql_alloc(&thd->mem_root, 8192,0); thd->db = rewrite_db((char*)qev->db); if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) @@ -869,19 +880,22 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) thd->net.last_error[0] = 0; thd->slave_proxy_id = qev->thread_id; // for temp tables mysql_parse(thd, thd->query, q_len); - int expected_error,actual_error; if ((expected_error = qev->error_code) != (actual_error = thd->net.last_errno) && expected_error) { - sql_print_error("Slave: did not get the expected error\ - running query from master - expected: '%s', got '%s'", - ER(expected_error), - actual_error ? ER(actual_error):"no error" + const char* errmsg = "Slave: did not get the expected error\ + running query from master - expected: '%s', got '%s'"; + sql_print_error(errmsg, ER(expected_error), + actual_error ? thd->net.last_error:"no error" ); thd->query_error = 1; } else if (expected_error == actual_error) - thd->query_error = 0; + { + thd->query_error = 0; + *last_slave_error = 0; + last_slave_errno = 0; + } } thd->db = 0; // prevent db from being freed thd->query = 0; // just to be sure @@ -893,6 +907,13 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) { sql_print_error("Slave: error running query '%s' ", qev->query); + last_slave_errno = actual_error ? actual_error : -1; + my_snprintf(last_slave_error, sizeof(last_slave_error), + "error '%s' on query '%s'", + actual_error ? thd->net.last_error : + "unexpected success or fatal error", + qev->query + ); free_root(&thd->mem_root,0); delete ev; return 1; diff --git a/sql/slave.h b/sql/slave.h index b7e2d783749..11c01a9fa03 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -93,6 +93,11 @@ extern bool opt_log_slave_updates ; pthread_handler_decl(handle_slave,arg); extern bool volatile abort_loop, abort_slave; extern bool slave_running; +extern uint32 slave_skip_counter; +// needed for problems when slave stops and +// we want to restart it skipping one or more events in the master log that +// have caused errors, and have been manually applied by DBA already + extern pthread_t slave_real_id; extern MASTER_INFO glob_mi; extern HASH replicate_do_table, replicate_ignore_table; diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index be2a8a7111e..4f0112bac26 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -519,34 +519,34 @@ int start_slave(THD* thd , bool net_report) { if(!thd) thd = current_thd; NET* net = &thd->net; - const char* err = 0; + int slave_errno = 0; if (check_access(thd, PROCESS_ACL, any_db)) return 1; pthread_mutex_lock(&LOCK_slave); if(!slave_running) { if(init_master_info(&glob_mi)) - err = "Could not initialize master info"; + slave_errno = ER_MASTER_INFO; else if(server_id_supplied && *glob_mi.host) { pthread_t hThread; if(pthread_create(&hThread, &connection_attrib, handle_slave, 0)) { - err = "cannot create slave thread"; + slave_errno = ER_SLAVE_THREAD; } while(!slave_running) // slave might already be running by now pthread_cond_wait(&COND_slave_start, &LOCK_slave); } else - err = "Master host not set, or server id not configured"; + slave_errno = ER_BAD_SLAVE; } else - err = "Slave already running"; + slave_errno = ER_SLAVE_MUST_STOP; pthread_mutex_unlock(&LOCK_slave); - if(err) + if(slave_errno) { - if(net_report) send_error(net, 0, err); + if(net_report) send_error(net, slave_errno); return 1; } else if(net_report) @@ -559,8 +559,8 @@ int stop_slave(THD* thd, bool net_report ) { if(!thd) thd = current_thd; NET* net = &thd->net; - const char* err = 0; - + int slave_errno = 0; + if (check_access(thd, PROCESS_ACL, any_db)) return 1; @@ -576,14 +576,14 @@ int stop_slave(THD* thd, bool net_report ) pthread_cond_wait(&COND_slave_stopped, &LOCK_slave); } else - err = "Slave is not running"; + slave_errno = ER_SLAVE_NOT_RUNNING; pthread_mutex_unlock(&LOCK_slave); thd->proc_info = 0; - if(err) + if(slave_errno) { - if(net_report) send_error(net, 0, err); + if(net_report) send_error(net, slave_errno); return 1; } else if(net_report) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index dd1fb916bad..fa4edf23a5f 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -22,6 +22,7 @@ #define YYMAXDEPTH 3200 /* Because of 64K stack */ #define Lex current_lex #include "mysql_priv.h" +#include "slave.h" #include "sql_acl.h" #include "lex_symbol.h" #include <myisam.h> @@ -408,6 +409,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token SQL_AUTO_IS_NULL %token SQL_SAFE_UPDATES %token SQL_QUOTE_SHOW_CREATE +%token SQL_SLAVE_SKIP_COUNTER %left SET_VAR %left OR_OR_CONCAT OR @@ -2662,6 +2664,15 @@ option_value: if (item->fix_fields(current_thd,0) || item->update()) YYABORT; } + | SQL_SLAVE_SKIP_COUNTER equal ULONG_NUM + { + pthread_mutex_lock(&LOCK_slave); + if(slave_running) + send_error(¤t_thd->net, ER_SLAVE_MUST_STOP); + else + slave_skip_counter = $3; + pthread_mutex_unlock(&LOCK_slave); + } text_or_password: TEXT_STRING { $$=$1.str;} |