blob: e42c8e514118acd6657a089da03447a02b1634da (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
include/master-slave.inc
[connection master]
#
# Bug #25144 "replication / binlog with view breaks".
# Statements that used views didn't ensure that view were not modified
# during their execution. Indeed this led to incorrect binary log with
# statement based logging and as result to broken replication.
#
drop tables if exists t1, t2;
drop view if exists v1;
# Syncing slave with master and switching to connection 'slave'
# Switching to connection 'master'
create table t1 (i int);
create table t2 (i int);
create view v1 as select * from t1;
# First we try to concurrently execute statement that uses view
# and statement that drops it. We use "user" locks as means to
# suspend execution of first statement once it opens our view.
select get_lock("lock_bg25144", 1);
get_lock("lock_bg25144", 1)
1
# Switching to connection 'master1'
insert into v1 values (get_lock("lock_bg25144", 100));
# Switching to connection 'master2'
drop view v1;
# Switching to connection 'master'
select release_lock("lock_bg25144");
release_lock("lock_bg25144")
1
# Switching to connection 'master1'
select release_lock("lock_bg25144");
release_lock("lock_bg25144")
1
# Switching to connection 'master2'
# Switching to connection 'master'
# Check that insertion through view did happen.
select * from t1;
i
1
# Syncing slave with master and switching to connection 'slave'
# Check that slave was able to replicate this sequence
# which means that we got correct binlog order.
select * from t1;
i
1
# Switching to connection 'master'
# Now we will repeat the test by trying concurrently execute
# statement that uses a view and statement that alters it.
create view v1 as select * from t1;
select get_lock("lock_bg25144", 1);
get_lock("lock_bg25144", 1)
1
# Switching to connection 'master1'
insert into v1 values (get_lock("lock_bg25144", 100));
# Switching to connection 'master2'
alter view v1 as select * from t2;
# Switching to connection 'master'
select release_lock("lock_bg25144");
release_lock("lock_bg25144")
1
# Switching to connection 'master1'
select release_lock("lock_bg25144");
release_lock("lock_bg25144")
1
# Switching to connection 'master2'
# Switching to connection 'master'
# Second insertion should go to t1 as well.
select * from t1;
i
1
1
select * from t2;
i
# Syncing slave with master and switching to connection 'slave'
# Now let us check that statements were logged in proper order
# So we have same result on slave.
select * from t1;
i
1
1
select * from t2;
i
# Switching to connection 'master'
drop table t1, t2;
drop view v1;
# Syncing slave with master and switching to connection 'slave'
include/rpl_end.inc
|