polardbxengine/mysql-test/suite/ndb/t/ndb_alter_table_online2.test

232 lines
6.0 KiB
Plaintext

#############################################################
# Author: Tomas
# Date: 2007-09
# Purpose: online alter under load test
##############################################################
# Change Author: Jonathan
# Date 2007-10
# Purpose: Add testing for online alter w/partitions
# and some original test cleanup and additions
##############################################################
-- source include/have_multi_ndb.inc
# mysqlslap seems to be not_windows. remove this when removed from mysqlslap.test
-- source include/not_windows.inc
# -- source include/have_log_bin.inc
connection default;
# This test is really a walking race-condition...
# and valgrind in PB2..."normally" gets timeout...
# so ignore this test in valgrind
# In CluB it actually more frequently fails in gcc-madness, not sure why
# (same timeout)
-- source include/not_valgrind.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
CREATE DATABASE IF NOT EXISTS mysqlslap;
--enable_warnings
# Create utiltity table used to hold the output from ndb_show_table
CREATE TEMPORARY TABLE IF NOT EXISTS ndb_show_tables_results (
id INT,
type VARCHAR(20),
state VARCHAR(20),
logging VARCHAR(20),
_database VARCHAR(255),
_schema VARCHAR(20),
name VARCHAR(255)
);
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ basic online alter test during load
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
create table t1 (pk int key, a int) engine ndb;
insert into t1 values (1,0);
--source ndb_show_tables_result.inc
set @t1_id = (select id from ndb_show_tables_results where name like '%t1%' and type like '%UserTable%');
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Starting mysqlslap
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
let $end_mysqlslap= 2000;
--exec $MYSQL_SLAP --query="update test.t1 set a=a+1 where pk=1; select sleep(0.01);" -i $end_mysqlslap >> $NDB_TOOLS_OUTPUT &
# wait for 100 updates
--disable_result_log
--disable_query_log
select @end:=100;
let $val= 1;
while ($val)
{
--sleep 0.1
select @val:=a from t1 where pk=1;
let $val= `select @end > @val `;
}
--enable_result_log
--enable_query_log
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Alter table t1 add column b
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
# add a column online
ALTER TABLE t1 algorithm=inplace, ADD b INT;
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Check table t1 ID has not changed
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
--source ndb_show_tables_result.inc
select name from ndb_show_tables_results where id = @t1_id and name like '%t1%' and type like '%UserTable%';
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Starting mysqlslap using column b
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
update t1 set b = 0 where pk = 1;
--exec $MYSQL_SLAP --query="update test.t1 set b=b+1 where pk=1; select sleep(0.01);" -i $end_mysqlslap >> $NDB_TOOLS_OUTPUT &
# wait for 100 updates
--disable_result_log
--disable_query_log
select @end:=100;
let $val= 1;
while ($val)
{
--sleep 0.1
select @val:=b from t1 where pk=1;
let $val= `select @end > @val`;
}
--enable_result_log
--enable_query_log
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Alter table t1 add column c
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
# add a column online
ALTER TABLE t1 algorithm=inplace, ADD c INT;
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Check table t1 ID has not changed
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
--source ndb_show_tables_result.inc
select name from ndb_show_tables_results where id = @t1_id and name like '%t1%' and type like '%UserTable%';
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Starting mysqlslap using column c
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
update t1 set c = 0 where pk = 1;
--exec $MYSQL_SLAP --query="update test.t1 set c=c+1 where pk=1; select sleep(0.01);" -i $end_mysqlslap >> $NDB_TOOLS_OUTPUT &
# wait for mysqlslap to end
--disable_result_log
--disable_query_log
--eval select @end:=$end_mysqlslap
let $val= 1;
# 10 minutes = 600s sleep 0.1 => 6000
let $maxwait = 6000;
while ($val)
{
--sleep 0.1
select @val1:=a,@val2:=b,@val3:=c from t1 where pk=1;
let $val= `select @end > @val1 || @end > @val2 || @end > @val3`;
dec $maxwait;
if (!$maxwait)
{
let $val = 0;
}
}
--enable_result_log
--enable_query_log
select * from t1;
--echo
--echo BUG#17400320 algorithm= is not supported for ALTER TABLE with <partition_options>
--echo - thus disabling parts of this test
if (0)
{
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Alter table t1 and try to add partitions
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
--error ER_ALTER_OPERATION_NOT_SUPPORTED
ALTER TABLE t1 algorithm=inplace, PARTITION BY HASH(pk);
}
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ Check table t1 ID has not changed
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
--source ndb_show_tables_result.inc
select name from ndb_show_tables_results where id = @t1_id and name like '%t1%' and type like '%UserTable%';
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ test that aborted online alter rollback DDL transaction
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
connect (con1,localhost,root,,test);
--echo # Connection default
connection default;
START TRANSACTION;
SELECT * FROM t1;
--echo # Connection con1
--connection con1
SET lock_wait_timeout=1;
--error ER_LOCK_WAIT_TIMEOUT
ALTER TABLE t1 algorithm=inplace, ADD d INT;
--error ER_LOCK_WAIT_TIMEOUT
ALTER TABLE t1 algorithm=inplace, ADD d INT;
SELECT * FROM t1;
connection default;
COMMIT;
--source ndb_show_tables_result.inc
select name from ndb_show_tables_results where id = @t1_id and name like '%t1%' and type like '%UserTable%';
--echo
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo ~ cleanup section
--echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--echo
# drop the table
drop table t1, ndb_show_tables_results;
drop database mysqlslap;
--remove_file $NDB_TOOLS_OUTPUT