254 lines
8.1 KiB
Plaintext
254 lines
8.1 KiB
Plaintext
--source setup.inc
|
|
|
|
# Test behaviour of schema distribution when there is "shadow table"
|
|
# in the dictionary, i.e a non NDB table with same name as the
|
|
# table in NDB.
|
|
#
|
|
# This is a feature of MySQL Cluster schema distribution which should be
|
|
# allowed, unfortunately it causes the DD on different MySQL Servers
|
|
# connected to the same cluster to be different but that is on purpose.
|
|
#
|
|
# For example, one MySQL Server may have table t1 in InnoDB while all
|
|
# the other MySQL Servers have table t1 in NDB. The MySQL Server having
|
|
# the table in InnoDB should simply ignore all distributed DDL operations
|
|
# and print a message to the MySQL Server log file
|
|
#
|
|
|
|
--connection mysqld1
|
|
|
|
# Create "shadow table" in other engine on first mysqld
|
|
create table ndb_ddl_test.shadow1 (
|
|
in_other_engine int primary key
|
|
) engine = InnoDB;
|
|
insert into ndb_ddl_test.shadow1 values(100);
|
|
|
|
# Supress errors provoked by the "shadow table" on first mysqld
|
|
--disable_query_log
|
|
call mtr.add_suppression("Local table .* shadows the NDB table");
|
|
call mtr.add_suppression("Failed to remove table definition");
|
|
call mtr.add_suppression("Failed to update table definition");
|
|
call mtr.add_suppression("Failed to rename table definition");
|
|
call mtr.add_suppression("Removing the renamed table");
|
|
call mtr.add_suppression("NDB: Distribution of CREATE TABLE");
|
|
call mtr.add_suppression("NDB: Distribution of TRUNCATE TABLE");
|
|
call mtr.add_suppression("NDB: Distribution of ALTER TABLE");
|
|
--enable_query_log
|
|
|
|
--connection mysqld2
|
|
|
|
# Check that table does not exist on second mysqld(as it was not
|
|
# created in NDB)
|
|
--error ER_NO_SUCH_TABLE
|
|
show create table ndb_ddl_test.shadow1;
|
|
|
|
# Create a table in NDB with same name as on first mysqld
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
create table ndb_ddl_test.shadow1 (
|
|
in_NDB_engine int primary key
|
|
) engine = NDB;
|
|
|
|
--connection mysqld1
|
|
|
|
# Check that table on first mysqld is still in other engine
|
|
select column_name from
|
|
information_schema.columns
|
|
where TABLE_SCHEMA = 'ndb_ddl_test' and TABLE_NAME = 'shadow1';
|
|
|
|
--connection mysqld2
|
|
|
|
# Truncate the NDB table, the truncate is implemented
|
|
# by "drop+create" so also now the shadow table on first mysqld should
|
|
# not be truncated
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
truncate table ndb_ddl_test.shadow1;
|
|
|
|
--connection mysqld1
|
|
|
|
# Check that table on first mysqld is still in other engine
|
|
select column_name from
|
|
information_schema.columns
|
|
where TABLE_SCHEMA = 'ndb_ddl_test' and TABLE_NAME = 'shadow1';
|
|
|
|
# Check that table on first mysqld still contains one row
|
|
select count(*) = 1 from ndb_ddl_test.shadow1;
|
|
|
|
--connection mysqld2
|
|
|
|
# Alter the NDB table with algorithm=copy, the shadow table on
|
|
# first mysqld should ignore the alter
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
alter table ndb_ddl_test.shadow1 algorithm=copy,
|
|
add column added_by_copying_alter int;
|
|
|
|
--connection mysqld1
|
|
|
|
# Check that table on first mysqld is still in other engine
|
|
# and have only one column
|
|
select column_name from
|
|
information_schema.columns
|
|
where TABLE_SCHEMA = 'ndb_ddl_test' and TABLE_NAME = 'shadow1';
|
|
|
|
--connection mysqld2
|
|
|
|
# Alter the NDB table with algorithm=inplace, the shadow table on
|
|
# first mysqld should ignore the alter
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
alter table ndb_ddl_test.shadow1 algorithm=inplace,
|
|
add column added_by_inplace_alter int default NULL column_format DYNAMIC;
|
|
|
|
--connection mysqld1
|
|
|
|
# Check that table on first mysqld is still in other engine
|
|
# and have only one column
|
|
select column_name from
|
|
information_schema.columns
|
|
where TABLE_SCHEMA = 'ndb_ddl_test' and TABLE_NAME = 'shadow1';
|
|
|
|
--connection mysqld2
|
|
|
|
# Drop the NDB table. Once again the first mysqld should
|
|
# ignore the drop
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
drop table ndb_ddl_test.shadow1;
|
|
|
|
|
|
# Test rename of table to same name as shadow table, the
|
|
# renamed table should be removed on on first mysqld and thus create
|
|
# a shadow table
|
|
rename table ndb_ddl_test.t1 to ndb_ddl_test.shadow1;
|
|
|
|
--connection mysqld1
|
|
|
|
# Check that shadow table on first mysqld is still in other engine
|
|
# and have only one column
|
|
select column_name from
|
|
information_schema.columns
|
|
where TABLE_SCHEMA = 'ndb_ddl_test' and TABLE_NAME = 'shadow1';
|
|
|
|
# Check that the NDB table on first mysqld has been removed from DD
|
|
select column_name from
|
|
information_schema.columns
|
|
where TABLE_SCHEMA = 'ndb_ddl_test' and TABLE_NAME = 't1';
|
|
|
|
# Create another "shadow table" in other engine on first mysqld
|
|
create table ndb_ddl_test.shadow2 (
|
|
in_other_engine int primary key
|
|
) engine = InnoDB;
|
|
insert into ndb_ddl_test.shadow2 values(100);
|
|
|
|
--connection mysqld2
|
|
|
|
# Rename the shadowed NDB table to the other shadowed table name.
|
|
# This should fail on the first mysqld
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
rename table ndb_ddl_test.shadow1 to ndb_ddl_test.shadow2;
|
|
|
|
# Rename the NDB table back to original name
|
|
rename table ndb_ddl_test.shadow2 to ndb_ddl_test.t1;
|
|
|
|
--connection mysqld1
|
|
|
|
# Check that table on first mysqld is still in other engine
|
|
select column_name from
|
|
information_schema.columns
|
|
where TABLE_SCHEMA = 'ndb_ddl_test' and TABLE_NAME = 'shadow1';
|
|
|
|
# Check that table on first mysqld still contains one row
|
|
select count(*) = 1 from ndb_ddl_test.shadow1;
|
|
|
|
# Drop the "shadow table" from other engine
|
|
drop table ndb_ddl_test.shadow1;
|
|
|
|
# Drop the second "shadow table" from other engine
|
|
drop table ndb_ddl_test.shadow2;
|
|
|
|
# Check that all mysqlds have identical DD
|
|
--source verify_mysql_dd.inc
|
|
|
|
|
|
# #######################################################
|
|
# Testing that also "drop database" is ignored if there
|
|
# are shadow table(s) in a database
|
|
# #######################################################
|
|
|
|
--connection mysqld1
|
|
# Create "shadow table" in other engine on first mysqld,
|
|
# using the second empty test database
|
|
create table ndb_ddl_test2.shadow_in_db (
|
|
in_other_engine int primary key
|
|
) engine = InnoDB;
|
|
|
|
--connection mysqld2
|
|
|
|
# Create a table in NDB in order to verify that it's dropped
|
|
# from first mysqld although the database is still there
|
|
create table ndb_ddl_test2.table_in_ndb (
|
|
in_NDB_engine int primary key
|
|
) engine = NDB;
|
|
|
|
# Check that table does not exist on second mysqld(as it was not
|
|
# created in NDB)
|
|
--error ER_NO_SUCH_TABLE
|
|
show create table ndb_ddl_test2.shadow_in_db;
|
|
|
|
# Drop the database on the second mysqld, the database should then be dropped
|
|
# on all mysqlds except the first
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
drop database ndb_ddl_test2;
|
|
|
|
# Check that the database does not exist on second mysqld
|
|
--error ER_BAD_DB_ERROR
|
|
use ndb_ddl_test2;
|
|
|
|
--connection mysqld1
|
|
|
|
# Check that the database still exist on first mysqld
|
|
use ndb_ddl_test2;
|
|
|
|
# Check that the NDB table is gone although database still exist
|
|
--error ER_NO_SUCH_TABLE
|
|
show create table ndb_ddl_test2.table_in_ndb;
|
|
|
|
# Drop the "shadow table" from other engine
|
|
drop table ndb_ddl_test2.shadow_in_db;
|
|
|
|
# Drop the database which now exists only on the first mysqld
|
|
drop database ndb_ddl_test2;
|
|
|
|
--connection mysqld2
|
|
|
|
# Create the ndb_ddl_test2 database again, thus checking it can be created
|
|
# and also allowing cleanup to drop it
|
|
create database ndb_ddl_test2;
|
|
|
|
# ##########################################################
|
|
# Test distribution involving a shadow table with a name
|
|
# that stretches the NDB identifier limit. The main purpose
|
|
# of this test is to check if valid warnings are returned
|
|
# ##########################################################
|
|
|
|
--connection mysqld1
|
|
USE ndb_ddl_test;
|
|
# Create InnoDB table in mysqld1
|
|
CREATE TABLE abcdefghijklmnopqrstuvwxyz1234567890bcdefghijklmnopqrstuvwxyz12 (
|
|
id INT PRIMARY KEY
|
|
) ENGINE InnoDB;
|
|
--connection mysqld2
|
|
USE ndb_ddl_test;
|
|
# Create and drop NDB table with the same name. Distribution to mysqld1 shall
|
|
# fail
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
CREATE TABLE abcdefghijklmnopqrstuvwxyz1234567890bcdefghijklmnopqrstuvwxyz12 (
|
|
id INT PRIMARY KEY
|
|
) ENGINE NDB;
|
|
--replace_regex /Node [0-9]+:/Node <nodeid>/
|
|
DROP TABLE abcdefghijklmnopqrstuvwxyz1234567890bcdefghijklmnopqrstuvwxyz12;
|
|
--connection mysqld1
|
|
# Clean up
|
|
DROP TABLE abcdefghijklmnopqrstuvwxyz1234567890bcdefghijklmnopqrstuvwxyz12;
|
|
|
|
# Check that all mysqlds have identical DD
|
|
--source verify_mysql_dd.inc
|
|
|
|
--source cleanup.inc
|