# # Currently this test only runs in the source tree with the # ndb/test programs compiled. # invoke with: ./mysql-test-run --ndb-extra-test --do-test=rpl_ndb_bank # # 1. start a "bank" application running on the master cluster # 2. perform online sync of slave # 3. periodically check consistency of slave # 4. stop the bank application # 5. check that the slave and master BANK databases are the same # --source include/have_ndb.inc --source include/have_ndb_extra.inc --source include/have_binlog_format_mixed_or_row.inc --source include/ndb_master-slave.inc # kill any trailing processes --system killall lt-bankTransactionMaker lt-bankTimer lt-bankMakeGL || true --disable_warnings # initialize master --connection master CREATE DATABASE IF NOT EXISTS BANK; DROP DATABASE BANK; CREATE DATABASE BANK default charset=latin1 default collate=latin1_bin; --enable_warnings # # These tables should correspond to the table definitions in # storage/ndb/test/src/NDBT_Tables.cpp # --connection master USE BANK; CREATE TABLE GL ( TIME BIGINT UNSIGNED NOT NULL, ACCOUNT_TYPE INT UNSIGNED NOT NULL, BALANCE INT UNSIGNED NOT NULL, DEPOSIT_COUNT INT UNSIGNED NOT NULL, DEPOSIT_SUM INT UNSIGNED NOT NULL, WITHDRAWAL_COUNT INT UNSIGNED NOT NULL, WITHDRAWAL_SUM INT UNSIGNED NOT NULL, PURGED INT UNSIGNED NOT NULL, PRIMARY KEY USING HASH (TIME,ACCOUNT_TYPE)) ENGINE = NDB; CREATE TABLE ACCOUNT ( ACCOUNT_ID INT UNSIGNED NOT NULL, OWNER INT UNSIGNED NOT NULL, BALANCE INT UNSIGNED NOT NULL, ACCOUNT_TYPE INT UNSIGNED NOT NULL, PRIMARY KEY USING HASH (ACCOUNT_ID)) ENGINE = NDB; CREATE TABLE TRANSACTION ( TRANSACTION_ID BIGINT UNSIGNED NOT NULL, ACCOUNT INT UNSIGNED NOT NULL, ACCOUNT_TYPE INT UNSIGNED NOT NULL, OTHER_ACCOUNT INT UNSIGNED NOT NULL, TRANSACTION_TYPE INT UNSIGNED NOT NULL, TIME BIGINT UNSIGNED NOT NULL, AMOUNT INT UNSIGNED NOT NULL, PRIMARY KEY USING HASH (TRANSACTION_ID,ACCOUNT)) ENGINE = NDB; CREATE TABLE SYSTEM_VALUES ( SYSTEM_VALUES_ID INT UNSIGNED NOT NULL, VALUE BIGINT UNSIGNED NOT NULL, PRIMARY KEY USING HASH (SYSTEM_VALUES_ID)) ENGINE = NDB; CREATE TABLE ACCOUNT_TYPE ( ACCOUNT_TYPE_ID INT UNSIGNED NOT NULL, DESCRIPTION CHAR(64) NOT NULL, PRIMARY KEY USING HASH (ACCOUNT_TYPE_ID)) ENGINE = NDB; # # create "BANK" application # --exec NDB_CONNECTSTRING=$NDB_CONNECTSTRING ../storage/ndb/test/ndbapi/bank/bankCreator >> $NDB_TOOLS_OUTPUT # # start main loop # repeat backup-restore-check # # set this high if testing to run many syncs in loop --let $2=1 while ($2) { # # start "BANK" application # --exec NDB_CONNECTSTRING=$NDB_CONNECTSTRING ../storage/ndb/test/ndbapi/bank/bankTimer -w 5 >> $NDB_TOOLS_OUTPUT & --exec NDB_CONNECTSTRING=$NDB_CONNECTSTRING ../storage/ndb/test/ndbapi/bank/bankMakeGL >> $NDB_TOOLS_OUTPUT & --exec NDB_CONNECTSTRING=$NDB_CONNECTSTRING ../storage/ndb/test/ndbapi/bank/bankTransactionMaker >> $NDB_TOOLS_OUTPUT & # # let the "BANK" run for a while # --sleep 5 --disable_warnings # initialize slave for sync --connection slave STOP SLAVE; RESET SLAVE; # to make sure we drop any ndbcluster tables CREATE DATABASE IF NOT EXISTS BANK; DROP DATABASE BANK; # create database CREATE DATABASE BANK; --enable_warnings # # Time to sync the slave: # start by taking a backup on master --connection master RESET MASTER; --exec $NDB_MGM --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" -e "start backup" >> $NDB_TOOLS_OUTPUT # there is no neat way to find the backupid, this is a hack to find it... --exec $NDB_TOOLS_DIR/ndb_select_all --ndb-connectstring="$NDB_CONNECTSTRING" -d sys --delimiter=',' SYSTAB_0 | grep 520093696 > $MYSQLTEST_VARDIR/tmp.dat CREATE TABLE IF NOT EXISTS mysql.backup_info (id INT, backup_id INT) ENGINE = HEAP; DELETE FROM mysql.backup_info; LOAD DATA INFILE '../tmp.dat' INTO TABLE mysql.backup_info FIELDS TERMINATED BY ','; --exec rm $MYSQLTEST_VARDIR/tmp.dat || true --replace_column 1 <the_backup_id> SELECT @the_backup_id:=backup_id FROM mysql.backup_info; let the_backup_id=`select @the_backup_id`; # restore on slave, first check that nothing is there --connection slave --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING_SLAVE" -p 8 -b $the_backup_id -n 1 -m -r --print --print_meta $NDB_BACKUP_DIR/BACKUP/BACKUP-$the_backup_id >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_restore --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING_SLAVE" -p 8 -b $the_backup_id -n 2 -r -e --print --print_meta $NDB_BACKUP_DIR/BACKUP/BACKUP-$the_backup_id >> $NDB_TOOLS_OUTPUT # # now setup replication to continue from last epoch --source include/ndb_setup_slave.inc --connection slave START SLAVE; # # Now loop and check consistency every 2 seconds on slave # --connection slave --let $1=10 while ($1) { --sleep 2 --replace_result $MASTER_MYPORT MASTER_PORT --replace_column 1 <Slave_IO_State> 7 <Read_Master_Log_Pos> 8 <Relay_Log_File> 9 <Relay_Log_Pos> 16 <Replicate_Ignore_Table> 22 <Exec_Master_Log_Pos> 23 <Relay_Log_Space> 33 <Seconds_Behind_Master> 34 <Last_IO_Errno> 35 <Last_IO_Error> SHOW SLAVE STATUS; STOP SLAVE; --exec NDB_CONNECTSTRING=$NDB_CONNECTSTRING_SLAVE ../storage/ndb/test/ndbapi/bank/bankValidateAllGLs >> $NDB_TOOLS_OUTPUT START SLAVE; --dec $1 } # # Stop transactions # --exec killall lt-bankTransactionMaker lt-bankTimer lt-bankMakeGL # # Check that the databases are the same on slave and master # 1. dump database BANK on both master and slave # 2. compare, there should be no difference # --exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info BANK ACCOUNT_TYPE ACCOUNT GL TRANSACTION > $MYSQLTEST_VARDIR/tmp/master_BANK.sql --connection master use test; create table t1 (a int primary key) engine=ndb; insert into t1 values (1); --sync_slave_with_master --exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info BANK ACCOUNT_TYPE ACCOUNT GL TRANSACTION > $MYSQLTEST_VARDIR/tmp/slave_BANK.sql --connection master drop table t1; diff_files $MYSQLTEST_VARDIR/tmp/master_BANK.sql $MYSQLTEST_VARDIR/tmp/slave_BANK.sql; --dec $2 }