mirror of
https://github.com/MariaDB/server.git
synced 2025-05-01 08:45:04 +03:00
When the binlog was rotated due to @@max_binlog_size, the values of the binlog_shapshot_file and binlog_snapshot_position were inconsistent in case of non-transactional DML. The position was refering to the old file, while the filename was of the new file after rotation. This patch makes them consistent by making sure the position is also refering to the new file.
120 lines
3.2 KiB
Plaintext
120 lines
3.2 KiB
Plaintext
--source include/have_innodb.inc
|
|
--source include/have_log_bin.inc
|
|
--source include/have_binlog_format_mixed_or_statement.inc
|
|
|
|
RESET MASTER;
|
|
|
|
# Test that we get the correct binlog position from START TRANSACTION WITH
|
|
# CONSISTENT SNAPSHOT even when other transactions are active.
|
|
|
|
connect(con1,localhost,root,,);
|
|
connect(con2,localhost,root,,);
|
|
connect(con3,localhost,root,,);
|
|
connect(con4,localhost,root,,);
|
|
|
|
connection default;
|
|
--echo # Connection default
|
|
|
|
CREATE TABLE t1 (a INT, b VARCHAR(100), PRIMARY KEY (a,b)) ENGINE=innodb;
|
|
SHOW MASTER STATUS;
|
|
SHOW STATUS LIKE 'binlog_snapshot_%';
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (0, "");
|
|
|
|
connection con1;
|
|
--echo # Connection con1
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (1, "");
|
|
|
|
connection con2;
|
|
--echo # Connection con2
|
|
CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=myisam;
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (2, "first");
|
|
INSERT INTO t2 VALUES (2);
|
|
INSERT INTO t1 VALUES (2, "second");
|
|
|
|
connection default;
|
|
--echo # Connection default
|
|
COMMIT;
|
|
|
|
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
|
|
|
connection con3;
|
|
--echo # Connection con3
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (3, "");
|
|
INSERT INTO t2 VALUES (3);
|
|
|
|
connection con4;
|
|
--echo # Connection con4
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (4, "");
|
|
COMMIT;
|
|
|
|
connection default;
|
|
--echo # Connection default
|
|
SELECT * FROM t1 ORDER BY a,b;
|
|
SHOW STATUS LIKE 'binlog_snapshot_%';
|
|
SHOW MASTER STATUS;
|
|
SELECT * FROM t2 ORDER BY a;
|
|
|
|
connection con1;
|
|
--echo # Connection con1
|
|
COMMIT;
|
|
|
|
connection con2;
|
|
--echo # Connection con2
|
|
COMMIT;
|
|
|
|
connection con3;
|
|
--echo # Connection con3
|
|
COMMIT;
|
|
FLUSH LOGS;
|
|
|
|
connection default;
|
|
--echo # Connection default
|
|
SELECT * FROM t1 ORDER BY a,b;
|
|
SHOW STATUS LIKE 'binlog_snapshot_%';
|
|
SHOW MASTER STATUS;
|
|
COMMIT;
|
|
SHOW STATUS LIKE 'binlog_snapshot_%';
|
|
SHOW MASTER STATUS;
|
|
|
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /Server ver: .*, Binlog ver: .*/Server ver: #, Binlog ver: #/ /table_id: [0-9]+/table_id: #/
|
|
SHOW BINLOG EVENTS;
|
|
|
|
|
|
--echo *** MDEV-7310: last_commit_pos_offset set to wrong value after binlog rotate in group commit ***
|
|
|
|
SET @old_size= @@GLOBAL.max_binlog_size;
|
|
SET GLOBAL max_binlog_size=4096;
|
|
|
|
CREATE TABLE t3 (a INT PRIMARY KEY, b VARBINARY(8192)) ENGINE=MyISAM;
|
|
INSERT INTO t3 VALUES (10, '');
|
|
--let $bigdata= `SELECT REPEAT('a', 5000)`
|
|
eval INSERT INTO t3 VALUES (11, '$bigdata');
|
|
|
|
# The bug was that binlog_snapshot_file pointed to the new file after binlog
|
|
# rotation, but binlog_snapshot_position was the offset in the old file before
|
|
# binlog rotation. So the position was invalid.
|
|
# So here, we check that the values are consistent with SHOW MASTER STATUS,
|
|
# which uses a different code path and did not have the bug.
|
|
|
|
--let $snap_file= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_file', Value, 1)
|
|
--let $snap_pos= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_position', Value, 1)
|
|
|
|
--let $master_file= query_get_value(SHOW MASTER STATUS, File, 1)
|
|
--let $master_pos= query_get_value(SHOW MASTER STATUS, Position, 1)
|
|
|
|
--disable_query_log
|
|
eval SET @errmsg= 'ERROR: ($snap_file, $snap_pos) != ($master_file, $master_pos)';
|
|
eval SELECT IF('$snap_file' = '$master_file' AND $snap_pos = $master_pos, 'OK', @errmsg) AS test_result;
|
|
--enable_query_log
|
|
|
|
SET GLOBAL max_binlog_size=@old_size;
|
|
|
|
|
|
DROP TABLE t1,t2, t3;
|