Details
-
Bug
-
Status: Open (View Workflow)
-
Major
-
Resolution: Unresolved
-
None
-
None
-
Unexpected results
-
Description
Summary
In binlog_format=MIXED, the trigger-called stored-procedure reproduction
also leaves the replica with different committed rows when the post-savepoint
witness operation inserts two rows in one statement. This variant shows a
contiguous committed AUTO_INCREMENT sequence shift on the replica.
Environment
- Product: MariaDB Server primary/replica replication
- Replication mode: file/position
- binlog_format: MIXED
- Observed affected versions: MariaDB 10.6, 12.2
- Clean controls: MariaDB 10.6/12.2 with ROW; MySQL 5.6/5.7/8.0
with MIXED - Storage engine: InnoDB
Steps To Reproduce
1. Start a MariaDB primary/replica pair with binlog_format=MIXED.
2. Run the SQL in the Minimal Reproduction SQL section on the primary.
3. Wait for the replica to catch up.
4. Run this query on both primary and replica:
SELECT seq, src_id, frame_v, note |
FROM acl_repl_ai_proc_mw_frame |
ORDER BY seq; |
Minimal Reproduction SQL
-- Variant: multi-row witness.
|
-- Configure MariaDB primary/replica with binlog_format=MIXED.
|
|
|
CREATE TABLE acl_repl_ai_proc_mw_src( |
id INT PRIMARY KEY, |
v INT NOT NULL, |
note VARCHAR(32) NOT NULL |
) ENGINE=InnoDB;
|
|
|
CREATE TABLE acl_repl_ai_proc_mw_audit( |
seq INT AUTO_INCREMENT PRIMARY KEY, |
src_id INT NOT NULL, |
seen_v INT NOT NULL, |
note VARCHAR(32) NOT NULL, |
KEY acl_repl_ai_proc_mw_audit_src_idx(src_id), |
CONSTRAINT acl_repl_ai_proc_mw_audit_fk |
FOREIGN KEY(src_id) REFERENCES acl_repl_ai_proc_mw_src(id) |
ON UPDATE CASCADE ON DELETE CASCADE |
) ENGINE=InnoDB;
|
|
|
CREATE TABLE acl_repl_ai_proc_mw_frame( |
seq INT AUTO_INCREMENT PRIMARY KEY, |
src_id INT NOT NULL, |
frame_v INT NOT NULL, |
note VARCHAR(64) NOT NULL |
) ENGINE=InnoDB;
|
|
|
DELIMITER //
|
CREATE PROCEDURE acl_repl_ai_proc_mw_apply( |
IN p_src_id INT, |
IN p_seen_v INT, |
IN p_note VARCHAR(32) |
)
|
BEGIN
|
INSERT INTO acl_repl_ai_proc_mw_audit(src_id, seen_v, note) |
VALUES (p_src_id, p_seen_v, p_note); |
INSERT INTO acl_repl_ai_proc_mw_frame(src_id, frame_v, note) |
VALUES (p_src_id, p_seen_v + 7000, CONCAT('proc-', p_note)); |
END// |
|
|
CREATE TRIGGER acl_repl_ai_proc_mw_ai |
AFTER INSERT ON acl_repl_ai_proc_mw_src |
FOR EACH ROW |
BEGIN
|
CALL acl_repl_ai_proc_mw_apply(NEW.id, NEW.v, NEW.note);
|
END// |
DELIMITER ;
|
|
|
INSERT INTO acl_repl_ai_proc_mw_src(id, v, note) |
VALUES (1, 10, 'seed'); |
|
|
START TRANSACTION; |
INSERT INTO acl_repl_ai_proc_mw_src(id, v, note) |
VALUES (2, 20, 'prefix'); |
SAVEPOINT acl_repl_ai_proc_mw_sp;
|
INSERT INTO acl_repl_ai_proc_mw_src(id, v, note) |
VALUES (3, 30, 'suffix'); |
ROLLBACK TO SAVEPOINT acl_repl_ai_proc_mw_sp; |
COMMIT; |
|
|
INSERT INTO acl_repl_ai_proc_mw_src(id, v, note) |
VALUES (4, 40, 'witness'), (5, 50, 'witness2'); |
|
|
SELECT seq, src_id, frame_v, note |
FROM acl_repl_ai_proc_mw_frame |
ORDER BY seq; |
Expected Result
The primary and replica should return the same committed rows.
Expected rows:
1, 1, 7010, proc-seed
|
2, 2, 7020, proc-prefix
|
4, 4, 7040, proc-witness
|
5, 5, 7050, proc-witness2
|
Actual Result
Primary:
1, 1, 7010, proc-seed
|
2, 2, 7020, proc-prefix
|
4, 4, 7040, proc-witness
|
5, 5, 7050, proc-witness2
|
Replica:
1, 1, 7010, proc-seed
|
2, 2, 7020, proc-prefix
|
3, 4, 7040, proc-witness
|
4, 5, 7050, proc-witness2
|
Separate Verification Request
Please verify this multi-row witness form separately. It shows a contiguous committed sequence shift on the replica, not only a single-row mismatch.
Attachments
Issue Links
- relates to
-
MDEV-40461 binlog_format=MIXED primary/replica row divergence when FK is on second routine side-effect table
-
- Confirmed
-
-
MDEV-40460 binlog_format=MIXED primary/replica row divergence with INSERT SELECT witness after savepoint rollback
-
- Confirmed
-