MySQL Blog Archive
For the latest blogs go to
The MySQL 8.0.18 Maintenance Release is Generally Available

The MySQL Development team is very happy to announce that MySQL 8.0.18 is now available for download at In addition to bug fixes there are a few new features added in this release.  Please download 8.0.18 from or from the MySQL  YumAPT, or SUSE repositories. The source code is available at GitHub. You can find the full list of changes and bug fixes in the 8.0.18 Release Notes. Here are the highlights. Enjoy!


Hash join (WL#2241)   This work by Erik Froseth implements hash join as a way of executing inner equi-joins in MySQL. For example SELECT * FROM t1 JOIN t2 ON t1.col1 = t2.col1; can be executed as a hash join in 8.0.18. Hash join does not need any index to execute, and is in most cases more efficient than the current block-nested loop algorithm.

EXPLAIN ANALYZE (WL#4168) This work by Steinar H. Gunderson implements EXPLAIN ANALYZE. EXPLAIN ANALYZE will run the query and then produce EXPLAIN output with additional information about how the optimizer estimates matched the actual execution. EXPLAIN ANALYZE is built on top of the new iterator executor and implements timing iterators on top of the real iterators, giving precise information about each call. For each iterator, we present the estimated execution cost, estimated number of returned rows, the time to return first row,  the time to return all rows (i.e. actual cost), the number of rows returned by this iterator, and the number of loops. The overall query execution is presented as a tree structure where the nodes are iterators.

Iterator UNION  (WL#13000) This work by Steinar H. Gunderson implements UNION, UNION ALL, WITH RECURSIVE and unqualified SELECT COUNT(*) in the new iterator executor framework.

Inject type cast nodes into the item tree to avoid data type mismatches (WL#12108) This work by Catalin Besleaga adds implicit type cast operations into the item tree inside expressions and conditions that have a mismatch between the provided argument’s data type and the expected data type. This work represents internal plumbing and has no visible effect for the user.


Ellipsoidal ST_Distance between any geometry types (WL#12216) This work by Torje Digernes extends distance support for geographic geometries from multipoint and point (WL#9347), to all combinations of point, linestring, polygon, multipoint, multilinestring, multipolygon, and geometry collection (WL#12216).

Only OpenSSL

Remove support for wolfSSL and yaSSL from the MySQL codebase (WL#13290 and WL#13289) This work by Georgi Kodinov removes the wolfSSL and yaSSL support from the MySQL codebase. Moving forward, MySQL will only use OpenSSL as its SSL/TLS library.


Create user identified by random password (WL#11772) This work by Kristofer Älvring adds syntax for CREATE USER/ALTER USER/SET PASSWORD statements to generate a strong random password, returned as a result set row to the client. This functionality makes it easier for users to create a strong password. The added syntax are : CREATE USER user IDENTIFIED BY RANDOM PASSWORD, ALTER USER user IDENTIFIED BY RANDOM PASSWORD, and SET PASSWORD [FOR user] TO RANDOM.


Protocol changes to specify compression configuration for connections (WL#12475 and WL#12039) This work by Bharathy Satish and Thayumanavar X. Sachithanantha extends the MySQL protocol to handle more client-server compression options than just zlib. The initial handshake between the client and the server will choose the best compression method supported by both based on a new capability flag.  The compression method will be defined by the intersection of the client’s and server’s options. Both can be any combination of zlib, zstd and uncompressed. The order of preference for compression is zlib, zstd and unencrypted. I.e. if the server has “unencrypted, zstd” and the client has “zlib, unencrypted, zstd” the zstd compression will be used. The compression level for zstd can be specified too. This feature is based on a contribution from Facebook, see bug#88567.


Replication with restricted privileges (WL#12966) This work by Pedro Figueiredo, Abhinav Agarwal, and Neha Kumari implements privilege checks on replication channels. The motivation is to enable secure replication from an untrusted source to a trusted destination, i.e. set up a replication stream from the “outside” to the “inside” of a security boundary.

Group Replication

Add OFFLINE_MODE to group_replication_exit_state_action  (WL#12895) This work by Nuno Carvalho extends the group_replication_exit_state_action with a new behavior called OFFLINE_MODE. The group_replication_exit_state_action option is used to specify how Group Replication behaves when a server leaves the group unintentionally. The new OFFLINE_MODE behavior closes all connections and disallows new connections from users who do not have the CONNECTION_ADMIN or SUPER privilege, otherwise it behaves like the existing READ_ONLY mode.

TLS 1.3 support (WL#12990) This work by Tiago Jorge and Tiago Vale implements TLS 1.3 support in the GCS/XCom layer. This makes it possible to secure communication using TLS 1.3 among all group members in group replication.

Delivery message service (WL#12896) This work by  Anibal Pinto implements an internal message service to Group Replication. MySQL modules can use the service to transmit generic messages with an identifying tag to all group members, using Group Replication’s existing group communication connection. This work represents internal plumbing and has no visible effect for the user.


Frontend for MySQL Routers keyring (WL#12974)  This work by Jan Kneschke implements user commands which allows the Router Admin user to list the accounts stored in the keyring, remove accounts from the keyring, change password of accounts in the keyring, and change the filename location in the master keyring.

Add optional timestamp resolution to router log (WL#11194) This work by Thomas Nielsen implements sub-second timestamp precision for the Router’s log files. The timestamp precision is configurable using the router config file.

MTR testsuite

Move testcases in rpl suite that needs MyISAM to a separate .test file (WL#13053) This work by Pooja Lamba moves the sections that need MyISAM to a separate .test file . This allows the MTR test suite to run on a server that is built without the MyISAM engine.


InnoDB: Add new option to control write IOPs when idle (WL#13115) This work by Mayank Prasad implements the new option innodb_idle_flush_pct which controls write IOPs when InnoDB is idle. The purpose is to reduce write IO for longer life of the flash storage. This feature is based on a contribution from Facebook, see bug#88566.

Dynamic linking of Protobuf  (WL#13126) This work by Tor Didriksen changes the way Protobuf is linked with the server. MySQL SQL developers desire to use Protobuf outside the XPlugin, e.g. in Replication. This has not been possible since Protobuf cannot be statically linked with more than one component because it maintains an internal state. The solution is to link it dynamically.

Increase max value for max_prepared_stmt_count (WL#13342) This work by  Tor Didriksen increases the max value for max_prepared_stmt_count from 1 to 4 million. The default remains 16K.

Move sys Schema to the mysql server tree (WL#12673) This work by Christopher Powers moves the source code for sys Schema into the main server repository and in general integrates the sys Schema implementation with the Server. This is an internal simplification with no external impact.

Compile time check of error message arguments  (WL#13110) This work by Jens Even Blomsøy implements a CMake configuration option to check  the number and type of error message arguments at compile time. The option -DCHECK_ERRMSG_FORMAT is OFF by default. The motivation is to enable developers to detect mistakes at compile time rather than getting unexpected errors at runtime.

Deprecation and Removal

MySQL 8.0.18 does not remove any features but marks some features as deprecated in 8.0. Deprecated features will be removed in a future major release.

Deprecate the use of MYSQL_PWD environment variable in libmysql (WL#13449) This work by Georgi Kodinov deprecates the legacy behavior in which libmysql reads the password from the OS environment variable MYSQL_PWD if no password is supplied. Using this feature is discouraged because environment variables can be inspected by local users. Users are asked to use other more secure mechanisms for storing passwords.

Deprecate –relay-log-info-file and –master-info-file (WL#11031) This work by Luís Soares addresses the fact that there are deprecation warnings missing for the following two options: relay-log-info-file and master-info-file. These should have been deprecated already together with their “parent” options relay_log_info_repository=FILE and master_info_repository=FILE respectively.

Deprecate slave-rows-search-algorithms  (WL#12892) This work by Luís Soares implements a deprecation warning when a user engages the command line option (or the corresponding system variable) —slave_rows_search_algorithms. The option slave-rows-search-algorithms controls how the replication applier looks up rows in tables, when applying UPDATE or DELETE row events. The default for this option is HASH_SCAN, INDEX_SCAN as of 8.0, and this is always best, both for performance and (in a corner case) for correctness. Thus it is better not to allow alternative algorithms.

Deprecate log_bin_use_v1_row_events (WL#12926) This work by Luís Soares implements a deprecation warning when a user sets or reads the value of log_bin_use_v1_row_events. The current default is V2 row events. V2 was introduced in MySQL 5.6 and since then MySQL can parse and interpret both v1 and v2 row events.

Deprecate WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS (WL#13178) This work by Luís Soares implements a deprecation warning when a user engages the function WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS. The warning states that the user should use WAIT_FOR_EXECUTED_GTID_SET instead of WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS. The former supersedes the latter.

Thank you for using MySQL!