Skip to content

Commit f36d9f8

Browse files
author
Nelson Goncalves
committed
BUG#26609909: MYSQL-SHELL DBA.CHECKINSTANCECONFIGURATION()
This patch fixes issues with the checkInstanceConfiguration and configureLocalInstance commands. No check was done to confirm if the account used to run the command had enough privileges to actually execute it. This issue was present in both the checkInstanceConfiguration and configurelocalinstance commands. With this patch, the first operation done in any of the commands (besides input validation) is checking if the provided account has the required privileges and a runtime error is thrown in case it doesn't. Furthermore, a new privilege, the SELECT privilege on all schemas was added to the list of privileges to check. Also, the help options presented in checkInstanceConfiguration were incorrect and showed extra options that the command did not accept. Finally, the SELECT privilege on all schemas was also added to the list of privileges granted to the clusterAdmin account created using the configureLocalinstance command. This patch requires the list of privileges required by the clusterAdmin account to be updated on the manual (https://dev.mysql.com/doc/refman/en/mysql-innodb-cluster-working-with-production-deployment.html), replacing the "GRANT SELECT ON sys.* TO your_user@'%' WITH GRANT OPTION;" " with "GRANT SELECT ON *.* TO your_user@'%' WITH GRANT OPTION;"
1 parent f291cb6 commit f36d9f8

14 files changed

+108
-66
lines changed

modules/adminapi/mod_dba.cc

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -734,36 +734,33 @@ REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL13, "@li sslKey: The path to
734734
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL14, "The options dictionary may contain the following options:");
735735
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL15, "@li mycnfPath: The path of the MySQL configuration file for the instance.");
736736
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL16, "@li password: The password to get connected to the instance.");
737-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL17, "@li clusterAdmin: The name of the InnoDB cluster administrator user.");
738-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL18, "@li clusterAdminPassword: The password for the InnoDB cluster "\
739-
"administrator account.");
740-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL19, "The connection password may be contained on the instance "\
737+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL17, "The connection password may be contained on the instance "\
741738
"definition, however, it can be overwritten "\
742739
"if it is specified on the options.");
743740

744-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL20, "The returned JSON object contains the following attributes:");
745-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL21, "@li status: the final status of the command, either \"ok\" or \"error\"");
746-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL22, "@li config_errors: a list of dictionaries containing the failed requirements");
747-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL23, "@li errors: a list of errors of the operation");
748-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL24, "@li restart_required: a boolean value indicating whether a "\
741+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL18, "The returned JSON object contains the following attributes:");
742+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL19, "@li status: the final status of the command, either \"ok\" or \"error\"");
743+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL20, "@li config_errors: a list of dictionaries containing the failed requirements");
744+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL21, "@li errors: a list of errors of the operation");
745+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL22, "@li restart_required: a boolean value indicating whether a "\
749746
"restart is required");
750747

751-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL25, "Each dictionary of the list of config_errors includes the "\
748+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL23, "Each dictionary of the list of config_errors includes the "\
752749
"following attributes:");
753-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL26, "@li option: The configuration option for which the requirement "\
750+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL24, "@li option: The configuration option for which the requirement "\
754751
"wasn't met");
755-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL27, "@li current: The current value of the configuration option");
756-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL28, "@li required: The configuration option required value");
757-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL29, "@li action: The action to be taken in order to meet the requirement");
752+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL25, "@li current: The current value of the configuration option");
753+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL26, "@li required: The configuration option required value");
754+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL27, "@li action: The action to be taken in order to meet the requirement");
758755

759-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL30, "The action can be one of the following:");
760-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL31, "@li server_update+config_update: Both the server and the "\
756+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL28, "The action can be one of the following:");
757+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL29, "@li server_update+config_update: Both the server and the "\
761758
"configuration need to be updated");
762-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL32, "@li config_update+restart: The configuration needs to be "\
759+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL30, "@li config_update+restart: The configuration needs to be "\
763760
"updated and the server restarted");
764-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL33, "@li config_update: The configuration needs to be updated");
765-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL34, "@li server_update: The server needs to be updated");
766-
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL35, "@li restart: The server needs to be restarted");
761+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL31, "@li config_update: The configuration needs to be updated");
762+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL32, "@li server_update: The server needs to be updated");
763+
REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL33, "@li restart: The server needs to be restarted");
767764

768765
/**
769766
* $(DBA_CHECKINSTANCECONFIGURATION_BRIEF)
@@ -823,8 +820,6 @@ REGISTER_HELP(DBA_CHECKINSTANCECONFIGURATION_DETAIL35, "@li restart: The server
823820
* $(DBA_CHECKINSTANCECONFIGURATION_DETAIL31)
824821
* $(DBA_CHECKINSTANCECONFIGURATION_DETAIL32)
825822
* $(DBA_CHECKINSTANCECONFIGURATION_DETAIL33)
826-
* $(DBA_CHECKINSTANCECONFIGURATION_DETAIL34)
827-
* $(DBA_CHECKINSTANCECONFIGURATION_DETAIL35)
828823
*/
829824
#if DOXYGEN_JS
830825
Undefined Dba::checkInstanceConfiguration(InstanceDef instance, Dictionary options) {}
@@ -1486,7 +1481,6 @@ std::shared_ptr<mysqlsh::mysql::ClassicSession> Dba::get_session(const shcore::A
14861481
shcore::Value::Map_type_ref Dba::_check_instance_configuration(const shcore::Argument_list &args, bool allow_update) {
14871482
shcore::Value::Map_type_ref ret_val(new shcore::Value::Map_type());
14881483
shcore::Value::Array_type_ref errors(new shcore::Value::Array_type());
1489-
std::set<std::string> check_options;
14901484

14911485
// Validates the connection options
14921486
shcore::Value::Map_type_ref instance_def = get_instance_options_map(args, mysqlsh::dba::PasswordFormat::OPTIONS);
@@ -1509,16 +1503,14 @@ shcore::Value::Map_type_ref Dba::_check_instance_configuration(const shcore::Arg
15091503
validate_options = args.map_at(1);
15101504
shcore::Argument_map tmp_map(*validate_options);
15111505

1506+
std::set<std::string> check_options {"password", "dbPassword", "mycnfPath"};
15121507
// The clearReadOnly option is only available in configureLocalInstance
15131508
// i.e. with allow_update set as true
15141509
if (allow_update) {
1515-
check_options = {"password", "dbPassword", "mycnfPath", "clusterAdmin",
1516-
"clusterAdminPassword", "clearReadOnly"};
1517-
} else {
1518-
check_options = {"password", "dbPassword", "mycnfPath", "clusterAdmin",
1519-
"clusterAdminPassword"};
1510+
check_options.insert("clusterAdmin");
1511+
check_options.insert("clusterAdminPassword");
1512+
check_options.insert("clearReadOnly");
15201513
}
1521-
15221514
tmp_map.ensure_keys({}, check_options, "validation options");
15231515
validate_opt_map = tmp_map;
15241516

@@ -1549,6 +1541,19 @@ shcore::Value::Map_type_ref Dba::_check_instance_configuration(const shcore::Arg
15491541
new_args.push_back(shcore::Value(instance_def));
15501542
auto session = Dba::get_session(new_args);
15511543

1544+
// Validate the permissions of the user running the operation.
1545+
if (!validate_cluster_admin_user_privileges(session, session->get_user(),
1546+
session->get_host())) {
1547+
std::string error_msg =
1548+
"Account '" + session->get_user() + "'@'" +
1549+
session->get_host() +
1550+
"' does not have all the required privileges to execute this "
1551+
"operation. For more information, see the online documentation.";
1552+
log_error("%s", error_msg.c_str());
1553+
throw std::runtime_error(error_msg);
1554+
}
1555+
1556+
// Now validates the instance GR status itself
15521557
std::string uri = session->uri();
15531558

15541559
GRInstanceType type = get_gr_instance_type(session->connection());

modules/adminapi/mod_dba_common.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ std::pair<int,int> find_cluster_admin_accounts(std::shared_ptr<mysqlsh::mysql::C
451451
static const std::set<std::string> k_global_privileges{
452452
"RELOAD", "SHUTDOWN", "PROCESS", "FILE",
453453
"SUPER", "REPLICATION SLAVE", "REPLICATION CLIENT",
454-
"CREATE USER"
454+
"CREATE USER", "SELECT"
455455
};
456456

457457
// Schema privileges needed on the metadata schema
@@ -466,7 +466,6 @@ static const std::set<std::string> k_metadata_schema_privileges{
466466
// list of (schema, [privilege]) pairs, with the required privileges on each schema
467467
static const std::map<std::string, std::set<std::string>> k_schema_grants{
468468
{"mysql_innodb_cluster_metadata", k_metadata_schema_privileges},
469-
{"performance_schema", {"SELECT"}},
470469
{"mysql", {"SELECT", "INSERT", "UPDATE", "DELETE"}} // need for mysql.plugin, mysql.user others
471470
};
472471

@@ -560,8 +559,7 @@ bool validate_cluster_admin_user_privileges(std::shared_ptr<mysqlsh::mysql::Clas
560559
static const char *k_admin_user_grants[] = {
561560
"GRANT RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, CREATE USER ON *.*",
562561
"GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.*",
563-
"GRANT SELECT ON performance_schema.*",
564-
"GRANT SELECT ON sys.*",
562+
"GRANT SELECT ON *.*",
565563
"GRANT SELECT, INSERT, UPDATE, DELETE ON mysql.*"
566564
};
567565

unittest/scripts/js_devapi/scripts/dba_adopt_from_gr_interactive.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ var deployed_here = reset_or_deploy_sandboxes();
44

55
shell.connect({host: localhost, port: __mysql_sandbox_port1, user: 'root', password: 'root'});
66

7+
// Create root@<hostname> account with all privileges, required to create a
8+
// cluster.
9+
session.runSql("SET sql_log_bin = 0");
10+
session.runSql("CREATE USER 'root'@'" + hostname + "' IDENTIFIED BY 'root'");
11+
session.runSql("GRANT ALL PRIVILEGES ON *.* to 'root'@'" + hostname +
12+
"'WITH GRANT OPTION");
13+
session.runSql("SET sql_log_bin = 1");
14+
715
//@ Create cluster
816
if (__have_ssl)
917
var cluster = dba.createCluster('testCluster', {memberSslMode: 'REQUIRED'});

unittest/scripts/js_devapi/scripts/dba_check_instance_configuration_session.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@ var deployed_here = reset_or_deploy_sandbox(__mysql_sandbox_port1);
99
//@ Check Instance Configuration ok with a session
1010
dba.checkInstanceConfiguration({host: localhost, port: __mysql_sandbox_port1, password:'root'});
1111

12+
//@ Error: user has no privileges to run the checkInstanceConfiguration command (BUG#26609909)
13+
shell.connect({host: localhost, port: __mysql_sandbox_port1, user: 'root', password: 'root'});
14+
// Create account with all privileges but remove one of the necessary privileges
15+
session.runSql("SET sql_log_bin = 0");
16+
session.runSql("CREATE USER 'test_user'@'%'");
17+
session.runSql("GRANT ALL PRIVILEGES ON *.* to 'test_user'@'%' WITH GRANT OPTION");
18+
session.runSql("REVOKE SELECT on *.* FROM 'test_user'@'%'");
19+
session.runSql("SET sql_log_bin = 1");
20+
dba.checkInstanceConfiguration({host: localhost, port: __mysql_sandbox_port1, user: 'test_user', password:''});
21+
// Drop user
22+
session.runSql("SET sql_log_bin = 0");
23+
session.runSql("DROP user 'test_user'@'%'");
24+
session.runSql("SET sql_log_bin = 1");
25+
1226
// Remove the sandbox
1327
if (deployed_here)
1428
cleanup_sandbox(__mysql_sandbox_port1);

unittest/scripts/js_devapi/scripts/dba_configure_local_instance.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
// Assumptions: smart deployment rountines available
2-
//@ Initialization
3-
var deployed_here = reset_or_deploy_sandboxes();
42

53
//@<OUT> create GR admin account using configureLocalInstance
64
var cnfPath1 = __sandbox_dir + __mysql_sandbox_port1 + "/my.cnf";
75
dba.configureLocalInstance("root@localhost:"+__mysql_sandbox_port1, {mycnfPath: cnfPath1, dbPassword:'root', clusterAdmin: "gr_user", clusterAdminPassword: "root"});
86

7+
//@ Error: user has no privileges to run the configure command (BUG#26609909)
8+
shell.connect({host: localhost, port: __mysql_sandbox_port1, user: 'root', password: 'root'});
9+
// Remove select privilege to make sure an error is thrown
10+
session.runSql("SET sql_log_bin = 0");
11+
session.runSql("REVOKE SELECT on *.* FROM 'gr_user'@'%'");
12+
session.runSql("SET sql_log_bin = 1");
13+
dba.configureLocalInstance("gr_user@localhost:"+__mysql_sandbox_port1, {mycnfPath: cnfPath1, dbPassword:'root'});
14+
// restore select privilege to gr_user
15+
session.runSql("SET sql_log_bin = 0");
16+
session.runSql("GRANT SELECT on *.* TO 'gr_user'@'%'");
17+
session.runSql("SET sql_log_bin = 1");
18+
919
//@ create cluster using cluster admin account (BUG#26523629)
1020
shell.connect({host: localhost, port: __mysql_sandbox_port1, user: 'gr_user', password: 'root'});
11-
1221
if (__have_ssl)
1322
var cluster = dba.createCluster('devCluster', {memberSslMode:'REQUIRED', clearReadOnly: true});
1423
else
@@ -65,8 +74,3 @@ wait_slave_state(cluster, 'third_sandbox', "ONLINE");
6574
//@<OUT> Check saved auto_inc settings are restored
6675
shell.connect({scheme: 'mysql', host: localhost, port: __mysql_sandbox_port3, user: 'root', password: 'root'});
6776
session.runSql("show global variables like 'auto_increment_%'").fetchAll();
68-
69-
//@ Finalization
70-
shell.connect({scheme: 'mysql', host: localhost, port: __mysql_sandbox_port1, user: 'root', password: 'root'});
71-
session.runSql("DROP USER 'gr_user'@'%'");
72-
cleanup_sandboxes(deployed_here);

unittest/scripts/js_devapi/validation/dba_check_instance_configuration_session.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@
66

77
//@ Check Instance Configuration ok with a session
88
||
9+
10+
//@ Error: user has no privileges to run the checkInstanceConfiguration command (BUG#26609909)
11+
||Dba.checkInstanceConfiguration: Account 'test_user'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.

unittest/scripts/js_devapi/validation/dba_configure_local_instance.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
//@ Initialization
2-
||
3-
41
//@<OUT> create GR admin account using configureLocalInstance
52
{
63
"status": "ok"
74
}
85

6+
//@ Error: user has no privileges to run the configure command (BUG#26609909)
7+
||Dba.configureLocalInstance: Account 'gr_user'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
8+
99
//@ create cluster using cluster admin account (BUG#26523629)
1010
||
1111

@@ -146,6 +146,3 @@
146146
"2"
147147
]
148148
]
149-
150-
//@ Finalization
151-
||

unittest/scripts/js_devapi/validation/dba_help.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -407,9 +407,6 @@ The options dictionary may contain the following options:
407407

408408
- mycnfPath: The path of the MySQL configuration file for the instance.
409409
- password: The password to get connected to the instance.
410-
- clusterAdmin: The name of the InnoDB cluster administrator user.
411-
- clusterAdminPassword: The password for the InnoDB cluster administrator
412-
account.
413410

414411
The connection password may be contained on the instance definition, however,
415412
it can be overwritten if it is specified on the options.

unittest/scripts/js_devapi/validation/dba_interactive.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@ Validating instance...
122122
|Number of accounts: 1|
123123

124124
//@ Dba: configureLocalInstance not enough privileges 1
125-
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
125+
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
126126

127127
//@ Dba: configureLocalInstance not enough privileges 2
128-
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
128+
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
129129

130130
//@ Dba: configureLocalInstance not enough privileges 3
131-
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
131+
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
132132

133133
//@ Dba: Show list of users to make sure the user missingprivileges@% was not created
134134
|Number of accounts: 0|

unittest/scripts/js_devapi/validation/dba_no_interactive.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161
|Number of accounts: 1|
162162

163163
//@ Dba: configureLocalInstance not enough privileges
164-
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
164+
||Dba.configureLocalInstance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
165165

166166
//@ Dba: Show list of users to make sure the user missingprivileges@% was not created
167167
|Number of accounts: 0|

unittest/scripts/py_devapi/validation/dba_help.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,9 +409,6 @@
409409

410410
- mycnfPath: The path of the MySQL configuration file for the instance.
411411
- password: The password to get connected to the instance.
412-
- clusterAdmin: The name of the InnoDB cluster administrator user.
413-
- clusterAdminPassword: The password for the InnoDB cluster administrator
414-
account.
415412

416413
The connection password may be contained on the instance definition, however,
417414
it can be overwritten if it is specified on the options.

unittest/scripts/py_devapi/validation/dba_interactive.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@
122122
|Number of accounts: 1|
123123

124124
#@ Dba: configure_local_instance not enough privileges 1
125-
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
125+
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
126126

127127
#@ Dba: configure_local_instance not enough privileges 2
128-
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
128+
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
129129

130130
#@ Dba: configure_local_instance not enough privileges 3
131-
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
131+
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
132132

133133
#@ Dba: Show list of users to make sure the user missingprivileges@% was not created
134134
|Number of accounts: 0|

unittest/scripts/py_devapi/validation/dba_no_interactive.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161
|Number of accounts: 1|
162162

163163
#@ Dba: configure_local_instance not enough privileges
164-
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the privileges to create an user for managing an InnoDB cluster.
164+
||Dba.configure_local_instance: Account 'missingprivileges'@'localhost' does not have all the required privileges to execute this operation. For more information, see the online documentation.
165165

166166
#@ Dba: Show list of users to make sure the user missingprivileges@% was not created
167167
|Number of accounts: 0|

0 commit comments

Comments
 (0)