2002-07-23 17:31:22 +02:00
|
|
|
# This one assumes we are ignoring updates on tables in database foo, but doing
|
|
|
|
# the ones in database bar
|
|
|
|
|
2000-12-07 15:54:59 +01:00
|
|
|
source include/master-slave.inc;
|
2000-11-21 07:38:08 +01:00
|
|
|
drop database if exists foo;
|
|
|
|
create database foo;
|
|
|
|
drop database if exists bar;
|
|
|
|
create database bar;
|
2001-01-17 13:47:33 +01:00
|
|
|
save_master_pos;
|
2000-11-21 07:38:08 +01:00
|
|
|
connection slave;
|
2001-01-17 13:47:33 +01:00
|
|
|
sync_with_master;
|
2003-01-25 14:07:51 +01:00
|
|
|
create database foo;
|
2000-11-21 07:38:08 +01:00
|
|
|
drop table if exists foo.foo;
|
|
|
|
create table foo.foo (n int);
|
|
|
|
insert into foo.foo values(4);
|
|
|
|
connection master;
|
|
|
|
drop table if exists foo.foo;
|
|
|
|
create table foo.foo (n int);
|
|
|
|
insert into foo.foo values(5);
|
|
|
|
drop table if exists bar.bar;
|
|
|
|
create table bar.bar (m int);
|
|
|
|
insert into bar.bar values(15);
|
2001-01-17 13:47:33 +01:00
|
|
|
save_master_pos;
|
2000-11-21 07:38:08 +01:00
|
|
|
connection slave;
|
2001-01-17 13:47:33 +01:00
|
|
|
sync_with_master;
|
2001-03-25 00:02:26 +01:00
|
|
|
select foo.foo.n,bar.bar.m from foo.foo,bar.bar;
|
2001-01-03 01:15:48 +01:00
|
|
|
connection master;
|
2003-01-25 14:07:51 +01:00
|
|
|
drop database bar;
|
2001-01-03 01:15:48 +01:00
|
|
|
drop database if exists foo;
|
2001-01-17 13:47:33 +01:00
|
|
|
save_master_pos;
|
|
|
|
connection slave;
|
|
|
|
sync_with_master;
|
2003-01-25 14:07:51 +01:00
|
|
|
--error 1008
|
|
|
|
drop database bar;
|
|
|
|
drop database foo;
|
2001-05-29 03:18:23 +02:00
|
|
|
|
2002-07-23 17:31:22 +02:00
|
|
|
# Now let's test load data from master
|
|
|
|
|
|
|
|
# First create some databases and tables on the master
|
2001-05-29 03:18:23 +02:00
|
|
|
|
|
|
|
connection master;
|
|
|
|
set sql_log_bin = 0;
|
|
|
|
create database foo;
|
|
|
|
create database bar;
|
|
|
|
show databases;
|
|
|
|
create table foo.t1(n int, s char(20));
|
|
|
|
create table foo.t2(n int, s text);
|
|
|
|
insert into foo.t1 values (1, 'one'), (2, 'two'), (3, 'three');
|
|
|
|
insert into foo.t2 values (11, 'eleven'), (12, 'twelve'), (13, 'thirteen');
|
|
|
|
|
|
|
|
create table bar.t1(n int, s char(20));
|
|
|
|
create table bar.t2(n int, s text);
|
|
|
|
insert into bar.t1 values (1, 'one bar'), (2, 'two bar'), (3, 'three bar');
|
|
|
|
insert into bar.t2 values (11, 'eleven bar'), (12, 'twelve bar'),
|
|
|
|
(13, 'thirteen bar');
|
|
|
|
set sql_log_bin = 1;
|
|
|
|
save_master_pos;
|
|
|
|
connection slave;
|
|
|
|
sync_with_master;
|
|
|
|
|
2002-07-23 17:31:22 +02:00
|
|
|
# This should show that the slave is empty at this point
|
2001-05-29 03:18:23 +02:00
|
|
|
show databases;
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
# Create foo and foo2 on slave; we expect that LOAD DATA FROM MASTER will
|
|
|
|
# neither touch database foo nor foo2.
|
|
|
|
create database foo;
|
|
|
|
create table foo.t1(n int, s char(20));
|
|
|
|
insert into foo.t1 values (1, 'original foo.t1');
|
|
|
|
create table foo.t3(n int, s char(20));
|
|
|
|
insert into foo.t3 values (1, 'original foo.t3');
|
|
|
|
create database foo2;
|
|
|
|
create table foo2.t1(n int, s char(20));
|
|
|
|
insert into foo2.t1 values (1, 'original foo2.t1');
|
|
|
|
# Create bar, and bar.t1, to check that it gets replaced,
|
|
|
|
# and bar.t3 to check that it is not touched (there is no bar.t3 on master)
|
|
|
|
create database bar;
|
|
|
|
create table bar.t1(n int, s char(20));
|
|
|
|
insert into bar.t1 values (1, 'original bar.t1');
|
|
|
|
create table bar.t3(n int, s char(20));
|
|
|
|
insert into bar.t3 values (1, 'original bar.t3');
|
|
|
|
|
2001-05-29 03:18:23 +02:00
|
|
|
load data from master;
|
|
|
|
|
2002-07-23 17:31:22 +02:00
|
|
|
# Now let's check if we have the right tables and the right data in them
|
2001-05-29 03:18:23 +02:00
|
|
|
show databases;
|
|
|
|
use foo;
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
# LOAD DATA FROM MASTER uses only replicate_*_db rules to decide which databases
|
|
|
|
# have to be copied. So it thinks "foo" has to be copied. Before 4.0.16 it would
|
|
|
|
# first drop "foo", then create "foo". This "drop" is a bug; in that case t3
|
|
|
|
# would disappear.
|
|
|
|
# So here the effect of this bug (BUG#1248) would be to leave an empty "foo" on
|
|
|
|
# the slave.
|
|
|
|
show tables; # should be t1 & t3
|
|
|
|
select * from t1; # should be slave's original
|
|
|
|
use foo2;
|
|
|
|
show tables; # should be t1
|
|
|
|
select * from t1; # should be slave's original
|
2001-05-29 03:18:23 +02:00
|
|
|
use bar;
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
show tables; # should contain master's copied t1&t2, slave's original t3
|
2001-05-29 03:18:23 +02:00
|
|
|
select * from bar.t1;
|
|
|
|
select * from bar.t2;
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
select * from bar.t3;
|
2001-05-29 03:18:23 +02:00
|
|
|
|
2002-07-23 17:31:22 +02:00
|
|
|
# Now let's see if replication works
|
2001-05-29 03:18:23 +02:00
|
|
|
connection master;
|
|
|
|
insert into bar.t1 values (4, 'four bar');
|
|
|
|
save_master_pos;
|
|
|
|
connection slave;
|
|
|
|
sync_with_master;
|
|
|
|
select * from bar.t1;
|
|
|
|
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
# Check that LOAD DATA FROM MASTER reports the error if it can't drop a
|
|
|
|
# table to be overwritten.
|
|
|
|
insert into bar.t1 values(10, 'should be there');
|
|
|
|
flush tables;
|
|
|
|
system chmod 500 var/slave-data/bar/;
|
|
|
|
--error 6
|
|
|
|
load data from master; # should fail (errno 13)
|
|
|
|
system chmod 700 var/slave-data/bar/;
|
|
|
|
select * from bar.t1; # should contain the row (10, ...)
|
|
|
|
|
|
|
|
|
|
|
|
# Check that LOAD TABLE FROM MASTER fails if the table exists on slave
|
|
|
|
--error 1050
|
|
|
|
load table bar.t1 from master;
|
|
|
|
drop table bar.t1;
|
|
|
|
load table bar.t1 from master;
|
|
|
|
|
|
|
|
# as LOAD DATA FROM MASTER failed it did not restart slave threads
|
|
|
|
start slave;
|
|
|
|
|
2002-07-23 17:31:22 +02:00
|
|
|
# Now time for cleanup
|
2001-05-29 03:18:23 +02:00
|
|
|
connection master;
|
|
|
|
drop database bar;
|
|
|
|
drop database foo;
|
|
|
|
save_master_pos;
|
|
|
|
connection slave;
|
|
|
|
sync_with_master;
|
* Fix for BUG#1248: "LOAD DATA FROM MASTER drops the slave's db unexpectedly".
Now LOAD DATA FROM MASTER does not drop the database, instead it only tries to
create it, and drops/creates table-by-table.
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
mysql-test/r/rpl000009.result:
result update
mysql-test/t/rpl000009.test:
test that LOAD DATA FROM MASTER does not drop databases,
but rather table by table, thus preserving non-replicated tables.
Test that LOAD DATA FROM MASTER reports the error when a table could not
be dropped (system's "permission denied" for example).
Test that LOAD TABLE FROM MASTER reports the error when the table already exists.
sql/repl_failsafe.cc:
* replicate_wild_ignore_table='db1.%' is now considered as "ignore the 'db1'
database as a whole", as it already works for CREATE DATABASE and DROP DATABASE.
* If a db matches replicate_*_db rules, we don't drop/recreate it because this
could drop some tables in this db which could be slave-specific. Instead,
we do a CREATE DATABASE IF EXISTS, and we will drop each table which has
an equivalent on the master, table-by-table.
sql/slave.cc:
New argument to drop the table in create_table_from_dump()
(LOAD TABLE/DATA FROM MASTER are the only places where this function is used).
This is needed because LOAD DATA FROM MASTER does not drop the database anymore.
The behaviour when the table exists is unchanged: LOAD DATA silently replaces
the table, LOAD TABLE gives error.
sql/slave.h:
new argument to drop the table in fetch_master_table
sql/sql_parse.cc:
do not drop the table in LOAD TABLE FROM MASTER (this behaviour is already
true; but changes in LOAD DATA FROM MASTER made the argument needed).
2003-09-11 23:17:28 +02:00
|
|
|
drop database foo;
|
|
|
|
drop database foo2;
|