MySQL Blog Archive
For the latest blogs go to
The MySQL 8.0.2 Milestone Release is available

The MySQL Development team is happy to announce our 8.0.2 development milestone release (DMR), now available for download at (8.0.2 adds features to 8.0.1 and 8.0.0). The source code is available at GitHub. You can find the full list of changes and bug fixes in the 8.0.2 Release Notes. Here are the highlights. Enjoy!

SQL Window Functions

Add first batch of SQL window functions (WL#9236) – This work by Dag Wanvik implements SQL window functions in MySQL. A window function performs a calculation across a set of table rows that are somehow related to the current row. Support for window functions (a.k.a. analytic functions) is a frequent user request. Window functions have long been part of standard SQL (SQL 2003).

Add remaining non-aggregate window functions (WL#9603) – This work by Dag Wanvik and Chaithra Gopalareddy adds the non-aggregate window functions missing from WL#9236 above. These functions are PERCENT_RANK, CUME_DIST, NTH_VALUE, LEAD, and LAG.

Additional aggregate window functions (WL#9727) – This work by Dag Wanvik and Chaithra Gopalareddy adds aggregate window functions missing from WL#9236  above. These functions are MIN, MAX, STD, STDDEV, STDDEV_POP, STDDEV_SAMP, VARIANCE, VAR_POP, and VAR_SAMP.


Ranges in JSON path expressions (WL#9831) – This work by Knut Anders Hatlen extends the syntax for ranges in JSON path expressions. The new syntax introduced is a subset of the SQL standard syntax, described in SQL:2016, 9.39 SQL/JSON path language: syntax and semantics. See also Bug#79052 reported by Roland Bouman.

Add JSON_STORAGE_SIZE / JSON_STORAGE_FREE functions (WL#9192) – This work by Knut Anders Hatlen adds JSON functions related to space usage for a given JSON object. The JSON_STORAGE_SIZE returns the required storage size in bytes for JSON stings. For a native-type it returns the actual size in bytes. The JSON_STORAGE_FREE returns the free space of a JSON binary type in bytes (including fragmentation and padding saved for inplace update). For a JSON string, it creates an intermediate binary representation and returns the padding that is taken for this object.

Support for partial update of JSON in the optimizer (WL#8963) – This work by Knut Anders Hatlen speeds up update of JSON documents, which are stored as BLOBs. If only some parts of a JSON document are updated, we want to give information to the handler about what was changed, so that the storage engine and replication don’t need to write the full document. This work is for the optimizer’s part only.

Provide logical diffs for partial update of JSON values (WL#10570) – This work by Knut Anders Hatlen adds support for partial update with the JSON_REMOVE function, in addition to the JSON_SET and JSON_REPLACE functions which got support for partial update in WL#8963. In a replicated environment, it cannot be guaranteed that the layout of a JSON document is exactly the same on the slave and the master, so the physical diffs cannot be used to reduce the network I/O for row-based replication. This work will provides logical diffs that row-based replication can send over the wire and reapply on the slave.


Ellipsoidal relational operations and R-tree support functions (WL#8685) – This work by Norvald Ryeng extends spatial relational functions such as ST_Contains and ST_Crosses to detect that their parameters are in a geographical (ellipsoidal) SRS and to compute their results on the ellipsoid. The behavior of each ST function is as defined in SQL/MM Part 3 Spatial.

Character Sets

Add Japanese kana sensitive collation to utf8mb4 (WL#10480) – This work by Xing Zhang implements utf8mb4_ja_0900_as_cs collation which sorts characters by using three levels’ weight. But users also wants to have a collation which has additional kana sensitive feature. The new collation is named utf8mb4_ja_0900_as_cs_ks, where ‘ks’ stands for ‘kana sensitive’.

Add utf8mb4 accent sensitive and case insensitive collation (WL#10818) – This work by Xing Zhang Add adds the utf8mb4 accent sensitive and case insensitive collation utf8mb4_0900_as_ci.

Varlen keys for sorting multibyte String values (WL#9554) – This work by Steinar Gunderson introduces variable-length keys when sorting NO PAD collations. PAD collations still need to be fixed length, because they are conceptually extended to infinity. It builds on the existing semantics for sorting JSON using variable-length keys.

Use utf8mb4 in libmysql and command tools (WL#10353) – This work by Bharathy Satish changes the default charset for client tools from latin1 to utf8mb4. Client tools include following: mysql, mysqladmin, mysqldump, mysqlcheck, mysqlpump, mysqlimport, mysql_upgrade, mysqltest, mysqlshow, and mysqlslap.

Change MTR tests to run with new default charset (WL#10297, WL#10300, WL#10418, WL#10319, WL#10298, WL#10296) – This work by Deepa Dixit adopts optimizer test cases to the new default character set, i.e. from latin1 to utf8mb4.


Extend ANALYZE TABLE with histogram support (WL#8943) – This work by Erik Froseth manages histograms statistics. This includes adding histogram statistics to one or more columns, as well as removing existing histogram statistics. The syntax for ANALYZE TABLE has been extended to accept two new clauses: UPDATE HISTOGRAM ON column [, column] WITH n BUCKETS and DROP HISTOGRAM ON column [, column]. The histogram statistics are stored in the dictionary table “column_statistics” and accessible through the view information_schema.COLUMN_STATISTICS. However, this work does not cover how histograms are used by the optimizer.

Performance Schema

PERFORMANCE_SCHEMA, TABLE PLUGIN (WL#8879) – This work by Mayank Prasad allows dynamic plugins to provide their own performance schema tables. Before this work, all performance schema tables have been hard coded in the core server.

Configuration Variables

Allow SET PERSIST to set read-only variables too (WL#9787) – This work by Bharathy Satish allows SET PERSIST to set read-only variables. The new values will take effect at the next server restart. Before this work SET PERSIST could only set variables that was settable as SET GLOBAL. Note that a small subset of read-only variables are left intentionally not settable.


Replace MLOG_FILE_NAME with MLOG_FILE_OPEN (WL#9499) – This work changes the way open tablespaces are tracked and logged to the redo log. Instead of tracking table space use in every mini-transaction the table spaces in use are tracked when they are opened / closed / dropped. This work reverts some of the code changes done by WL#7142 and WL#7806 as these worklogs caused performance regressions due to the high frequency of checking and tracking the table space use in mini-transactions.

Undo Tablespaces

Make the number of undo tablespaces and rollback segments dynamic (WL#9507) – This work by Kevin Lewis redesigns the way rollback segments are found in undo tablespaces. Furthermore, this work allows the setting innodb_undo_tablespaces to be increased or decreased at runtime or at startup. If increased, new undo tablespaces will be created and then atomically added to the list of active undo tablespaces. If decreased, the list of active undo tablespaces is atomically reduced in size. Existing undo tablespaces will continue to be used by existing transactions and eventually will become inactive.

In-Memory Storage Engine

Compact In-Memory Temporary Tables (WL#8117) – This work by Vasil Dimov implements a MEMORY-like storage engine that supports variable length columns in an efficient way – that is, if a VARCHAR(100) column contains ‘abcd’ it must be stored in about 4 bytes, not in about 100 bytes. This engine is used as a replacement for the MEMORY engine by server internals.

Error Logging

Logging services: Improved error logging in 8.0 (WL#9323) – This work by Tatjana Nurnberg outlines the changes to error logging in 8.0. The high level view is that error logging becomes pluggable in 8.0 using the new service infrastructure. We introduce error numbers for error log messages and we separate between creating an error event and how it is reported. The new error logging can be thought of as a sequence of log filters followed by parallel log writers (log sinks).

Logging services: log filter (filtering engine) (WL#9342) – This work by Tatjana Nurnberg implements a filtering service (API) and a default filtering service implementation (component). Filtering here means to suppress certain log messages (selection) and/or fields within a given log message (projection).

Logging services: log writers (WL#9343) – This work by Tatjana Nurnberg implements a log writer service (API) and a default log writer service implementation (component).  Log writers accept a log event and writes it to a log. This log can be a classic file, syslog, EventLog and a new JSON log writer.

Logging services: error messages (WL#9344) – This work by Tatjana Nurnberg updates the calls to error-logging in the server code to leverage the new features introduced by WL#9323.


Improve usability when receiver thread is waiting for disk space (WL#10406) – This work by Joao Gramacho makes the replication monitoring work even when the receiver thread is waiting for disk space. This work also makes the receiver thread safely stoppable even when waiting for disk space.

Add transaction length to gtid_log_event (WL#10493) – This work by Joao Gramacho adds the transaction length to the Gtid_log_event in the binary log. This work is a stepping stone for optimizing the applier, optimizing the protocol, and optimizing the binary log.

Group Replication

Flow-control fine tuning (WL#9838) – This work by Vitor Oliveira enables the user to fine tune the flow-control mechanism in GR. Three new options are introduced: group_replication_flow_control_min_quota, group_replication_max_quota, and group_replication_member_quota_percent. These options can be used to optimize the lag between members and to keep the throughput as stable as possible.

Monitoring improvements (WL#10380) – This work by Jaideep Karande improves Group Replication by introducing additional columns in the existing performance schema tables replication_group_member and replication_group_member_stats. The work adds additional member related information like member role, version and additional stats.

Disallow writes after leave group (WL#10611) – This work by Anibal Pinto enables super read only when STOP GROUP_REPLICATION is executed preventing clients to execute writes after it. After this feature, clients applications will not be able to change data when the server disconnects from the group (it automatically sets super_read_only). Thus the system as a whole is now more resilient when it comes to dealing with situations where accidental updates are routed to disconnected servers.

Member weight for automatic primary election on failover (WL#10433) – This work by Hemant Dangi enables the user to influence the primary member election in single-primary mode by providing a member weight value for each member node. This member weight value will be used for electing primary member instead of lowest server uuid which has been used until now.

Notify listener services on relevant group events (WL#10412) – This work by Luis Soares implements a notification framework in the group replication plugin. On view changes, recovery state updates, network partitioning and primary election, the plugin will call out to listeners registered in the service registry and notify them that an event has occurred.

MySQL GCS – Minor Refactoring: Information on nodes are duplicated in several modules and classes (WL#9834) – This work by Alfranio Correia refactors code to eliminate some duplicated code related to node’s properties and improves tracking and handling of information of nodes that get back online and rejoin a group.

MySQL GCS: Update XCom in Group Replication (WL#10632) – This work by Tiago Jorge brings the latest XCom code to the latest version of Group Replication.


Allow grants and revokes for PUBLIC (WL#924) – This work by Kristofer Petterson introduces the configuration variable mandatory-roles which can be used for automatic assignment and granting of default roles when new users are created.

Define and implement authorization model to manage XA-transactions (WL#7194) – This work by Dmitry Shulga introduces a new system privilege XA_RECOVER_ADMIN which controls the capability to execute the statement XA RECOVER. An attempt to do XA RECOVER by a user whom wasn’t granted the new system privilege XA_RECOVER_ADMIN will cause an error.

Add mysqld_safe-functionality to server (WL#10441) – This work by Dyre Tjeldvoll implement parts of the logic currently found in the mysqld_safe script inside the server. The work improves server usability in some scenarios for example when using the --daemonize startup option. The work also make users less dependent upon the mysqld_safe script, which we hope to remove in the future. It also fixes Bug#75343 reported by Peter Laursen.

Service Infrastructure

Add a UDF registration service (WL#8020) – This work by Georgi Kodinov defines a new plugin service which allows e.g. plugin_init() to dynamically register UDF functions and e.g. plugin_deinit() to de-register them. This allows for defining all the functions with a single INSTALL PLUGIN command.

MySQL string functionalities as a service for mysql_server component (WL#9503) – This work by Venkata Sidagam implements string functions as a general service in the new service infrastructure. The motivation behind this work is to convert the existing password validation plugin into a component in the new service infrastructure.

Parser Refactoring

True bottom-up server parser: refactoring of the ALTER TABLE statement (WL#8657) – This work by Gleb Shchepa refactors ALTER TABLE|VIEW statement-related parser grammar rules in a pure bottom-up style to make it (grammar) context-independent for the better maintainability and extendability.

X Protocol

IN Operator for JSON (WL#10612) – This work by Grzegorz Szwarc introduces new CONTAINS and NOT_CONTAINS operators. These operators can be used in any valid expression in CRUD operations. CONTAINS accept JSON values at the left and right sides of the operator, including expressions that generate a JSON value.

Crud.Insert with upsert (WL#9807) – This work by Grzegorz Szwarc introduces an INSERT ... ON DUPLICATE KEY UPDATE ... like command for collections. The UPSERT command allows performing an insert or update, depending on whether the document already exists or not, in a single step, atomically.


Update InnoDB specific metadata into new DD for DDL (WL#9525) – This work by Bin Su propogates InnoDB specific metadata into the new data dictionary for DDL operations. More specifically, it adds storage engine private data to dictionary tables for CREATE TABLE, CREATE TABLESPACE, ALTER TABLE etc.

Instantiate InnoDB in-memory metadata with new DD objects (WL#9534) – This work by Jimmy Yang instantiates the InnoDB in-memory metadata from the newDD objects.

FTS index support for new DD (WL#9530) – This work by Shaohua Wang enables Full Text Search functionality along with the new data dictionary.

Enable table encryption and transparent compression (WL#9531) – This work by Zheng Lai enables encryption and transparent compression for the new data dictionary project.

Move data dictionary tables to a single tablespace (WL#9532) – This work by Bin Su creates tablespace mysql and datafile mysql.ibd and uses this tablespace for data dictionary tables.

Support in-place ALTER PARTITION (WL#9559) – This work by Bin Su implements add, drop, coalesce, reorganize, rebuild, exchange partition by native partitioning.

Upgrade steps for new data dictionary (WL#9357) – This work by Satya Bodapaty outlines the upgrade steps for the new data dictionary.

Support InnoDB table import/export for new DD (WL#9537) – This work by Zheng Lai ensures that IMPORT and EXPORT works correctly with the new data dictionary.


Support flexible creation and versioning of virtual P_S tables (WL#7900) – This work by Dmitry Shulga allows the performance schema engine to create it’s own tables, and versioning is added to help handle changes in these table definitions. This work is a prerequisite performance schema table plugin, see WL#8879 above.

Upgrade for InnoDB Internal Dictionary Migration (WL#9461)- This work by Abhishek Ranjan migrates the content of the InnoDB internal dictionary to the Data Dictionary. With the implementation of Data Dictionary for Server, InnoDB will remove its internal Data Dictionary. InnoDB will store its metadata in Server Data dictionary. Dictionary provides se_private_id and se_private_data columns to be used by Storage Engines. Upgrade from older MySQL versions needs to migrate the content of the InnoDB internal dictionary onto the Data Dictionary.  This provide a way to migrate the contents of InnoDB internal dictionary to the Data Dictionary. This includes all the innodb internal metadata related to tablespaces, tables, indexes, and foreign keys, currently stored by InnoDB dictionary only.

Extend SHOW statements to list hidden columns and index information (WL#9570) – This work by Praveenkumar Hulakund implements SHOW EXTENDED COLUMNS and SHOW EXTENDED INDEX. The former list hidden columns of a table. The latter lists hidden indexes and index elements. Aside from the SHOW EXTENDED command, the INFORMATION_SCHEMA and SHOW commands will not list hidden columns.

Update schema tables of dynamic plugins into data dictionary (WL#9495) – This work by Gopal Shankar deals with various aspects of how dynamic plugins interact with the data dictionary. For example, when a plugin is loaded or unloaded it will need to register or unregister plugin meta-data in data dictionary tables.

MTR Tests

Remove all references to embedded server from tests (WL#10185) – This work by Parakh Agarwal removes all references to embedded server. It removes tests that can only run on embedded server and removes checks for embedded on tests that cannot run on embedded server. On removal of the embedded server see MySQL 8.0: Retiring support for libmysqld.

Migrate main suite to run with innodb (part 15) (WL#9490) – This work by Parakh Agarwal is a continuation of the work to migrate MTR tests from using the MyISAM storage engine to using the InnoDB storage engine. Several tests has been migrated in previous work. This work migrate tests that need functional changes to work with InnoDB.

Changes to Defaults

Change default for explicit_defaults_for_timestamp to ON (WL#9687) – This work by Abhishek Ranjan changes the default value of explicit_defaults_for_timestamp from “0” to “1”. The option explicit_defaults_for_timestamp was introduced in 5.6. We expect this option to be removed in the future, making explicit defaults for timestamps mandatory.

Enable PFS MDL instrumentation by default (WL#9629) – This work by Marc Alff changes the compiled default from OFF to ON for performance-schema-instrument='wait/lock/metadata/sql/%=ON'. This is an enabler for adding MDL oriented views in SYS. MDL instrumentation is useful for understanding lurking locking problems, which are not clear in SHOW PROCESSLIST etc. See also Morgan Tocker’s suggestion in Bug#80823.

Enable PFS memory instrumentation by default (WL#9625) – This work by Marc Alff changes the compiled default from OFF to COUNTED for performance-schema-instrument='memory/%=COUNTED'. This is important because the accounting is incorrect if instrumentation is enabled after server start, i.e. you could get a negative balance from missing an allocation, but catching a free.

Enable PFS transaction instrumentation by default (WL#9628) – This work by Marc Alff changes the compiled default from OFF to ON for the following settings: performance-schema-consumer-events-transactions-current=ON, performance-schema-consumer-events-transactions-history=ON, and performance-schema-instrument='transaction%=ON'.

Change default for innodb_undo_tablespaces from 0 to 2 (WL#10498) – This work by Kevin Lewis changes the default value for innodb_undo_tablespaces from “0” to “2”.

Change default for innodb_undo_log_truncate from OFF to ON (WL#10499) – This work by Kevin Lewis changes the default value for innodb_undo_log_truncate from “OFF” to “ON”.

Enable Binary Log Expiration (WL#10478) – This work by Dhruthi K.V changes the default value for variable expire_logs_days from “0” to “30”. The new default (30) causes mysqld to periodically purge unused binary logs that are older than 30 days. The old value “0” will disable any automatic binary log purges.

Store Replication Metadata In InnoDB (WL#10474) – This work by Deepthi E.S ensures that replication meta-data is stored in InnoDB by default. The work changes the default values of master-info-repository and relay-log-info-repository from FILE to TABLE.

Enable Transaction Write Sets (WL#10477) – This work by Dhruthi K.V changes the default value transaction-write-set-extraction from “OFF” to “XXHASH64”. By using Transaction Write Sets, the master has to do slightly more work to generate the write sets which is helpful in conflict detection. This allows users to easily move into GR since transaction-write-set is a requirement for GR. Also, the new default will make users to easily enable binary log writeset parallelization on master to speed up replication.

Defaults: Enable Hash Scans In RBR (WL#10476) – This work by Parveez Baig changes the default value of slave_rows_search_algorithms from INDEX_SCAN,TABLE_SCAN to INDEX_SCAN,HASH_SCAN. The work enables the use of a hash table to avoid repeated table scans when no Primary Key or Primary Key Equivalent (non-null unique secondary index) exists on a table.

Deprecation and Removal

Deprecate libmysqld embedded server in 5.7 (WL#9722) – This work by Marc Alff ensures that the libmysqld embedded server is documented as being deprecated in 5.7. No code change, this task is to update the documentation only.

Deprecate innodb_undo_logs in 5.7 (WL#10322) – This work by Kevin Lewis adds a deprecation warning for innodb_undo_logs in 5.7 and removes it in 8.0. The setting innodb_undo_logs has been an alias for innodb_rollback_segments since it was introduced in 5.6. In 8.0 we will no longer use the words “undo log” to refer to a rollback segment, but the original setting, innodb_rollback_segments, will remain. In 8.0 each undo tablespace will contain this number of rollback segments. In 8.0, the meaning of the innodb_rollback_segments setting will change to “number of rollback segments per undo tablespace”. The undo tablespaces that this applies to are the system tablespace, the shared temporary tablespace, and any other undo tablespace.

Deprecate and remove “Delphi style” column and table syntax (WL#8662) – This work by Gleb Shchepa removes support for the old Deplhi style syntax for columns and table names in 8.0. Deplhi style syntax, a dot sign followed by the column/table name, will give an SQL syntax error in 8.0. 5.7 will give deprecation warnings for this syntax (.column_name, .table_name.column_name, and .table_name).

Disable symbolic links as compiled default + deprecate variable (WL#8392) – This work by Dyre Tjeldvoll changes the compiled default of symbolic-links from “ON” to “OFF” (aligning with the defacto default used in most sample configuration files). This work also adds a deprecation warning for the option symbolic-links in 5.7. We expect this option to be removed in a future release.

Remove disabling of strict aliasing optimization (GCC) (WL#10344) – This work by Jon Olav Haugli re-enabling the strict aliasing optimization for the GCC compiler. Performance testing has shown 0-4% performance improvement in Sysbench by using the strict aliasing optimization. The largest improvement has been seen for single-threaded performance.

Remove cross compatibility code for binlog V1 and V3 (WL#9219) – This work by Libing Song removes the compatibility code for supporting binlog v1 (used in MySQL 3.23) and v3 (used in MySQL 4.0.2 through 4.1). With this change, both slave and mysqlbinlog will refuse to connect to masters older than 5.0 which generate binary logs of v1 and v3.

That’s it for now. Thank you for using MySQL!