Commit ad807aeb authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-12612 mysqladmin --local flush... to use FLUSH LOCAL

Make `mysqladmin --local` use `FLUSH LOCAL` for all flush-* commands,
and only do `SET SQL_LOG_BIN=OFF` for create/drop/old_password/password.

Additionally, --local is ignored for all commands that never write
to binlog, so e.g. `mysqladmin --local version` no longer needs SUPER
parent 7e0c8fc3
...@@ -46,6 +46,7 @@ static uint opt_count_iterations= 0, my_end_arg; ...@@ -46,6 +46,7 @@ static uint opt_count_iterations= 0, my_end_arg;
static ulong opt_connect_timeout, opt_shutdown_timeout; static ulong opt_connect_timeout, opt_shutdown_timeout;
static char * unix_port=0; static char * unix_port=0;
static char *opt_plugin_dir= 0, *opt_default_auth= 0; static char *opt_plugin_dir= 0, *opt_default_auth= 0;
static bool sql_log_bin_off= false;
#ifdef HAVE_SMEM #ifdef HAVE_SMEM
static char *shared_memory_base_name=0; static char *shared_memory_base_name=0;
...@@ -598,6 +599,31 @@ static my_bool sql_connect(MYSQL *mysql, uint wait) ...@@ -598,6 +599,31 @@ static my_bool sql_connect(MYSQL *mysql, uint wait)
} }
static int maybe_disable_binlog(MYSQL *mysql)
{
if (opt_local && !sql_log_bin_off)
{
if (mysql_query(mysql, "set local sql_log_bin=0"))
{
my_printf_error(0, "SET LOCAL SQL_LOG_BIN=0 failed; error: '%-.200s'",
error_flags, mysql_error(mysql));
return -1;
}
}
sql_log_bin_off= true;
return 0;
}
int flush(MYSQL *mysql, const char *what)
{
char buf[FN_REFLEN];
my_snprintf(buf, sizeof(buf), "flush %s%s",
(opt_local && !sql_log_bin_off ? "local " : ""), what);
return mysql_query(mysql, buf);
}
/** /**
@brief Execute all commands @brief Execute all commands
...@@ -627,17 +653,6 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -627,17 +653,6 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
struct my_rnd_struct rand_st; struct my_rnd_struct rand_st;
char buff[FN_REFLEN + 20]; char buff[FN_REFLEN + 20];
if (opt_local)
{
sprintf(buff, "set local sql_log_bin=0");
if (mysql_query(mysql, buff))
{
my_printf_error(0, "SET LOCAL SQL_LOG_BIN=0 failed; error: '%-.200s'",
error_flags, mysql_error(mysql));
return -1;
}
}
for (; argc > 0 ; argv++,argc--) for (; argc > 0 ; argv++,argc--)
{ {
int command; int command;
...@@ -649,6 +664,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -649,6 +664,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
my_printf_error(0, "Too few arguments to create", error_flags); my_printf_error(0, "Too few arguments to create", error_flags);
return 1; return 1;
} }
if (maybe_disable_binlog(mysql))
return -1;
sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]); sprintf(buff,"create database `%.*s`",FN_REFLEN,argv[1]);
if (mysql_query(mysql,buff)) if (mysql_query(mysql,buff))
{ {
...@@ -666,6 +683,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -666,6 +683,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
my_printf_error(0, "Too few arguments to drop", error_flags); my_printf_error(0, "Too few arguments to drop", error_flags);
return 1; return 1;
} }
if (maybe_disable_binlog(mysql))
return -1;
if (drop_db(mysql,argv[1])) if (drop_db(mysql,argv[1]))
return -1; return -1;
argc--; argv++; argc--; argv++;
...@@ -706,7 +725,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -706,7 +725,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_PRIVILEGES: case ADMIN_FLUSH_PRIVILEGES:
case ADMIN_RELOAD: case ADMIN_RELOAD:
if (mysql_query(mysql,"flush privileges")) if (flush(mysql, "privileges"))
{ {
my_printf_error(0, "reload failed; error: '%s'", error_flags, my_printf_error(0, "reload failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -910,7 +929,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -910,7 +929,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_LOGS: case ADMIN_FLUSH_LOGS:
{ {
if (mysql_query(mysql,"flush logs")) if (flush(mysql, "logs"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -920,7 +939,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -920,7 +939,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_BINARY_LOG: case ADMIN_FLUSH_BINARY_LOG:
{ {
if (mysql_query(mysql, "flush binary logs")) if (flush(mysql, "binary logs"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -930,7 +949,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -930,7 +949,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_ENGINE_LOG: case ADMIN_FLUSH_ENGINE_LOG:
{ {
if (mysql_query(mysql,"flush engine logs")) if (flush(mysql, "engine logs"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -940,7 +959,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -940,7 +959,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_ERROR_LOG: case ADMIN_FLUSH_ERROR_LOG:
{ {
if (mysql_query(mysql, "flush error logs")) if (flush(mysql, "error logs"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -950,7 +969,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -950,7 +969,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_GENERAL_LOG: case ADMIN_FLUSH_GENERAL_LOG:
{ {
if (mysql_query(mysql, "flush general logs")) if (flush(mysql, "general logs"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -960,7 +979,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -960,7 +979,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_RELAY_LOG: case ADMIN_FLUSH_RELAY_LOG:
{ {
if (mysql_query(mysql, "flush relay logs")) if (flush(mysql, "relay logs"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -970,7 +989,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -970,7 +989,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_SLOW_LOG: case ADMIN_FLUSH_SLOW_LOG:
{ {
if (mysql_query(mysql,"flush slow logs")) if (flush(mysql, "slow logs"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -980,7 +999,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -980,7 +999,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_HOSTS: case ADMIN_FLUSH_HOSTS:
{ {
if (mysql_query(mysql,"flush hosts")) if (flush(mysql, "hosts"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -990,7 +1009,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -990,7 +1009,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_TABLES: case ADMIN_FLUSH_TABLES:
{ {
if (mysql_query(mysql,"flush tables")) if (flush(mysql, "tables"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1000,7 +1019,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1000,7 +1019,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_STATUS: case ADMIN_FLUSH_STATUS:
{ {
if (mysql_query(mysql,"flush status")) if (flush(mysql, "status"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1010,7 +1029,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1010,7 +1029,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_TABLE_STATISTICS: case ADMIN_FLUSH_TABLE_STATISTICS:
{ {
if (mysql_query(mysql,"flush table_statistics")) if (flush(mysql, "table_statistics"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1020,7 +1039,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1020,7 +1039,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_INDEX_STATISTICS: case ADMIN_FLUSH_INDEX_STATISTICS:
{ {
if (mysql_query(mysql,"flush index_statistics")) if (flush(mysql, "index_statistics"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1030,7 +1049,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1030,7 +1049,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_USER_STATISTICS: case ADMIN_FLUSH_USER_STATISTICS:
{ {
if (mysql_query(mysql,"flush user_statistics")) if (flush(mysql, "user_statistics"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1040,7 +1059,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1040,7 +1059,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_USER_RESOURCES: case ADMIN_FLUSH_USER_RESOURCES:
{ {
if (mysql_query(mysql, "flush user_resources")) if (flush(mysql, "user_resources"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1050,7 +1069,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1050,7 +1069,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_CLIENT_STATISTICS: case ADMIN_FLUSH_CLIENT_STATISTICS:
{ {
if (mysql_query(mysql,"flush client_statistics")) if (flush(mysql, "client_statistics"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1060,8 +1079,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1060,8 +1079,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_ALL_STATISTICS: case ADMIN_FLUSH_ALL_STATISTICS:
{ {
if (mysql_query(mysql, if (flush(mysql, "table_statistics,index_statistics,"
"flush table_statistics,index_statistics,"
"user_statistics,client_statistics")) "user_statistics,client_statistics"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
...@@ -1072,8 +1090,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1072,8 +1090,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
} }
case ADMIN_FLUSH_ALL_STATUS: case ADMIN_FLUSH_ALL_STATUS:
{ {
if (mysql_query(mysql, if (flush(mysql, "status,table_statistics,index_statistics,"
"flush status,table_statistics,index_statistics,"
"user_statistics,client_statistics")) "user_statistics,client_statistics"))
{ {
my_printf_error(0, "flush failed; error: '%s'", error_flags, my_printf_error(0, "flush failed; error: '%s'", error_flags,
...@@ -1092,6 +1109,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) ...@@ -1092,6 +1109,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
start_time=time((time_t*) 0); start_time=time((time_t*) 0);
my_rnd_init(&rand_st,(ulong) start_time,(ulong) start_time/2); my_rnd_init(&rand_st,(ulong) start_time,(ulong) start_time/2);
if (maybe_disable_binlog(mysql))
return -1;
if (argc < 1) if (argc < 1)
{ {
my_printf_error(0, "Too few arguments to change password", error_flags); my_printf_error(0, "Too few arguments to change password", error_flags);
......
create user adm@localhost identified by 'foobar';
grant reload on *.* to adm@localhost;
reset master;
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # flush status
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # flush status
drop user adm@localhost;
source include/have_binlog_format_statement.inc;
#
# MDEV-12612 mysqladmin --local flush... to use FLUSH LOCAL
#
create user adm@localhost identified by 'foobar';
grant reload on *.* to adm@localhost;
reset master;
exec $MYSQLADMIN -uadm -pfoobar flush-status;
source include/show_binlog_events.inc;
exec $MYSQLADMIN --local -uadm -pfoobar flush-status;
source include/show_binlog_events.inc;
drop user adm@localhost;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment