129 lines
3.7 KiB
Plaintext
129 lines
3.7 KiB
Plaintext
--source include/have_ndb.inc
|
|
--source include/have_log_bin.inc
|
|
--source include/have_debug.inc
|
|
|
|
# Bug#35217 Strange ndb_binlog_index error inserting rows in MyISAM table
|
|
# Verify that mysql.ndb_binlog_index is getting unique epoch values
|
|
# Do this by dropping the PK, inserting some data and checking
|
|
# uniqueness
|
|
#
|
|
alter table mysql.ndb_binlog_index drop primary key;
|
|
|
|
use test;
|
|
|
|
create table t1 (a int) engine=ndb;
|
|
|
|
delimiter %;
|
|
create procedure ins (`rows` int)
|
|
begin
|
|
set @x = 0;
|
|
repeat
|
|
insert into t1 values (1);
|
|
set @x = @x + 1;
|
|
until @x = `rows`
|
|
end repeat;
|
|
end%
|
|
|
|
delimiter ;%
|
|
|
|
call ins(10000);
|
|
|
|
# Did any of the epochs have > 1 entry?
|
|
# (Answer should be no !)
|
|
--echo Duplicate epochs according to mysql.ndb_binlog_index
|
|
select epoch >> 32 as gci,
|
|
(epoch << 32) >> 32 as ugci,
|
|
sum(1) as count
|
|
from mysql.ndb_binlog_index
|
|
group by epoch
|
|
having count > 1;
|
|
|
|
# Now look at what's in the Binlog events themselves, in case they also
|
|
# carry duplicate epochs
|
|
#
|
|
# Code here similar to ndb_binlog_get_binlog_stmts.inc
|
|
#
|
|
--disable_query_log
|
|
let $MYSQLD_DATADIR= `select @@datadir;`;
|
|
--exec $MYSQL_BINLOG --verbose $MYSQLD_DATADIR/binlog.000001 > $MYSQLTEST_VARDIR/tmp/ndb_binlog_mysqlbinlog.sql
|
|
|
|
create table raw_binlog_rows (txt varchar(1000));
|
|
|
|
--eval load data local infile '$MYSQLTEST_VARDIR/tmp/ndb_binlog_mysqlbinlog.sql' into table raw_binlog_rows columns terminated by '\n';
|
|
|
|
create table binlog_stmt_parts_unassoc (txt varchar(1000), line_count int, stmt_boundary int);
|
|
|
|
set @line_count=0;
|
|
set @stmt_boundary=0;
|
|
|
|
# Use replace() here to get rid of any unwanted Windows
|
|
# CRs
|
|
insert into binlog_stmt_parts_unassoc
|
|
select replace(txt, '\r', ''),
|
|
@line_count:= @line_count + 1, # So we can preserve order later
|
|
(txt like '%INSERT%' or # Identify statement boundaries
|
|
txt like '%UPDATE%' or
|
|
txt like '%DELETE%')
|
|
from raw_binlog_rows
|
|
where
|
|
txt like '###%'; # Discard non verbose output
|
|
|
|
create table binlog_stmt_parts_assoc (txt varchar(1000), line_count int, stmt_num int);
|
|
|
|
set @stmt_count = 0;
|
|
|
|
insert into binlog_stmt_parts_assoc
|
|
select txt,
|
|
line_count,
|
|
@stmt_count:= @stmt_count + stmt_boundary # All rows from same stmt will
|
|
# have same stmt_num
|
|
from binlog_stmt_parts_unassoc order by line_count;
|
|
|
|
create table binlog_stmts (txt varchar(1000), stmt_num int);
|
|
|
|
insert into binlog_stmts
|
|
select group_concat(right(txt, # Combine rows in statment into 1
|
|
length(txt) - 4) # Trim ### from line start
|
|
order by line_count
|
|
separator ' '), stmt_num
|
|
from binlog_stmt_parts_assoc
|
|
group by stmt_num;
|
|
|
|
|
|
create table epochs_in_binlog (epoch bigint);
|
|
|
|
# Trim INSERT INTO mysql.ndb_apply_status SET @1=1 @2=144115213845659648 @3='' @4=0 @5=0
|
|
# down to a list of epochs
|
|
#
|
|
insert into epochs_in_binlog
|
|
select substring_index(right(txt, length(txt) - instr(txt, '@2=') - 3),' ', 1)
|
|
from binlog_stmts
|
|
where txt like '%ndb_apply_status%'
|
|
order by txt;
|
|
|
|
--enable_query_log
|
|
--echo Duplicate epochs according to MySQLD Binlog entries
|
|
select epoch >> 32 as gci,
|
|
(epoch << 32) >> 32 as ugci,
|
|
sum(1) as count
|
|
from epochs_in_binlog
|
|
group by epoch
|
|
having count > 1;
|
|
|
|
--disable_query_log
|
|
drop table raw_binlog_rows;
|
|
drop table binlog_stmt_parts_unassoc;
|
|
drop table binlog_stmt_parts_assoc;
|
|
drop table binlog_stmts;
|
|
drop table epochs_in_binlog;
|
|
--enable_query_log
|
|
|
|
# Now cleanup
|
|
|
|
reset master;
|
|
alter table mysql.ndb_binlog_index add primary key (epoch, orig_server_id, orig_epoch);
|
|
|
|
drop procedure ins;
|
|
drop table t1;
|
|
--remove_file $MYSQLTEST_VARDIR/tmp/ndb_binlog_mysqlbinlog.sql
|