When a replica cluster was removed from an InnoDB ClusterSet, reconciliation of view change log events was not carried out if the replica cluster had only a single member (the primary member). If that instance was then used to create a new replica cluster, it contained additional transactions that meant replication could not take place with the other clusters in the InnoDB ClusterSet. View change log events are now always reconciled when a replica cluster is dissolved, even when there is only a single member. (Bug #34069295)
On MySQL sandbox instances created using AdminAPI, an auxiliary MySQL Shell instance is started for AdminAPI operations. Previously, the auxiliary MySQL Shell instance was placed in JSON shell mode using the
MYSQLSH_JSON_SHELL
environment variable. However, if the user’s MySQL Shell instance was also in JSON shell mode, error messages returned to it by the auxiliary MySQL Shell instance could not be parsed because they were already wrapped in JSON documents, so they were not displayed to the user. Auxiliary MySQL Shell instances on sandbox instances now do not use the MYSQLSH_JSON_SHELL environment variable. (Bug #34066667)When the
command orclusterSet
.setPrimaryCluster()
command was used, a divergent GTID set on the target cluster was not reconciled because view change events were filtered out too early in the process. If the binary logs had been purged, the situation could not be repaired and the cluster could not continue to operate in the InnoDB ClusterSet. The GTID set reconciliation process has now been fixed. (Bug #34013718)clusterSet
.rejoinCluster()ClusterSet.status()
returnedOK_NO_TOLERANCE
instead ofOK_NO_TOLERANCE_PARTIAL
for ClusterSets with one or more unreachable members and fewer than the acceptable threshold of online members. (Bug #33989031)It was not possible to stop an InnoDB cluster metadata upgrade if outdated router instances were detected. When prompted to proceed with the upgrade, or not, the upgrade was performed regardless of the user's choice. (Bug #33941759)
AdminAPI’s
command did not identify the new version of Group Replication’s communication protocol that was introduced in MySQL 8.0.27. The command now offers an upgrade to the new communication protocol when it is available. (Bug #33922830)Cluster
.rescan()InnoDB Cluster commands validate that the target instance belongs to the cluster before performing the operation. When the server’s address was compared against the server instances registered in the cluster’s metadata, host names were compared using case sensitivity, which is contrary to the rules in RFC 1034 for domain name comparison. This could lead to a target instance not being identified as part of the cluster. Host names are now checked using a case insensitive comparison. (Bug #33893435)
-
Cluster.dissolve()
did not clean up the metadata and configuration associated with the cluster if the cluster had been removed from a ClusterSet using theforce
option.As of this release,
Cluster.dissolve()
ensures all recovery and ClusterSet replication accounts are removed, and the metadata schema is removed, also. (Bug #33239404) It was possible to add an instance to a cluster although it was already a member of a ReplicaSet. No error was generated as the instance was removed from the ReplicaSet and added to the cluster. As of this release, an error is generated and the action fails. (Bug #31964273)
-
The
replicationLag
value reported byCluster.status()
was not calculated correctly.As of this release, it returns one of the following:
-
The time difference between the last transaction commit timestamp and the last transaction applied timestamp, in HH:MM:SS format.
If multiple workers are used, the value is retrieved from the worker executing the oldest transaction.
null
: The replication connection or SQL thread is not running.applier_queue_applied
: The applier queue has applied everything. That is, if the last queued transaction and the last applied transaction are the same, or the applying transaction is 0.
For more information, see Checking a cluster's Status with
. (Bug #31693765, Bug #106826, Bug #34002328)Cluster
.status() -
-
The InnoDB Cluster
command did not check whether a server instance had been put into offline mode manually by setting theCluster
.status()offline_mode
system variable. The command now checks for this situation and reports the mode asn/a
if the system variable has been set.It also reports a warning, for example:
"instanceErrors": [ "WARNING: Instance has offline_mode enabled." ],
(Bug #107057, Bug #34109382)
-
MySQL Shell closed unexpectedly if an attempt was made to rejoin an instance to a ReplicaSet after that instance was removed from the ReplicaSet and its
server_uuid
altered.As of this release, the
rejoinInstance
command ensures the metadata schema is updated with the newserver_uuid
. (Bug #106847, Bug #34038210)
-
MySQL Server 8.0.30 introduced GIPK mode, Generated Invisible Primary Keys. When running in this mode, for any InnoDB table that is created without an explicit primary key, the MySQL server automatically adds a generated invisible primary key (GIPK) to the table. This mode is enabled by setting
sql_generate_invisible_primary_key
to ON.MySQL Shell's load utility option
createInvisiblePKs
uses the server's GIPK mode to generate invisible primary keys for tables which do not have primary keys.Under certain circumstances, if a user has insufficient privileges to use GIPK mode, MySQL Shell can fall back to the previous method of generating invisible primary keys.
See Dump Loading Utility for more information. (Bug #34409792)
-
util.checkForServerUpgrade
is now run automatically by any of the dump utilities, if the dump option"ocimds": true
is defined and the target instance is MySQL 5.7.For more information on
util.checkForServerUpgrade
, see Upgrade Checker Utility. For more information on the dump utilities, see Instance Dump Utility, Schema Dump Utility, and Table Dump Utility. (Bug #34052980) -
MySQL Shell 8.0.30 supports the Group Replication Communication Stack, introduced in MySQL 8.0.27. This allows a simpler and safer setup as it obsoletes the usage of IP allowlists, removes the explicit need for another network address used for internal GCS communication, and introduces user-based authentication.
This patch adds support in the AdminAPI for the new communication stack by:
Adding support to choose which GR communication stack must be used when creating a Cluster or a Replica Cluster, by exposing a new option named
communicationStack
supportingXCOM
orMYSQL
.Ensures
MYSQL
is the default communication stack in use by Clusters running MySQL 8.0.27, or higher.Automatically and transparently generates and sets all configurations required for both communication stacks at cluster creation and for topology changes (
addInstance
/rejoinInstance
/rescan
), without user intervention.Allows migrating an existing Cluster to a different communication stack when rebooting it from complete outage by exposing a new option named
switchCommunicationStack
.Allows setting a value for
group_replication_local_address
inCluster.rejoinInstance()
by extending the command with a new optionlocalAddress
.Adds a new check in
Cluster.rescan()
to verify whether there is any Cluster member using a recovery account that is not the one created for itself and ensure the right account is used. This ensures instances that fall in that category (added with clone recovery and waitRecovery:0) are able to auto-rejoin the Cluster.Extends
Cluster.rejoinInstance()
anddba.rebootClusterFromCompleteOutage()
to include theipAllowList
andlocalAddress
options.Extends
Cluster.rejoinInstance()
anddba.rebootClusterFromCompleteOutage()
to also perform the instance checks for Cluster compliance asCluster.addInstance()
does.Extends
Cluster.status({extended:1})
, ClusterSet.status({extended:2}), andCluster.options()
to return thecommunicationStack
values.
NoteAs of this release,
group_replication_tls_source
must not be set tomysql_admin
.(WL #14765)
-
The new option,
logSql
/--log-sql
enables you to log all SQL statements executed by MySQL Shell commands or utilities to the MySQL Shell log file.NoteThis option deprecates
dba.logSql
.For more information, see MySQL Shell Logging and Debug. (WL #14749)
-
MySQL Shell supports the S3-compatible cloud storage services, AWS S3 and Oracle Cloud Infrastructure's S3 compatibility API.
See MySQL Shell Utilities. (WL #14387)
-
Under certain circumstances, when dumping an instance for migration from certain compatible databases, the following error was returned during chunking:
ERROR: [Worker004]: Error while chunking `xxxx`.`xxxx`: get_uint(8): field type is String
(Bug #34206985)
The number of rows loaded in each chunk was not written to the progress file. (Bug #34201239)
-
Under certain circumstances, a
loadDump
operation on a dump which contained a syntax error in aCREATE USER
statement could result in a user's password being displayed in the SQL syntax error message.As of this release, if a failed query contains either
IDENTIFIED
orPASSWORD
keywords, the quoted strings are anonymized. (Bug #34141432) When the
dryRun
option was set for MySQL Shell's dump loading utilityutil.loadDump()
, if theupdateGtidSet
option was set toreplace
orappend
, the value of thegtid_purged
system variable on the target server instance was changed, although a dry run is not meant to affect the target server. The issue has now been fixed. (Bug #34127069)On Linux systems, MySQL Shell's password store used the MySQL configuration utility
mysql_config_editor
as a Secret Store Helper, provided that the MySQL client package was installed on the system, andmysql_config_editor
was available in the system’s PATH. Otherwise, the password store functionality was unavailable and MySQL Shell's credential helper functions were unavailable. MySQL Shell now bundlesmysql_config_editor
in Linux builds, so that the functionality can be used if the MySQL client package is not installed on the system. (Bug #34097411)util.debug.collectDiagnostics
did not produce an error if a filename was not included in the command. A nameless zip file was created. As of this release, if a filename is not included in the command, an error is displayed and the zip file is not created. (Bug #34048754)When you use the
shell.create_context
function in MySQL Shell's Python mode to create a scope and context wrapper for a program, you can now use thefinalize()
function to require the release of the file handle created for the logger object in the shell context. (Bug #33988826)When MySQL Shell's instance dump utility
util.dumpInstance()
, schema dump utilityutil.dumpSchemas()
, and table dump utilityutil.dumpTables()
were used to dump tables with compound primary keys, the chunking process could give rise to afilesort
operation to optimize theORDER BY
clause. In the case of a large table with multiple chunks being dumped simultaneously, the operation could cause the dump to fail for lack of disk space. This occurred when aBETWEEN
clause used the same lower and upper bound, so the chunking process now uses an alternative condition in that situation. (Bug #33976259)When MySQL Shell's Python API was used to read date and time data, the conversion did not account for the fact that MySQL can accept invalid date and time values in some SQL modes, leading to Python errors. The data is now only converted into Python values when possible, and in the case of a conversion error, the string representation of the original value is returned. (Bug #33972939)
MySQL Shell's parallel table import utility
util.importTable()
and dump loading utilityutil.loadDump()
have a new optionsessionInitSQL
, which lets you specify a list of SQL statements to run at the start of each client session used for loading data into the target MySQL instance. You can use this option to change session variables. If an error occurs while running the SQL statements, the import stops and returns an error message. (Bug #33969606)In file systems where the
d_type
member does not appear in thedirent
structure, GCC versions prior to 8.4.0 cannot detect the file type. MySQL Shell ignores files with unknown file types, so if it was compiled with an affected GCC version, it was unable to load a dump stored on such a file system. Now, MySQL Shell checks its own GCC version and if it is affected, uses thestat()
function instead to determine file types. (Bug #33951851)Following the extensions to MySQL Shell's
shell.prompt()
function in MySQL Shell 8.0.29, the resulting JSON documents no longer included a new line at the end so that the end of the document could be identified and subsequent user input could be read. The issue has now been fixed. (Bug #33949419)MySQL Shell closed unexpectedly if
shell.reconnect()
was called without a global session. (Bug #33945641)-
When using the X DevAPI
CollectionModify
object, methods which accept a document path as a parameter did not properly handle arguments containing spaces. For example, the following attempted to remove an attribute namedsome
:col.modify("_id='1'").unset("some path")
Paths with spaces must be specified using a path expression or quoted using backtick characters. For example:
col.modify("_id='1'").unset("$.'some path'")
or
col.modify("_id='1'").unset("`some path`")
As of this release, paths containing spaces which are not properly defined with a path expression, such as
some path
or'some path'
, are treated as errors. (Bug #33795166, Bug #33795149) The generic Linux packages for MySQL Shell 8.0.28 and 8.0.29 returned an error due to an indirect dependency on the
krb5
library for SSH support. The library is now bundled with MySQL Shell and the bundled version takes precedence over any system version. (Bug #33787652)/n
was not parsed properly, in Python or JavaScript modes, if MySQL Shell was started with--json
. An error was returned. (Bug #33678846)MySQL Shell's instance dump utility
util.dumpInstance()
, schema dump utilityutil.dumpSchemas()
, and table dump utilityutil.dumpTables()
upload large files to Oracle Cloud Infrastructure Object Storage buckets by chunking them and using multipart uploads. If the dump operation was canceled by the user or stopped due to an exception in a thread, multipart uploads that had already started were left in an active state in the bucket. The utilities now attempt in these situations to stop any multipart uploads pending completion. (Bug #32583524)MySQL Shell's upgrade checker utility
util.checkForServerUpgrade()
now checks for indexes on generated columns usingCONVERT()
,which changed its behavior in MySQL 8.0.28, and warns you to check applications that rely on the previous behavior. (Bug #106419, Bug #33840716)The upgrade checker utility returned an empty table name and an error for orphaned tables. As of this release, the utility parses the
innodb_sys_tables
table for the presence of orphaned tables. (Bug #106372, Bug #33822225)The upgrade checker utility raised errors, during a 5.7 to 8.0 upgrade check, for MySQL 5.7 schema or table names created using reserved names such as
LPT3
,AUX
, orPRN
. These are registered inINFORMATION_SCHEMA.INNODB_SYS_TABLES
by appending@@@
to their names. However, their original names were used inTABLES
. The upgrade checker raised schema consistency errors for such tables. (Bug #105958, Bug #33707127)