1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Binlog-in-engine: Implement dynamically changing binlog max size

Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
This commit is contained in:
Kristian Nielsen
2025-07-16 21:25:00 +02:00
parent 31ba7922a0
commit 685b0b0def
8 changed files with 41 additions and 8 deletions

View File

@@ -164,4 +164,14 @@ SELECT @@GLOBAL.gtid_binlog_state;
SELECT @@GLOBAL.gtid_binlog_state; SELECT @@GLOBAL.gtid_binlog_state;
@@GLOBAL.gtid_binlog_state @@GLOBAL.gtid_binlog_state
0-1-2508,1-1-1003 0-1-2508,1-1-1003
SET @old_max_size= @@GLOBAL.max_binlog_size;
SET GLOBAL max_binlog_size= 1048576;
FLUSH BINARY LOGS;
SHOW BINARY LOGS;
Log_name File_size
binlog-000030.ibb 8192
binlog-000031.ibb 8192
binlog-000032.ibb 262144
binlog-000033.ibb 1048576
SET GLOBAL max_binlog_size= @old_max_size;
DROP TABLE t1; DROP TABLE t1;

View File

@@ -247,6 +247,18 @@ SELECT @@GLOBAL.gtid_binlog_state;
--source include/restart_mysqld.inc --source include/restart_mysqld.inc
SELECT @@GLOBAL.gtid_binlog_state; SELECT @@GLOBAL.gtid_binlog_state;
# Test dynamically changing the max binlog size.
SET @old_max_size= @@GLOBAL.max_binlog_size;
--let $binlog_size= 1048576
eval SET GLOBAL max_binlog_size= $binlog_size;
FLUSH BINARY LOGS;
--let $binlog_name= binlog-000033.ibb
--source include/wait_for_engine_binlog.inc
SHOW BINARY LOGS;
SET GLOBAL max_binlog_size= @old_max_size;
DROP TABLE t1; DROP TABLE t1;
# No need to restore @@GLOBAL.slave_connections_needed_for_purge, as we # No need to restore @@GLOBAL.slave_connections_needed_for_purge, as we

View File

@@ -16,7 +16,6 @@
--source suite/rpl/include/rpl_gtid_index.inc --source suite/rpl/include/rpl_gtid_index.inc
--echo *** Switch to a larger binlog size --echo *** Switch to a larger binlog size
# ToDo: Fix that in current code, changing max_binlog_size dynamically is silently ignored.
SET @old_binlog_size= @@GLOBAL.max_binlog_size; SET @old_binlog_size= @@GLOBAL.max_binlog_size;
SET GLOBAL max_binlog_size= 16*1024*1024; SET GLOBAL max_binlog_size= 16*1024*1024;
--let $NUM_POS= 1000 --let $NUM_POS= 1000

View File

@@ -1547,6 +1547,8 @@ struct handlerton
/* Optional implementation of binlog in the engine. */ /* Optional implementation of binlog in the engine. */
bool (*binlog_init)(size_t binlog_size, const char *directory); bool (*binlog_init)(size_t binlog_size, const char *directory);
/* Dynamically changing the binlog max size. */
void (*set_binlog_max_size)(size_t binlog_size);
/* Binlog an event group that doesn't go through commit_ordered. */ /* Binlog an event group that doesn't go through commit_ordered. */
bool (*binlog_write_direct_ordered)(IO_CACHE *cache, bool (*binlog_write_direct_ordered)(IO_CACHE *cache,
handler_binlog_event_group_info *binlog_info, handler_binlog_event_group_info *binlog_info,

View File

@@ -10614,6 +10614,8 @@ void MYSQL_BIN_LOG::set_max_size(ulong max_size_arg)
mysql_mutex_lock(&LOCK_log); mysql_mutex_lock(&LOCK_log);
if (is_open()) if (is_open())
max_size= max_size_arg; max_size= max_size_arg;
if (opt_binlog_engine_hton)
(*opt_binlog_engine_hton->set_binlog_max_size)((size_t)max_size_arg);
mysql_mutex_unlock(&LOCK_log); mysql_mutex_unlock(&LOCK_log);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }

View File

@@ -4132,6 +4132,7 @@ static int innodb_init(void* p)
innobase_hton->update_optimizer_costs= innobase_update_optimizer_costs; innobase_hton->update_optimizer_costs= innobase_update_optimizer_costs;
innobase_hton->binlog_init= innodb_binlog_init; innobase_hton->binlog_init= innodb_binlog_init;
innobase_hton->set_binlog_max_size= ibb_set_max_size;
innobase_hton->binlog_write_direct_ordered= innobase_hton->binlog_write_direct_ordered=
innobase_binlog_write_direct_ordered; innobase_binlog_write_direct_ordered;
innobase_hton->binlog_write_direct= innobase_binlog_write_direct; innobase_hton->binlog_write_direct= innobase_binlog_write_direct;

View File

@@ -1262,13 +1262,8 @@ binlog_sync_initial()
} }
/* void
Open the InnoDB binlog implementation. ibb_set_max_size(size_t binlog_size)
This is called from server binlog layer if the user configured the binlog to
use the innodb implementation (with --binlog-storage-engine=innodb).
*/
bool
innodb_binlog_init(size_t binlog_size, const char *directory)
{ {
uint64_t pages= binlog_size >> ibb_page_size_shift; uint64_t pages= binlog_size >> ibb_page_size_shift;
if (UNIV_LIKELY(pages > (uint64_t)UINT32_MAX)) { if (UNIV_LIKELY(pages > (uint64_t)UINT32_MAX)) {
@@ -1283,7 +1278,18 @@ innodb_binlog_init(size_t binlog_size, const char *directory)
(pages << ibb_page_size_shift)); (pages << ibb_page_size_shift));
} }
innodb_binlog_size_in_pages= (uint32_t)pages; innodb_binlog_size_in_pages= (uint32_t)pages;
}
/*
Open the InnoDB binlog implementation.
This is called from server binlog layer if the user configured the binlog to
use the innodb implementation (with --binlog-storage-engine=innodb).
*/
bool
innodb_binlog_init(size_t binlog_size, const char *directory)
{
ibb_set_max_size(binlog_size);
if (!directory || !directory[0]) if (!directory || !directory[0])
directory= "."; directory= ".";
else if (strlen(directory) + BINLOG_NAME_MAX_LEN > OS_FILE_MAX_PATH) else if (strlen(directory) + BINLOG_NAME_MAX_LEN > OS_FILE_MAX_PATH)

View File

@@ -225,6 +225,7 @@ extern bool is_binlog_name(const char *name, uint64_t *out_idx);
extern int get_binlog_header(const char *binlog_path, byte *page_buf, extern int get_binlog_header(const char *binlog_path, byte *page_buf,
lsn_t &out_lsn, bool &out_empty) noexcept; lsn_t &out_lsn, bool &out_empty) noexcept;
extern void innodb_binlog_startup_init(); extern void innodb_binlog_startup_init();
extern void ibb_set_max_size(size_t binlog_size);
extern bool innodb_binlog_init(size_t binlog_size, const char *directory); extern bool innodb_binlog_init(size_t binlog_size, const char *directory);
extern void innodb_binlog_close(bool shutdown); extern void innodb_binlog_close(bool shutdown);
extern bool ibb_write_header_page(mtr_t *mtr, uint64_t file_no, extern bool ibb_write_header_page(mtr_t *mtr, uint64_t file_no,