1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

MDEV-34705: Binlog-in-engine: No use of InnoDB tablespace and bufferpool

In preparation for a simplified, lower-level recovery of binlog files
implemented in InnoDB, remove use of InnoDB tablespaces and buffer pool from
the binlog code. Instead, a custom binlog page fifo replaces the general
buffer pool for binlog pages, and tablespaces are replaced by simple file_no
references.

The new binlog page fifo is deliberately naively written in this commit for
simplicity, until the new recovery is complete and proven with tests; later
it can be improved for better efficiency and scalability. This first version
uses a simple global mutex, linear scans of linked lists, repeated
alloc/free of pages, and simple backgrund flush thread that uses
synchroneous pwrite() one page after another. Error handling is also mostly
omitted in this first version.

The page header/footer is not changed in this commit, nor is the pagesize,
to be done in a later patch.

The call to mtr_t::write_binlog() is currently commented-out in function
fsp_log_binlog_write() as it asserts in numerous places. To be enabled when
those asserts are fixed. For the same reason, the code does not yet
implement binlog_write_up_to(lsn_t lsn), to be done once mtr_t operations
are working.

Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
This commit is contained in:
Kristian Nielsen
2025-02-15 21:43:12 +00:00
parent 68f37e6e58
commit 86fbbbe273
15 changed files with 896 additions and 266 deletions

View File

@@ -0,0 +1,21 @@
RESET MASTER;
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
BEGIN;
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (3);
COMMIT;
SELECT * FROM t1 ORDER BY a;
a
1
2
3
DROP TABLE t1;
SELECT @@GLOBAL.binlog_checksum;
@@GLOBAL.binlog_checksum
NONE
CREATE TABLE t2 (a INT PRIMARY KEY, b VARCHAR(2048)) ENGINE=InnoDB;
SET SESSION binlog_format= ROW;
*** Do 1500 transactions ...
SET SESSION binlog_format= MIXED;
DROP TABLE t2;

View File

@@ -0,0 +1,13 @@
CREATE TABLE sbtest1(
id INTEGER NOT NULL AUTO_INCREMENT,
k INTEGER DEFAULT '0' NOT NULL,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) ENGINE = innodb;
*** Test bug where a large event in trx cache would fail to flush to disk
*** the last part of the IO_CACHE after reinit_io_cache()
SELECT COUNT(*) FROM sbtest1;
COUNT(*)
1000
DROP TABLE sbtest1;

View File

@@ -0,0 +1,58 @@
RESET MASTER;
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1, 0);
INSERT INTO t1 SELECT seq+1000000+100000*0, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*1, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*2, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*3, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*4, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*5, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*6, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*7, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*8, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+1000000+100000*9, seq FROM seq_1_to_4000;
SELECT @@GLOBAL.gtid_binlog_state;
@@GLOBAL.gtid_binlog_state
0-1-12
# restart
SELECT @@GLOBAL.gtid_binlog_state;
@@GLOBAL.gtid_binlog_state
0-1-12
INSERT INTO t1 VALUES (2, 0);
INSERT INTO t1 SELECT seq+2000000+100000*0, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*1, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*2, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*3, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*4, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*5, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*6, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*7, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*8, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+2000000+100000*9, seq FROM seq_1_to_4000;
SELECT @@GLOBAL.gtid_binlog_state;
@@GLOBAL.gtid_binlog_state
0-1-23
# restart
SELECT @@GLOBAL.gtid_binlog_state;
@@GLOBAL.gtid_binlog_state
0-1-23
INSERT INTO t1 VALUES (3, 0);
INSERT INTO t1 SELECT seq+3000000+100000*0, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*1, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*2, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*3, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*4, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*5, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*6, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*7, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*8, seq FROM seq_1_to_4000;
INSERT INTO t1 SELECT seq+3000000+100000*9, seq FROM seq_1_to_4000;
SHOW BINARY LOGS;
Log_name File_size
binlog-000000.ibb 262144
binlog-000001.ibb 262144
binlog-000002.ibb 262144
binlog-000003.ibb 262144
binlog-000004.ibb 262144
binlog-000005.ibb 262144
DROP TABLE t1;

View File

@@ -42,8 +42,9 @@ while ($i < 10) {
inc $i;
}
--let $binlog_name= binlog-000005.ibb
--let $binlog_size= 262144
--source include/wait_for_engine_binlog.inc
SHOW BINARY LOGS;
--exec $MYSQL_BINLOG --start-position=$gtid_pos3 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog3.txt
DROP TABLE t1;