summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSujatha <sujatha.sivakumar@mariadb.com>2021-05-07 12:57:20 +0530
committerSujatha <sujatha.sivakumar@mariadb.com>2021-05-10 09:36:40 +0530
commit49ff2cbff443b7d7e688f97887a05297901601da (patch)
treee3940af258f53ecc2e4d9468c70a0321d7f32a1c
parent4205078b41dd01cd7539de319e7612e3e9872668 (diff)
downloadmariadb-git-49ff2cbff443b7d7e688f97887a05297901601da.tar.gz
MDEV-19371: Implement binlog_expire_logs_seconds for purging of binary logs
Part1: Functional changes Backporting upstream changes. commit a7e1ef858ee82493dd8ad9a76bc9c22fe3b8c05b Author: Neha Kumari <neha.n.kumari@oracle.com> Note: From the upstream patch only the new option binlog_expire_logs_seconds specific changes are taken. * Unlike in the upstream patch 'binlog_expire_logs_seconds' does not replace the "old" 'expire_logs_days', to preserve backward-compatibility. * Datatype of 'expire_logs_days' variable is changed to double. * Default value of 'binlog_expire_logs_seconds=0' similar to 'expire_logs_days'. * The purge_time can be specified in days with the micro-day precision. Eg: expire_logs_days=1 is the same as expire_logs_days=1.000000 to make binlog_expire_logs_seconds=86400. binlog_expire_logs_seconds=1 is the same as expire_logs_days=0.000012. * If binary log is disabled and option 'expire_logs_days' or 'binlog_expire_logs_seconds' used with purge_time > 0 a warning will be issued.
-rw-r--r--sql/log.cc6
-rw-r--r--sql/mysqld.cc34
-rw-r--r--sql/mysqld.h5
-rw-r--r--sql/sys_vars.cc38
4 files changed, 72 insertions, 11 deletions
diff --git a/sql/log.cc b/sql/log.cc
index df21b29e65d..01f9d0186e2 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -7033,12 +7033,14 @@ void MYSQL_BIN_LOG::purge()
{
mysql_mutex_assert_not_owner(&LOCK_log);
#ifdef HAVE_REPLICATION
- if (expire_logs_days)
+ if (binlog_expire_logs_seconds)
{
DEBUG_SYNC(current_thd, "at_purge_logs_before_date");
- time_t purge_time= my_time(0) - expire_logs_days*24*60*60;
+ time_t purge_time= my_time(0) - binlog_expire_logs_seconds;
+ DBUG_EXECUTE_IF("expire_logs_always", { purge_time = my_time(0); });
if (purge_time >= 0)
{
+ ha_flush_logs();
purge_logs_before_date(purge_time);
}
DEBUG_SYNC(current_thd, "after_purge_logs_before_date");
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 2741e68bde9..9f6f2e4a786 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -511,7 +511,9 @@ ulong current_pid;
ulong slow_launch_threads = 0;
uint sync_binlog_period= 0, sync_relaylog_period= 0,
sync_relayloginfo_period= 0, sync_masterinfo_period= 0;
-ulong expire_logs_days = 0;
+double expire_logs_days = 0;
+ulong binlog_expire_logs_seconds = 0;
+
/**
Soft upper limit for number of sp_head objects that can be stored
in the sp_cache for one connection.
@@ -725,6 +727,8 @@ char *opt_relay_logname = 0, *opt_relaylog_index_name=0;
char *opt_logname, *opt_slow_logname, *opt_bin_logname;
char *opt_binlog_index_name=0;
+
+
/* Static variables */
my_bool opt_stack_trace;
@@ -5283,11 +5287,20 @@ static int init_server_components()
}
#ifdef HAVE_REPLICATION
- if (opt_bin_log && expire_logs_days)
+ if (opt_bin_log)
+ {
+ if (binlog_expire_logs_seconds)
+ {
+ time_t purge_time= server_start_time - binlog_expire_logs_seconds;
+ if (purge_time >= 0)
+ mysql_bin_log.purge_logs_before_date(purge_time);
+ }
+ }
+ else
{
- time_t purge_time= server_start_time - expire_logs_days*24*60*60;
- if (purge_time >= 0)
- mysql_bin_log.purge_logs_before_date(purge_time);
+ if (binlog_expire_logs_seconds)
+ sql_print_warning("You need to use --log-bin to make --expire-logs-days "
+ "or --binlog-expire-logs-seconds work.");
}
#endif
@@ -7911,6 +7924,17 @@ mysqld_get_one_option(const struct my_option *opt, const char *argument,
}
break;
}
+ case (int)OPT_EXPIRE_LOGS_DAYS:
+ {
+ binlog_expire_logs_seconds= (ulong)(expire_logs_days*24*60*60);
+ break;
+ }
+ case (int)OPT_BINLOG_EXPIRE_LOGS_SECONDS:
+ {
+ expire_logs_days= (binlog_expire_logs_seconds/double (24*60*60));
+ break;
+ }
+
#ifdef HAVE_REPLICATION
case (int)OPT_REPLICATE_IGNORE_DB:
{
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 64cf1c5ebb0..fb57c3303c2 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -155,7 +155,8 @@ extern bool opt_endinfo, using_udf_functions;
extern my_bool locked_in_memory;
extern bool opt_using_transactions;
extern ulong current_pid;
-extern ulong expire_logs_days;
+extern double expire_logs_days;
+extern ulong binlog_expire_logs_seconds;
extern my_bool relay_log_recovery;
extern uint sync_binlog_period, sync_relaylog_period,
sync_relayloginfo_period, sync_masterinfo_period;
@@ -777,6 +778,8 @@ enum options_mysqld
OPT_BINLOG_IGNORE_DB,
OPT_BIN_LOG,
OPT_BOOTSTRAP,
+ OPT_EXPIRE_LOGS_DAYS,
+ OPT_BINLOG_EXPIRE_LOGS_SECONDS,
OPT_CONSOLE,
OPT_DEBUG_SYNC_TIMEOUT,
OPT_REMOVED_OPTION,
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index ebec2a203aa..70150b367ce 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -1156,14 +1156,46 @@ static Sys_var_enum Sys_event_scheduler(
ON_CHECK(event_scheduler_check), ON_UPDATE(event_scheduler_update));
#endif
-static Sys_var_on_access_global<Sys_var_ulong,
+static bool copy_to_expire_logs_days(sys_var *, THD *,
+ enum_var_type type)
+{
+ expire_logs_days= binlog_expire_logs_seconds / (double)(24 * 60 * 60);
+ return false;
+}
+
+static bool copy_to_binlog_expire_logs_seconds(sys_var *, THD *,
+ enum_var_type type)
+{
+ binlog_expire_logs_seconds= (ulong)(expire_logs_days * 24 * 60 * 60);
+ return false;
+}
+
+static Sys_var_on_access_global<Sys_var_double,
PRIV_SET_SYSTEM_GLOBAL_VAR_EXPIRE_LOGS_DAYS>
Sys_expire_logs_days(
"expire_logs_days",
"If non-zero, binary logs will be purged after expire_logs_days "
- "days; possible purges happen at startup and at binary log rotation",
+ "days; It and binlog_expire_logs_seconds are aliases, such that "
+ "changes in one are converted into the other, presentable as a "
+ "decimal value with 1/1000000 of the day precision; possible "
+ "purges happen at startup and at binary log rotation",
GLOBAL_VAR(expire_logs_days),
- CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 99), DEFAULT(0), BLOCK_SIZE(1));
+ CMD_LINE(REQUIRED_ARG, OPT_EXPIRE_LOGS_DAYS), VALID_RANGE(0, 99),
+ DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),
+ ON_UPDATE(copy_to_binlog_expire_logs_seconds));
+
+static Sys_var_on_access_global<Sys_var_ulong,
+ PRIV_SET_SYSTEM_GLOBAL_VAR_EXPIRE_LOGS_DAYS>
+Sys_binlog_expire_logs_seconds(
+ "binlog_expire_logs_seconds",
+ "If non-zero, binary logs will be purged after "
+ "binlog_expire_logs_seconds seconds; It and expire_logs_days are "
+ "aliases, such that changes in one are converted into the other. "
+ "Possible purges happen at startup and at binary log rotation.",
+ GLOBAL_VAR(binlog_expire_logs_seconds),
+ CMD_LINE(REQUIRED_ARG, OPT_BINLOG_EXPIRE_LOGS_SECONDS),
+ VALID_RANGE(0, 0xFFFFFFFF), DEFAULT(0), BLOCK_SIZE(1), NO_MUTEX_GUARD,
+ NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(copy_to_expire_logs_days));
static Sys_var_mybool Sys_flush(
"flush", "Flush MyISAM tables to disk between SQL commands",