-- source include/have_ndb.inc -- source include/have_binlog_format_mixed_or_row.inc # # basic insert, update, delete test, alter, rename, drop # check that ndb_binlog_index gets the right info # reset master; create table t1 (a int primary key) engine=ndb; insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); save_master_pos; --replace_column 1 # select @max_epoch:=max(epoch)-1 from mysql.ndb_binlog_index; delete from t1; alter table t1 add (b_x int); alter table t1 algorithm=inplace, rename column b_x to b; --source include/show_binlog_events.inc insert into t1 values (3,3),(4,4); alter table t1 rename t2; # get all in one epoch begin; insert into t2 values (1,1),(2,2); update t2 set b=1 where a=3; delete from t2 where a=4; commit; drop table t2; # check that above is ok # (save_master_pos waits for last gcp to complete, ensuring that we have # the expected data in the binlog) save_master_pos; select inserts from mysql.ndb_binlog_index where epoch > @max_epoch and inserts > 5; select deletes from mysql.ndb_binlog_index where epoch > @max_epoch and deletes > 5; select inserts,updates,deletes from mysql.ndb_binlog_index where epoch > @max_epoch and updates > 0; # # check that purge clears the ndb_binlog_index # flush logs; --sleep 1 # Fix windows dir separators in file name of the warning --replace_regex /\.[\\\/]binlog/.\/binlog/; purge master logs before now(); select count(*) from mysql.ndb_binlog_index; # # several tables in different databases # check that same table name in different databases don't mix up # create table t1 (a int primary key, b int) engine=ndb; create database mysqltest; use mysqltest; create table t1 (c int, d int primary key) engine=ndb; use test; insert into mysqltest.t1 values (2,1),(2,2); save_master_pos; --replace_column 1 # select @max_epoch:=max(epoch)-1 from mysql.ndb_binlog_index; drop table t1; drop database mysqltest; select inserts,updates,deletes from mysql.ndb_binlog_index where epoch > @max_epoch and inserts > 0; # # Check optimize table does not send any event to binlog # create table t1 (c1 int not null primary key, c2 blob default null) engine=ndbcluster default charset=latin1; insert into t1 values (1, null), (2, null), (3, null), (4, null); insert into t1 select c1+4,c2 from t1; insert into t1 select c1+8,c2 from t1; insert into t1 select c1+16,c2 from t1; insert into t1 select c1+32,c2 from t1; insert into t1 select c1+64,c2 from t1; insert into t1 select c1+128,c2 from t1; insert into t1 select c1+256,c2 from t1; insert into t1 select c1+512,c2 from t1; # wait for last gcp to complete, ensuring that we have # the expected data in the binlog save_master_pos; let $before = `select count(*) from mysql.ndb_binlog_index where epoch > @max_epoch and (inserts > 0 or updates > 0 or deletes > 0)`; optimize table t1; save_master_pos; # Ensure that optimize have not sent any event to binlog let $optimize_diff = `select count(*) <> $before from mysql.ndb_binlog_index where epoch > @max_epoch and (inserts > 0 or updates > 0 or deletes > 0)`; if ($optimize_diff) { die Optimize table should not send any events to binlog; } drop table t1; # # Make binlog to ignore an empty blob column update # having before- and after-values 'null' # when performed in a separate epoch and # empty epochs are not logged. # Run the test twice, with ndb_log_empty_epochs ON and OFF. # let $repetitions=2; SET GLOBAL ndb_log_empty_epochs=ON; while ($repetitions) { SHOW VARIABLES LIKE 'ndb_log_empty_epochs'; create table t1 (c1 int not null primary key, c2 blob default null) engine=ndbcluster default charset=latin1; insert into t1 values (1, null); # Avoid the following update being performed within the same epoch by # synchronising with Binlog --disable_result_log show binlog events; --enable_result_log update t1 set c2=null; select * from t1; --disable_result_log show binlog events; --enable_result_log optimize table t1; select * from t1; drop table t1; create table t1 (c1 int not null primary key, c2 varchar(1024) default null) engine=ndbcluster default charset=latin1; insert into t1 values (3, null); select * from t1; --disable_result_log show binlog events; --enable_result_log optimize table t1; select * from t1; drop table t1; # Repeat the test with SET GLOBAL ndb_log_empty_epochs=OFF; --disable_result_log show binlog events; --enable_result_log dec $repetitions; }