mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
bd6c4ef400
We introduce a new function mysql_test_parse_for_slave(). If the slave sees that the query got a really bad error on master (killed e.g.), then it calls this function to know if this query can be ignored because of replicate-*-table rules (do not worry about replicate-*-db rules: they are checked so early that they have no bug). If the answer is yes, it skips the query and continues. If it's no, then it stops and say "fix your slave data manually" (like it did before this change). mysql-test/r/rpl_error_ignored_table.result: result update mysql-test/t/rpl_error_ignored_table-slave.opt: ignore more tables mysql-test/t/rpl_error_ignored_table.test: we test if a killed query on the master, is ignored on the slave if the tables it involves should be excluded because of replicate-*-table rules. sql/log_event.cc: If the query got a really bad error on the master (thread killed etc), parse it to test the table names: if the replicate-*-do|ignore-table rules say "this query must be ignored" then we exit gracefully; otherwise we warn about the bad error and tell DBA to check/fix it. Before this change, we always warned and stopped. sql/mysql_priv.h: new function sql/slave.cc: don't print error immediately as we need to do one more test to be sure. sql/sql_parse.cc: we add a function mysql_test_parse_for_slave(), to be used only by the slave if it wants to know if the query should be ignored or not; so this function only parses the query, does not execute it.
40 lines
1.8 KiB
Text
40 lines
1.8 KiB
Text
slave stop;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
reset master;
|
|
reset slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
slave start;
|
|
create table t1 (a int primary key);
|
|
insert into t1 values (1),(1);
|
|
Duplicate entry '1' for key 1
|
|
show slave status;
|
|
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
|
127.0.0.1 root MASTER_PORT 1 master-bin.001 213 slave-relay-bin.002 254 master-bin.001 Yes Yes 0 0 213 254
|
|
show tables like 't1';
|
|
Tables_in_test (t1)
|
|
drop table t1;
|
|
select get_lock('crash_lock%20C', 10);
|
|
get_lock('crash_lock%20C', 10)
|
|
1
|
|
create table t2 (a int primary key);
|
|
insert into t2 values(1);
|
|
create table t3 (id int);
|
|
insert into t3 values(connection_id());
|
|
update t2 set a = a + 1 + get_lock('crash_lock%20C', 10);
|
|
select (@id := id) - id from t3;
|
|
(@id := id) - id
|
|
0
|
|
kill @id;
|
|
drop table t2,t3;
|
|
Server shutdown in progress
|
|
show binlog events from 79;
|
|
Log_name Pos Event_type Server_id Orig_log_pos Info
|
|
master-bin.001 79 Query 1 79 use `test`; create table t1 (a int primary key)
|
|
master-bin.001 149 Query 1 149 use `test`; insert into t1 values (1),(1)
|
|
master-bin.001 213 Query 1 213 use `test`; drop table t1
|
|
master-bin.001 261 Query 1 261 use `test`; create table t2 (a int primary key)
|
|
master-bin.001 331 Query 1 331 use `test`; insert into t2 values(1)
|
|
master-bin.001 390 Query 1 390 use `test`; create table t3 (id int)
|
|
master-bin.001 449 Query 1 449 use `test`; insert into t3 values(connection_id())
|
|
master-bin.001 522 Query 1 522 use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10)
|
|
master-bin.001 613 Query 1 613 use `test`; drop table t2,t3
|