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

MDEV-34705: Binlog-in-engine: Implement SHOW BINARY LOGS

Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
This commit is contained in:
Kristian Nielsen
2025-01-07 09:41:32 +01:00
parent f0fdaa9665
commit 947de2bfaf
6 changed files with 97 additions and 8 deletions

View File

@@ -40,6 +40,8 @@ while ($i < 10) {
inc $i;
}
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;

View File

@@ -1230,6 +1230,17 @@ typedef struct st_ha_create_table_option {
struct st_mysql_sys_var *var;
} ha_create_table_option;
/* Struct used to return binlog file list for SHOW BINARY LOGS from engine. */
struct binlog_file_entry
{
binlog_file_entry *next;
LEX_CSTRING name;
/* The size is filled in by server, engine need not return it. */
my_off_t size;
};
class handler;
class group_by_handler;
class derived_handler;
@@ -1552,6 +1563,8 @@ struct handlerton
void (*binlog_oob_free)(THD *thd, void *engine_data);
/* Obtain an object to allow reading from the binlog. */
handler_binlog_reader * (*get_binlog_reader)();
/* Obtain list of binlog files (SHOw BINARY LOGS). */
binlog_file_entry * (*get_binlog_file_list)(MEM_ROOT *mem_root);
/*
Optional clauses in the CREATE/ALTER TABLE

View File

@@ -990,13 +990,6 @@ static int send_heartbeat_event(binlog_send_info *info,
}
struct binlog_file_entry
{
binlog_file_entry *next;
LEX_CSTRING name;
my_off_t size;
};
/**
Read all binary logs and return as a list
@@ -1021,6 +1014,13 @@ get_binlog_list(MEM_ROOT *memroot, bool reverse= true,
binlog_file_entry *current_list= NULL, *current_link= NULL, *e;
DBUG_ENTER("get_binlog_list");
if (opt_binlog_engine_hton)
{
if (already_locked)
mysql_bin_log.unlock_index();
DBUG_RETURN((*opt_binlog_engine_hton->get_binlog_file_list)(memroot));
}
if (!mysql_bin_log.is_open())
{
if (already_locked)

View File

@@ -4024,6 +4024,34 @@ static void innobase_update_optimizer_costs(OPTIMIZER_COSTS *costs)
}
static binlog_file_entry *innodb_get_binlog_file_list(MEM_ROOT *mem_root)
{
uint64_t first, last;
if (innodb_find_binlogs(&first, &last))
return nullptr;
binlog_file_entry *list;
binlog_file_entry **next_ptr= &list;
for (uint64_t i= first; i <= last; ++i)
{
binlog_file_entry *e= (binlog_file_entry *)alloc_root(mem_root, sizeof(*e));
if (!e)
return nullptr;
char name_buf[OS_FILE_MAX_PATH];
binlog_name_make(name_buf, i);
e->name.length= strlen(name_buf);
char *str= (char *)alloc_root(mem_root, e->name.length + 1);
if (!str)
return nullptr;
strcpy(str, name_buf);
e->name.str= str;
*next_ptr= e;
next_ptr= &(e->next);
}
*next_ptr= nullptr;
return list;
}
/** Initialize the InnoDB storage engine plugin.
@param[in,out] p InnoDB handlerton
@return error code
@@ -4097,6 +4125,7 @@ static int innodb_init(void* p)
innobase_hton->binlog_oob_data= innodb_binlog_oob;
innobase_hton->binlog_oob_free= innodb_free_oob;
innobase_hton->get_binlog_reader= innodb_get_binlog_reader;
innobase_hton->get_binlog_file_list= innodb_get_binlog_file_list;
innodb_remember_check_sysvar_funcs();

View File

@@ -2131,3 +2131,47 @@ innobase_binlog_write_direct(IO_CACHE *cache,
/* ToDo: Presumably innodb_binlog_write_cache() should be able to fail in some cases? Then return any such error to the caller. */
return false;
}
bool
innodb_find_binlogs(uint64_t *out_first, uint64_t *out_last)
{
MY_DIR *dir= my_dir(innodb_binlog_directory, MYF(0));
if (!dir)
{
ib::error() << "Could not read the binlog directory '" <<
innodb_binlog_directory << "', error code " << my_errno << ".";
return true;
}
size_t num_entries= dir->number_of_files;
fileinfo *entries= dir->dir_entry;
uint64_t first_file_no, last_file_no;
uint64_t num_file_no= 0;
for (size_t i= 0; i < num_entries; ++i) {
const char *name= entries[i].name;
uint64_t file_no;
if (!is_binlog_name(name, &file_no))
continue;
if (num_file_no == 0 || file_no < first_file_no)
first_file_no= file_no;
if (num_file_no == 0 || file_no > last_file_no)
last_file_no= file_no;
++num_file_no;
}
my_dirend(dir);
if (num_file_no == 0)
{
ib::error() << "No binlog files found (deleted externally?)";
return true;
}
if (num_file_no != last_file_no - first_file_no + 1)
{
ib::error() << "Missing binlog files (deleted externally?)";
return true;
}
*out_first= first_file_no;
*out_last= last_file_no;
return false;
}

View File

@@ -97,5 +97,6 @@ extern void innodb_binlog_trx(trx_t *trx, mtr_t *mtr);
extern bool innobase_binlog_write_direct
(IO_CACHE *cache, handler_binlog_event_group_info *binlog_info,
const rpl_gtid *gtid);
extern bool innodb_find_binlogs(uint64_t *out_first, uint64_t *out_last);
#endif /* innodb_binlog_h */