mariadb/mysql-test/suite/multi_source/reset_slave.test
Monty 6aa9a552c2 MDEV-24576 Atomic CREATE TABLE
There are a few different cases to consider

Logging of CREATE TABLE and CREATE TABLE ... LIKE
- If REPLACE is used and there was an existing table, DDL log the drop of
  the table.
- If discovery of table is to be done
    - DDL LOG create table
  else
    - DDL log create table (with engine type)
    - create the table
- If table was created
  - Log entry to binary log with xid
  - Mark DDL log completed

Crash recovery:
- If query was in binary log do nothing and exit
- If discoverted table
   - Delete the .frm file
-else
   - Drop created table and frm file
- If table was dropped, write a DROP TABLE statement in binary log

CREATE TABLE ... SELECT required a little more work as when one is using
statement logging the query is written to the binary log before commit is
done.
This was fixed by adding a DROP TABLE to the binary log during crash
recovery if the ddl log entry was not closed. In this case the binary log
will contain:
CREATE TABLE xxx ... SELECT ....
DROP TABLE xxx;

Other things:
- Added debug_crash_here() functionality to Aria to be able to test
  crash in create table between the creation of the .MAI and the .MAD files.
2021-05-19 22:54:13 +02:00

74 lines
1.7 KiB
Text

#
# Check RESET SLAVE [name] [ALL] for multi-source replication
#
--source include/not_embedded.inc
--source include/binlog_start_pos.inc
--let $rpl_server_count= 0
--connect (slave,127.0.0.1,root,,,$SERVER_MYPORT_3)
--replace_result $SERVER_MYPORT_1 MYPORT_1
eval change master 'master1' to
master_port=$SERVER_MYPORT_1,
master_host='127.0.0.1',
master_user='root';
start slave 'master1';
set default_master_connection = 'master1';
--source include/wait_for_slave_to_start.inc
--connect (master1,127.0.0.1,root,,,$SERVER_MYPORT_1)
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 (i int) engine=MyISAM;
insert into t1 values (1),(2);
--save_master_pos
--connection slave
--sync_with_master 0,'master1'
stop slave 'master1';
--wait_for_slave_to_stop
--let $datadir = `SELECT @@datadir`
let read_master_log_pos=`select $binlog_start_pos + 608`;
let relay_log_pos=`select 2*$binlog_start_pos + 652`;
let relay_log_space=`select 3*$binlog_start_pos + 714`;
--replace_result $SERVER_MYPORT_1 MYPORT_1 $read_master_log_pos <read_master_log_pos> $relay_log_pos <relay_log_pos> $relay_log_space <relay_log_space>
show slave 'master1' status;
--list_files $datadir mysqld*
reset slave 'master1';
--replace_result $SERVER_MYPORT_1 MYPORT_1 $relay_log_pos <relay_log_pos> $relay_log_space <relay_log_space>
show slave 'master1' status;
--list_files $datadir mysqld*
reset slave 'master1' all;
--error WARN_NO_MASTER_INFO
show slave 'master1' status;
--list_files $datadir mysqld*
# Cleanup
drop table t1;
--source include/reset_master_slave.inc
--disconnect slave
--connection master1
drop table t1;
--source include/reset_master_slave.inc
--disconnect master1