MySQL Shell 9.4 Release Notes

2 Changes in MySQL Shell 9.4.0 (2025-07-22, Innovation Release)

Note

These release notes were created with the assistance of MySQL HeatWave GenAI.

Deprecation and Removal Notes

  • The following, deprecated in previous releases, were removed in this release:

    • -mc

    • -ma

    • -mx

    • --dba=enableXProtocol

    • --dba-log-sql

    • shell.options.outputFormat

    • .routingOptions()

    • addInstances and removeInstances were removed from Cluster.rescan()

    (WL #16922)

AdminAPI Added or Changed Functionality

  • dba.deploy_sandbox_instance() is extended with the option mysqldPath. This option enables you to specify the path to the mysqld binary, or MySQL installation root, to use as the seed instance for your sandbox deployment. (Bug #25423030)

AdminAPI Bugs Fixed

  • It was not possible to import a Routing Guideline with import_routing_guideline() if the guideline's name was already used by an existing guideline on the target topology. Using the force option overwrote the existing guideline with the imported guideline.

    As of this release, the rename option is added to import_routing_guideline(), enabling you to define an alternate name for the imported guideline, which is used in the event of a naming clash. (Bug #37750932)

  • RoutingGuideline.show({"router": routerId}) failed if the guideline was defined on a ClusterSet. (Bug #37739359)

Utilities Added or Changed Functionality

  • Partitioned tables without a primary key are now reported as errors when running a dump with the create_invisible_pks compatibility option set, as all columns used in the partitioning expression must be part of every unique key. Errors are returned similar to the following:

    ERROR: Table `s`.`t` does not have a 
      Primary Key, this cannot be fixed automatically because the 
      table is partitioned (this issue needs to be fixed manually)
    

    (Bug #37892879)

  • The Dump and Load utilities' ociAuth option now supports instance_obo_user. (Bug #37781203)

  • It is now possible to disable collection of host-specific diagnostics information, with the collectDiagnostics utility's hostInfo option.

    hostInfo option defaults to true. To disable, set to false. (Bug #36391259)

Utilities Bugs Fixed

  • util.dumpInstance returned the following error when run against MySQL HeatWave DB Systems:

    ERROR: User 'admin'@'%' is granted restricted privilege: OPTION_TRACKER_OBSERVER 
    (fix this with 'strip_restricted_grants' compatibility option)
          

    The list of privileges has been updated to include OPTION_TRACKER_OBSERVER. (Bug #37958876)

  • It was not possible to dump data from a MySQL HeatWave DB System running MySQL 8.4, if the Hypergraph Optimizer was enabled. Errors were returned similar to the following:

    MySQL Error 3999 (42000): The hypergraph optimizer does
    not yet support 'EXPLAIN with TRADITIONAL format'
        

    As of this release, queries which chunk or fetch data from MySQL HeatWave-enabled tables now use an optimizer hint which disables offloading to MySQL HeatWave. This also improves dump performance. (Bug #37904121)

  • The load dump utility failed if the target MySQL instance did not have Performance Schema enabled. An error similar to the following was returned:

    ERROR: [Worker006]: Error opening connection to MySQL: MySQL Error 1683 (HY000): 
    'ps_current_thread_id': The Performance Schema is not enabled.
          

    As of this release, if the call to ps_current_thread_id() fails for any reason, it is logged, but does not cause the load to stop. (Bug #37867455)

    References: See also: Bug #36197620.

  • A fix introduced in 9.1.0 enabled the dump utilities to compare the server version to the MySQL Shell version and return an error if the server's minor version was greater than MySQL Shell's.

    As of this release, an error is returned only if the server has a higher major version. If the minor version is greater, a warning is logged. (Bug #37866205)

    References: See also: Bug #36701854.

  • MySQL Shell logging has been improved for LOAD DATA warnings generated by util.importTable and util.loadDump. Previously, LOAD DATA warnings were printed to the terminal and were difficult to locate in the log. For example:

    Warning: schema@table@123.tsv.zst error 1062: Duplicate entry
    '1234567' for key 'table.PRIMARY'
    

    These messages have been improved, making them easier to find in the log. For example:

    Warning: An error has been reported while loading data into
    `schema`.`table` from 'schema@table@123.tsv.zst' file, error 1062:
    Duplicate entry '1234567' for key 'table.PRIMARY'
    

    (Bug #37800574)

  • The MySQL REST Service-specific account, ocirest, is automatically excluded when dumping with ocmids:true, or loading into MySQL HeatWave DB Systems. (Bug #37792183)

  • If util.copyInstance or util.loadDump connected using an account without the ALLOW_NONEXISTENT_DEFINER privilege, and tried to copy a non-view DDL object with a DEFINER clause set to an account included in the dump, an error was returned similar to the following:

    Error processing schema `<schema>`: Access denied; you need 
    (at least one of) the SUPER or ALLOW_NONEXISTENT_DEFINER privilege(s) 
    for this operation 
          

    As of this release, the accounts are created before any other DDL objects and grants are applied before view placeholders are replaced with views. (Bug #37669785)

  • The Upgrade Checker utility returned a false positive for partial keys in schemas referencing full keys in other schemas. (Bug #37651453)

  • util.copySchemas() could hang if a dump was loaded or copied using an account which lacked the SELECT privilege on the Performance Schema. The operation hung when indexes were rebuilt. Errors were returned similar to the following:

    MySQL Error 1142 (42000): SELECT command denied to user for table 'events_stages_current'
    

    As of this release, error handling is added for this issue. (Bug #37593239)

Functionality Added or Changed

  • MySQL Shell session objects now support storing client data, providing an alternative to using global dictionaries tied to session IDs, and improving management of session-specific data for plugins written in Python or JS. Several other improvements were made to session objects as part of this enhancement.

    The following changes were made:

    • setClientData() and getClientData() methods added to the classic and X session objects.

    • Added a trackSystemVariable() method to the ClassicSession object to allow tracking SQL_MODE.

    • Added a sqlMode property to the ClassicSession object.

    (Bug #37710803)

  • Shell now supports the storage of generic secrets. You can use the following new functions to manage your secrets:

    • shell.storeSecret(key, value): Stores a secret with the given key.

    • shell.readSecret(key): Reads a secret with the given key.

    • shell.deleteSecret(key): Deletes a secret with the given key.

    • shell.deleteAllSecrets(): Deletes all secrets

    • shell.listSecrets(): Lists keys of all secrets

    Note

    Secrets stored with this API are not accessible to the credential methods listed here: Working with Credentials, nor can this API cannot access credentials managed by that API.

    See Generic Secret Storage for more information. (WL #16958)

Bugs Fixed

  • Custom SQL Handlers did not correctly handle statements preceded by a full line comment. A syntax error was returned, similar to the following:

    mysqlsh.DBError: MySQL Error (1064): You have an error in your SQL syntax; 
    check the manual that corresponds to your MySQL server version for the right 
    syntax to use near 'yourStatement' at line 2
          

    (Bug #37979837)

  • MySQL Shell now supports the --local-infile command-line parameter, similarly to the mysql client.

    See mysqlsh — The MySQL Shell for more information. (Bug #37960814)

  • Kerberos authentication is now supported on macOS. The authentication_kerberos_client plugin is now bundled on macOS installations of MySQL Shell. (Bug #37777584)

  • MySQL Shell could crash when dumping a table with a functional, or virtual, index.

    The following error was returned:

    Segmentation fault (core dumped)
          

    (Bug #37770454)

  • Using placeholders in SQL queries, such as CREATE REST ... OPTIONS { "cache_ttl": ? } with parameters, could return a parse error. (Bug #37196079)

  • MySQL Shell read all profiles in an AWS config file, including those which were not properly prefixed with profile. Error messages were returned similar to the following:

    Could not obtain credentials to assume role using profile 'default';:
    Partial AWS credentials found in config file 
    (/path/.aws/config, profile: 
      nameOfProfile), 
    missing the value of 'aws_secret_access_key' (RuntimeError);.
          

    As of this release, MySQL Shell correctly handles AWS configuration profiles by requiring the profile prefix, ensuring that only valid profiles are read. (Bug #36916939)

  • The runSql() method in the X session did not support ! placeholders. Errors were returned similar to the following:

            MySQL Error (5015): Session.run_sql: Too many arguments
          

    (Bug #34715428)

  • Connections to invalid SSH URIs were not properly closed, resulting in multiple defunct sshd processes. As of this release, tunnel handling is improved and unused tunnels are closed automatically. (Bug #33564687)

  • It was not possible to start MySQL Shell on ARM platforms if PAGE_SIZE was set to 64K. An error similar to the following was displayed:

    mysqlsh: error while loading shared libraries: 
    libssh.so.4 ELF load command aligment not page-aligned
          

    (Bug #118021, Bug #37854467)