# # MDEV-17863 DROP TEMPORARY TABLE creates a transaction in # binary log on read only server # MDEV-19074 Improved read_only mode for slaves with # gtid_strict_mode enabled # create user test@localhost; grant CREATE TEMPORARY TABLES, DROP, INSERT, SELECT on *.* to test@localhost; create table t1 (a int) engine=myisam; insert into t1 values (1),(2); reset master; set global read_only=1; # Ensure that optimize and analyze doesn't log to binary log connect con1,localhost,test,,test; insert into t1 values(3); ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement analyze table t1; Table Op Msg_type Msg_text test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK check table t1; Table Op Msg_type Msg_text test.t1 check status OK repair table t1; Table Op Msg_type Msg_text test.t1 repair Error The MariaDB server is running with the --read-only option so it cannot execute this statement test.t1 repair error Corrupt optimize table t1; ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement # Ensure that using temporary tables is not logged create temporary table tmp1 (a int) engine=myisam; insert into tmp1 values (1),(2); update tmp1 set a=10 where a=2; delete from tmp1 where a=1; create temporary table tmp2 select * from t1; select * from tmp1; a 10 select * from tmp2; a 1 2 create temporary table tmp3 like t1; create or replace temporary table tmp3 like t1; alter table tmp2 add column (b int); select * from tmp2; a b 1 NULL 2 NULL insert into t1 select a+100 from tmp2; ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement drop table tmp1,tmp2,tmp3; # Clean up test connection disconnect con1; connection default; # Execute some commands as root that should not be logged optimize table t1; Table Op Msg_type Msg_text test.t1 optimize status Table is already up to date repair table t1; Table Op Msg_type Msg_text test.t1 repair status OK # Changes to temporary tables created under readonly should not # be logged create temporary table tmp4 (a int) engine=myisam; insert into tmp4 values (1),(2); create temporary table tmp5 (a int) engine=myisam; insert into tmp5 select * from tmp4; alter table tmp5 add column (b int); set global read_only=0; insert into tmp4 values (3),(4); insert into tmp5 values (10,3),(11,4); select * from tmp4; a 1 2 3 4 select * from tmp5; a b 1 NULL 2 NULL 10 3 11 4 update tmp4 set a=10 where a=2; delete from tmp4 where a=1; create table t2 select * from tmp4; alter table tmp5 add column (c int); insert into tmp5 values (20,5,1),(21,5,2); select * from tmp5; a b c 1 NULL NULL 2 NULL NULL 10 3 NULL 11 4 NULL 20 5 1 21 5 2 insert into t1 select a+200 from tmp5; select * from t1; a 1 2 201 202 210 211 220 221 drop table tmp4,tmp5; # Check what is logged. Only last create select and the insert...select's should be # row-logged include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) master-bin.000001 # Annotate_rows # # create table t2 select * from tmp4 master-bin.000001 # Table_map # # table_id: # (test.t2) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Annotate_rows # # insert into t1 select a+200 from tmp5 master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT # Clean up drop user test@localhost; drop table t1,t2;