[MDEV-6957] SET STATEMENT skip_replication = .. makes the binary log non-replayable Created: 2014-10-27  Updated: 2015-02-02  Resolved: 2014-10-29

Status: Closed
Project: MariaDB Server
Component/s: Admin statements
Affects Version/s: N/A
Fix Version/s: 10.1.2

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Oleksandr Byelkin
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Relates
relates to MDEV-5231 Per query variables from Percona Serv... Closed
relates to MDEV-6923 Testing for SET STATEMENT .. FOR (MDE... Closed

 Description   

The variable skip_replication has two important properties:

  • it's written into the binary log;
  • it cannot be changed inside a transaction.

SET STATEMENT recognizes the latter and does not allow to change it inside the transaction.
However, when it's applied outside a transaction, it works and is written into the binary log. But look how it looks in there:

MariaDB [test]> set statement skip_replication=1 for insert into t1 values (1);
Query OK, 1 row affected (0.11 sec)
 
MariaDB [test]> set statement skip_replication=1 for insert into t1 values (2);
Query OK, 1 row affected (0.03 sec)

# at 2252
#141028  0:54:26 server id 1  end_log_pos 2290  GTID 1-1-10
/*!100001 SET @@session.gtid_seq_no=10*//*!*/;
BEGIN
/*!*/;
# at 2290
/*!50521 SET skip_replication=1*//*!*/;
#141028  0:54:26 server id 1  end_log_pos 2415  Query   thread_id=37    exec_time=0     error_code=0
SET TIMESTAMP=1414443266/*!*/;
set statement skip_replication=1 for insert into t1 values (1)
/*!*/;
# at 2415
/*!50521 SET skip_replication=0*//*!*/;
#141028  0:54:26 server id 1  end_log_pos 2442  Xid = 921
COMMIT/*!*/;
# at 2442
#141028  0:54:28 server id 1  end_log_pos 2480  GTID 1-1-11
/*!100001 SET @@session.gtid_seq_no=11*//*!*/;
BEGIN
/*!*/;
# at 2480
/*!50521 SET skip_replication=1*//*!*/;
#141028  0:54:28 server id 1  end_log_pos 2605  Query   thread_id=37    exec_time=0     error_code=0
SET TIMESTAMP=1414443268/*!*/;
set statement skip_replication=1 for insert into t1 values (2)
/*!*/;
# at 2605
/*!50521 SET skip_replication=0*//*!*/;
#141028  0:54:28 server id 1  end_log_pos 2632  Xid = 922
COMMIT/*!*/;

That is, it is written after BEGIN and before COMMIT, hence inside a transaction. So, when the binlog is replayed, the replaying server chokes on it.

ERROR 1929 (HY000) at line 66: Cannot modify @@session.skip_replication inside a transaction

It does not seem to affect replication – somehow it magically works. But when the binlog is used as a backup, it's a problem.

Compare with how it's written in case of a "normal" SET:

MariaDB [test]> set skip_replication=1;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [test]>  insert into t1 values (3);
Query OK, 1 row affected (0.15 sec)
 
MariaDB [test]>  insert into t1 values (4);
Query OK, 1 row affected (0.25 sec)
 
MariaDB [test]> set skip_replication=0;
Query OK, 0 rows affected (0.01 sec)
 
MariaDB [test]>  insert into t1 values (5);
Query OK, 1 row affected (0.16 sec)

# at 2632
/*!50521 SET skip_replication=1*//*!*/;
#141028  0:58:37 server id 1  end_log_pos 2670  GTID 1-1-12
/*!100001 SET @@session.gtid_seq_no=12*//*!*/;
BEGIN
/*!*/;
# at 2670
#141028  0:58:37 server id 1  end_log_pos 2758  Query   thread_id=37    exec_time=0     error_code=0
SET TIMESTAMP=1414443517/*!*/;
insert into t1 values (3)
/*!*/;
# at 2758
#141028  0:58:37 server id 1  end_log_pos 2785  Xid = 924
COMMIT/*!*/;
# at 2785
#141028  0:58:39 server id 1  end_log_pos 2823  GTID 1-1-13
/*!100001 SET @@session.gtid_seq_no=13*//*!*/;
BEGIN
/*!*/;
# at 2823
#141028  0:58:39 server id 1  end_log_pos 2911  Query   thread_id=37    exec_time=0     error_code=0
SET TIMESTAMP=1414443519/*!*/;
insert into t1 values (4)
/*!*/;
# at 2911
#141028  0:58:39 server id 1  end_log_pos 2938  Xid = 925
COMMIT/*!*/;
# at 2938
/*!50521 SET skip_replication=0*//*!*/;
#141028  0:59:29 server id 1  end_log_pos 2976  GTID 1-1-14
/*!100001 SET @@session.gtid_seq_no=14*//*!*/;
BEGIN
/*!*/;
# at 2976
#141028  0:59:29 server id 1  end_log_pos 3064  Query   thread_id=37    exec_time=0     error_code=0
SET TIMESTAMP=1414443569/*!*/;
insert into t1 values (5)
/*!*/;
# at 3064
#141028  0:59:29 server id 1  end_log_pos 3091  Xid = 927
COMMIT/*!*/;

commit e64f5d8f758bcc1a8856ba9fba01780533f80747
Author: Oleksandr Byelkin <sanja@mariadb.com>
Date:   Sun Oct 26 16:27:54 2014 +0100
 
    Fixed test suite global variable saving

Percona server does not have the variable, so nothing to compare with.



 Comments   
Comment by Oleksandr Byelkin [ 2014-10-29 ]

The variable is prohibited in SET STATEMENT for now.

Generated at Thu Feb 08 07:15:52 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.