Details
-
Bug
-
Status: Confirmed (View Workflow)
-
Major
-
Resolution: Unresolved
-
10.6, 10.11, 11.4, 12.3
-
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 is INSERT IGNORE. This variant changes the witness DML
form while keeping the trigger, procedure, FK, AUTO_INCREMENT, and
ROLLBACK TO SAVEPOINT shape.
Environment
- Product: MariaDB Server primary/replica replication
- Replication mode: file/position
- binlog_format: MIXED
- Observed affected versions: MariaDB 10.6, 12.2
- Clean controls: MySQL 5.7/8.0 with MIXED; MariaDB 10.6/12.2
with ROW - 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_ign_frame |
ORDER BY seq; |
Minimal Reproduction SQL
-- Variant: INSERT IGNORE witness.
|
-- Configure MariaDB primary/replica with binlog_format=MIXED.
|
|
|
CREATE TABLE acl_repl_ai_proc_ign_src( |
id INT PRIMARY KEY, |
v INT NOT NULL, |
note VARCHAR(32) NOT NULL |
) ENGINE=InnoDB;
|
|
|
CREATE TABLE acl_repl_ai_proc_ign_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_ign_audit_src_idx(src_id), |
CONSTRAINT acl_repl_ai_proc_ign_audit_fk |
FOREIGN KEY(src_id) REFERENCES acl_repl_ai_proc_ign_src(id) |
ON UPDATE CASCADE ON DELETE CASCADE |
) ENGINE=InnoDB;
|
|
|
CREATE TABLE acl_repl_ai_proc_ign_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_ign_apply( |
IN p_src_id INT, |
IN p_seen_v INT, |
IN p_note VARCHAR(32) |
)
|
BEGIN
|
INSERT INTO acl_repl_ai_proc_ign_audit(src_id, seen_v, note) |
VALUES (p_src_id, p_seen_v, p_note); |
INSERT INTO acl_repl_ai_proc_ign_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_ign_ai |
AFTER INSERT ON acl_repl_ai_proc_ign_src |
FOR EACH ROW |
BEGIN
|
CALL acl_repl_ai_proc_ign_apply(NEW.id, NEW.v, NEW.note);
|
END// |
DELIMITER ;
|
|
|
INSERT INTO acl_repl_ai_proc_ign_src(id, v, note) |
VALUES (1, 10, 'seed'); |
|
|
START TRANSACTION; |
INSERT INTO acl_repl_ai_proc_ign_src(id, v, note) |
VALUES (2, 20, 'prefix'); |
SAVEPOINT acl_repl_ai_proc_ign_sp;
|
INSERT INTO acl_repl_ai_proc_ign_src(id, v, note) |
VALUES (3, 30, 'suffix'); |
ROLLBACK TO SAVEPOINT acl_repl_ai_proc_ign_sp; |
COMMIT; |
|
|
INSERT IGNORE INTO acl_repl_ai_proc_ign_src(id, v, note) |
VALUES (4, 40, 'witness'); |
|
|
SELECT seq, src_id, frame_v, note |
FROM acl_repl_ai_proc_ign_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
|
Actual Result
Primary:
1, 1, 7010, proc-seed
|
2, 2, 7020, proc-prefix
|
4, 4, 7040, proc-witness
|
Replica:
1, 1, 7010, proc-seed
|
2, 2, 7020, proc-prefix
|
3, 4, 7040, proc-witness
|
Separate Verification Request
Please verify this INSERT IGNORE witness form separately. The witness statement uses a different DML form from the ordinary INSERT reproduction and may need its own mixed-logging regression test.
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-40456 binlog_format=MIXED primary/replica row divergence with trigger-called stored procedure after savepoint rollback
-
- Confirmed
-
-
MDEV-40457 binlog_format=MIXED primary/replica row divergence with trigger-called stored function after savepoint rollback
-
- Confirmed
-
-
MDEV-40460 binlog_format=MIXED primary/replica row divergence with INSERT SELECT witness after savepoint rollback
-
- Confirmed
-