[Due to size limitation, this announcement is split in two. This is part 1] 

Dear MySQL users,

MySQL Server 8.0.16, a new version of the popular Open Source
Database Management System, has been released. MySQL 8.0.16 is
recommended for use on production systems.

For an overview of what's new in MySQL 8.0, please see

http://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

For information on installing MySQL 8.0.16 on new servers, please see
the MySQL installation documentation at

  http://dev.mysql.com/doc/refman/8.0/en/installing.html

MySQL Server 8.0.16 is available in source and binary form for a number of
platforms from our download pages at

  http://dev.mysql.com/downloads/mysql/

MySQL Server 8.0.16 is also available from our repository for Linux
platforms, go here for details:

  http://dev.mysql.com/downloads/repo/

Windows packages are available via the Installer for Windows:

  http://dev.mysql.com/downloads/installer/

along with .ZIP (no-install) packages for more advanced needs. 

8.0.16 also comes with a web installer as an alternative to the full
installer.

The web installer doesn't come bundled with any actual products
and instead relies on download-on-demand to fetch only the
products you choose to install. This makes the initial download
much smaller but increases install time as the individual products
will need to be downloaded.

We welcome and appreciate your feedback, bug reports, bug fixes,
patches, etc.:

  http://bugs.mysql.com/report.php

The following link lists the changes in the MySQL 8.0 since
the release of MySQL 8.0.15. It may also be viewed
online at

  http://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html

Enjoy!

==============================================================================
Changes in MySQL 8.0.16 (2019-04-25, General Availability)


     * Account Management Notes

     * C API Notes

     * Character Set Support

     * Compilation Notes

     * Configuration Notes

     * Deprecation and Removal Notes

     * Installation Notes

     * Packaging Notes

     * Parser Notes

     * Performance Schema Notes

     * Plugin Notes

     * Security Notes

     * Spatial Data Support

     * SQL Syntax Notes

     * Test Suite Notes

     * X Plugin Notes

     * Functionality Added or Changed

     * Bugs Fixed

Account Management Notes


     * Previously, users who had the DROP ROLE privilege could
       use the DROP ROLE statement to drop locked or unlocked
       accounts. Now, users who have the DROP ROLE privilege can
       use DROP ROLE only to drop accounts that are locked
       (unlocked accounts are presumably user accounts used to
       log in to the server and not just as roles). Users who
       have the CREATE USER privilege can use DROP ROLE to drop
       accounts that are locked or unlocked. (Bug #28953158, Bug
       #93263)

     * Several changes have been made to MySQL
       account-management capabilities:

          + MySQL now incorporates the concept of user account
            categories, with system and regular users
            distinguished according to whether they have the new
            SYSTEM_USER privilege:
               o System users are users who possess the
                 SYSTEM_USER privilege. A system user can
                 perform operations on both system and regular
                 accounts.
               o Regular users are ordinary users who do not
                 possess the SYSTEM_USER privilege. A regular
                 user can perform operations on regular
                 accounts, but not system accounts.
            If a user has the appropriate privileges to perform
            a given operation on regular accounts, SYSTEM_USER
            enables the user to also perform the operation on
            system accounts. SYSTEM_USER does not imply any
            other privilege, so the ability to perform a given
            account operation remains predicated on possession
            of any other required privileges. For example, if a
            user can grant the SELECT and UPDATE privileges to
            regular accounts, then with SYSTEM_USER the user can
            also grant SELECT and UPDATE to system accounts.
            The distinction between system and regular accounts
            enables better control over certain account
            administration issues by protecting accounts that
            have the SYSTEM_USER privilege from accounts that do
            not have the privilege. For example, the CREATE USER
            privilege enables not only creation of new accounts,
            but modification and removal of existing accounts.
            Without the system user concept, a user who has the
            CREATE USER privilege can modify or drop any
            existing account, including the root account. The
            concept of system user enables restricting
            modifications to the root account (itself a system
            account) so they can be made only by system users.
            Regular users with the CREATE USER privilege can
            still modify or drop existing accounts, but only
            regular accounts.
            Other operational implications of the SYSTEM_USER
            privilege:
               o A session that has the SYSTEM_USER privilege
                 can be killed only by users who have the
                 SYSTEM_USER privilege, in addition to any other
                 required privileges.
               o An account that has the SYSTEM_USER privilege
                 can be specified as the DEFINER for a stored
                 object only by users who have the SYSTEM_USER
                 privilege, in addition to any other required
                 privileges.
               o A role that has the SYSTEM_USER privilege
                 cannot be listed in the value of the
                 mandatory_roles system variable.
            For more information, see Account Categories
            (http://dev.mysql.com/doc/refman/8.0/en/account-categories.html).

          + Previously, it was not possible to grant privileges
            that apply globally except for certain schemas. This
            is now possible if the new partial_revokes system
            variable is enabled. For example, the following
            statements enable an account to select from or
            insert into any table except those in the mysql
            system schema:
SET PERSIST partial_revokes = ON;
GRANT SELECT, INSERT ON *.* TO u1;
REVOKE SELECT, INSERT ON mysql.* FROM u1;

            The server records partial revokes by adding a
            Restrictions attribute to the User_attributes column
            of the mysql.user system table. SHOW GRANTS includes
            REVOKE statements in its output to indicate partial
            revokes.
            For more information, see Privilege Restriction
            Using Partial Revokes
            (http://dev.mysql.com/doc/refman/8.0/en/partial-revokes.html).

          + The GRANT statement has a new AS user [WITH ROLE]
            clause that specifies additional information about
            the privilege context to use for statement
            execution. This syntax is visible at the SQL level,
            although its primary purpose is to enable uniform
            replication across all nodes of grantor privilege
            restrictions imposed by partial revokes, by causing
            those restrictions to appear in the binary log.
            For more information, see GRANT Syntax
            (http://dev.mysql.com/doc/refman/8.0/en/grant.html).

C API Notes


     * The MySQL C API now supports asynchronous functions for
       nonblocking communication with the MySQL server:

          + mysql_real_connect_nonblocking()

          + mysql_real_query_nonblocking()

          + mysql_store_result_nonblocking()

          + mysql_next_result_nonblocking()

          + mysql_fetch_row_nonblocking()

          + mysql_free_result_nonblocking()
       Each function is the asynchronous counterpart to a
       synchronous function that has the same name without a
       _nonblocking suffix. The synchronous functions block if
       reads from or writes to the server connection must wait.
       The asynchronous functions enable an application to check
       whether work on the server connection is ready to
       proceed. If not, the application can perform other work
       before checking again later. See C API Asynchronous
       Interface
(http://dev.mysql.com/doc/refman/8.0/en/c-api-asynchronous-interface.html).

Character Set Support


     * MySQL now supports a new Chinese collation,
       utf8mb4_zh_0900_as_cs, for the utf8mb4 Unicode character
       set. utf8mb4_zh_0900_as_cs is the first Chinese
       language-specific collation available for Unicode in
       MySQL. This collation is accent sensitive and case
       sensitive. Its characteristics are similar to
       utf8mb4_0900_as_cs except that language-specific rules
       take precedence where applicable. For more information,
       see Unicode Character Sets
       (http://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html).

Compilation Notes


     * CMake now causes the build process to link with the llvm
       lld linker for Clang if it is available and not
       explicitly disabled. To disable use of this linker,
       specify the -DUSE_LD_LLD=OFF option. (Bug #29264211)

     * Builds on EL6 and EL7 now try to use the compiler in
       devtoolset-8 rather than devtoolset-7. (Bug #29198846)

     * The minimum version of the Boost library for server
       builds is now 1.69.0. (Bug #29114233)

     * The configuration-time check for Visual Studio 2017 was
       not specific enough. The check for MySQL compilation now
       requires at least Visual Studio update 15.8, which is
       version number 1915. (Bug #28970895)

     * MySQL now can be compiled using C++14. The following
       minimum version requirements apply for compiler support:

          + GCC 5.3 (Linux)

          + Clang 4.0 (FreeBSD)

          + XCode 9 (MacOS)

          + Developer Studio 12.6 (Solaris)

          + Visual Studio 2017 (Windows)

Configuration Notes


     * MySQL configuration now requires a minimum CMake version
       of 3.4.3. This requires the use of cmake3 rather than
       cmake on some Red Hat and Oracle Linux platforms. (Bug
       #29246216)

     * The WITH_LZMA CMake option was removed. (Bug #29153932,
       Bug #93755)

     * The EXCLUDE_FROM_ALL option is now used in CMake
       configuration as appropriate so that libraries are built
       only if they are actually used by any executable. (Bug
       #29052599)

     * The new WITH_JEMALLOC CMake option indicates whether to
       link with -ljemalloc. If enabled, built-in malloc(),
       calloc(), realloc(), and free() routines are disabled.
       The default is OFF. (Bug #29027974)

     * The new WITH_LSAN CMake option indicates whether to run
       LeakSanitizer, without AddressSanitizer. The default is
       OFF. (Bug #28936574)

     * The new WITH_ROUTER CMake option indicates whether to
       build MySQL Router. The default is ON. (Bug #28759234)

     * MySQL Server now supports a --validate-config option that
       enables the startup configuration to be checked for
       problems without running the server in normal operational
       mode. For more information, see Server Configuration
       Validation
(http://dev.mysql.com/doc/refman/8.0/en/server-configuration-validation.html).

Deprecation and Removal Notes


     * The TempTable storage engine now always uses InnoDB to
       manage internal temporary tables on disk, and the choice
       of storage engine employed for this task is no longer
       user-configurable. The internal_tmp_disk_storage_engine
       system variable has been removed. (Bug #91377, Bug
       #28234637)
       References: See also: Bug #28081038, Bug #82556, Bug
       #27408352.

Installation Notes


     * Previously, after installation of a new version of MySQL,
       the MySQL server automatically upgrades the data
       dictionary tables at the next startup, after which the
       DBA is expected to invoke mysql_upgrade manually to
       upgrade the system tables in the mysql schema, as well as
       objects in other schemas such as the sys schema and user
       schemas.
       The server now performs the tasks previously handled by
       mysql_upgrade. After installation of a new MySQL version,
       the server now automatically performs all necessary
       upgrade tasks at the next startup and is not dependent on
       the DBA invoking mysql_upgrade. In addition, the server
       updates the contents of the help tables (something
       mysql_upgrade did not do). A new --upgrade server option
       provides control over how the server performs automatic
       data dictionary and server upgrade operations. For more
       information, see Upgrading MySQL
       (http://dev.mysql.com/doc/refman/8.0/en/upgrading.html).
       This change to the upgrade procedure results in some
       deprecations:

          + mysql_upgrade is deprecated because it is no longer
            necessary.

          + The --no-dd-upgrade server option is deprecated
            because the --upgrade option supersedes it.
       mysql_upgrade and the --no-dd-upgrade option will be
       removed in a future MySQL version. (Bug #28146052, Bug
       #28162609, Bug #91205, Bug #29185739, Bug #27740692, Bug
       #28547424, Bug #91961)

Packaging Notes


     * Binary packages that include curl rather than linking to
       the system curl library now use curl 7.64.0. (Bug
       #29357198)

     * The Henry Spencer regex library (extra/regex) is no
       longer used by MySQL 8.0 and is no longer present in
       source distributions. (Bug #29192306)

     * RPM packages now have dependencies on libtirpc and rpcgen
       because newer versions of glibc do not include Sun RPC.
       (Bug #28995257)

     * The support-files/magic file was removed from the MySQL
       source tree. Most MySQL file formats are covered by
       operating system file type capabilities. (Bug #18335080,
       Bug #71898)

Parser Notes


     * The parser no longer accepts the undocumented and
       nonstandard = alias_name syntax for specifying table
       aliases. (Bug #29205289)

     * The parser is now permits several additional nonreserved
       keywords to be used as labels within stored programs that
       previously were restricted from such use: ACCOUNT,
       ALWAYS, BACKUP, CLOSE, FORMAT, GROUP_REPLICATION, HOST,
       INVISIBLE, OPEN, OPTIONS, OWNER, PARSER, PORT, REMOVE,
       RESTORE, ROLE, SECONDARY, SECONDARY_ENGINE,
       SECONDARY_LOAD, SECONDARY_UNLOAD, SECURITY, SERVER,
       SOCKET, SONAME, UPGRADE, VISIBLE, WRAPPER. (Bug
       #29033659)

     * The parser accepted ODBC escape syntax for outer joins ({
       OJ outer_join }), but also accepted identifiers other
       than OJ. The parser now accepts only OJ.
       Note
       OJ now is a nonreserved keyword.
       (Bug #22320942)

Performance Schema Notes


     * MySQL now includes built-in SQL functions that format or
       retrieve Performance Schema data, and that may be used as
       equivalents for existing sys schema stored functions:

          + FORMAT_BYTES(): Converts a byte count to a value
            with units. Similar to sys.format_bytes().

          + FORMAT_PICO_TIME(): Converts a time in picoseconds
            to a value with units. Similar to sys.format_time().

          + PS_THREAD_ID(): Returns the Performance Schema
            thread ID for a given thread. Similar to
            sys.ps_thread_id() invoked with a non-NULL argument.

          + PS_CURRENT_THREAD_ID(): Returns the Performance
            Schema thread ID for the current thread. Shortcut
            for sys.ps_thread_id() invoked with a NULL argument.
       The built-in functions can be invoked in any schema and
       require no qualifier, unlike the sys functions, which
       require either a sys. schema qualifier or that sys be the
       current schema.
       The built-in functions supersede the corresponding sys
       functions, which now are deprecated and will be removed
       in a future MySQL version. Applications that use the sys
       functions should be adjusted to use the built-in
       functions instead, keeping in mind some minor differences
       between the sys functions and the built-in functions. See
       Performance Schema Functions
(http://dev.mysql.com/doc/refman/8.0/en/performance-schema-functions.html).

     * The new Performance Schema keyring_keys table exposes
       metadata for keys in the MySQL Keyring. Key metadata
       includes key IDs, key owners, and backend key IDs. The
       keyring_keys table does not expose any sensitive keyring
       data such as key contents. See The keyring_keys table
       (http://dev.mysql.com/doc/refman/8.0/en/keyring-keys-table.html).

Plugin Notes


     * MySQL now includes a ddl_rewriter plugin that modifies
       CREATE TABLE statements received by the server before it
       parses and executes them. The plugin removes ENCRYPTION,
       DATA DIRECTORY, and INDEX DIRECTORY clauses, which may be
       helpful when restoring tables from SQL dump files created
       from databases that are encrypted or that have their
       tables stored outside the data directory. For example,
       the plugin may enable restoring such dump files into an
       unencrypted instance or in an environment where the paths
       outside the data directory are not accessible. When
       installed, ddl_rewriter exposes the Performance Schema
       memory/rewriter/ddl_rewriter instrument for tracking
       plugin memory use. For more information, see The
       ddl_rewriter Plugin
       (http://dev.mysql.com/doc/refman/8.0/en/ddl-rewriter.html).

Security Notes


     * Previously, if the grant tables were corrupted, the MySQL
       server wrote a message to the error log but continued as
       if the --skip-grant-tables option had been specified.
       This resulted in the server operating in an unexpected
       state unless --skip-grant-tables had in fact been
       specified. Now, the server stops after writing a message
       to the error log unless started with --skip-grant-tables.
       (Starting the server with that option enables you to
       connect to perform diagnostic operations.) (Bug
       #29394501, Bug #94394)

     * The OpenSSL libraries bundled with MySQL on some
       platforms (Windows, macOS, and Generic Linux) have been
       upgraded to version 1.0.2r. On all other platforms, MySQL
       uses the system installed OpenSSL. Issues fixed in the
       new OpenSSL version are described at
       http://www.openssl.org/news/vulnerabilities.html. (Bug
       #28988091)

     * Granting roles to anonymous users is no longer supported
       because such roles caused problematic behavior. (Bug
       #28910120)

     * OpenSSL 1.1.1 supports the TLS v1.3 protocol for
       encrypted connections, and MySQL now supports TLS v1.3 as
       well, if compiled using OpenSSL 1.1.1 or higher:

          + Some TLSv1.3 ciphersuites are enabled by default.
            The tls_ciphersuites system variable enables
            explicitly specifying which TLSv1.3 ciphersuites the
            server permits.

          + The --tls-ciphersuites client option enables
            specifying which TLSv1.3 ciphersuites a client
            permits. This option applies to these programs:
            mysql, mysqladmin, mysqlbinlog, mysqlcheck,
            mysqldump, mysqlimport, mysqlpump, mysqlshow,
            mysqlslap, mysqltest, mysql_secure_installation, and
            mysql_upgrade.

          + The mysql_options() C API function has a new
            MYSQL_OPT_TLS_CIPHERSUITES option that enables
            specifying from within the client library which
            TLSv1.3 ciphersuites a client program permits.
       For more information, see Encrypted Connection Protocols
       and Ciphers
(http://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-protocols-ciphers.html).
       Note
       Currently, Group Replication does not support TLSv1.3.

     * The SSL context the server uses for new connections now
       is reconfigurable at runtime. This capability may be
       useful, for example, to avoid restarting a MySQL server
       that has been running so long that its SSL certificate
       has expired. Dynamic SSL reconfigurability is based on
       these changes:

          + The system variables that define the SSL context are
            dynamic and can be changed at runtime: ssl_ca,
            ssl_capath, ssl_cert, ssl_cipher, ssl_crl,
            ssl_crlpath, ssl_key, tls_ciphersuites. tls_version.

          + The ALTER INSTANCE statement supports a RELOAD TLS
            action that reconfigures the SSL context from the
            current values of the system variables that define
            the context.

          + These status variables reflect the SSL context the
            server uses for new connections: Current_tls_ca,
            Current_tls_capath, Current_tls_cert,
            Current_tls_cipher, Current_tls_ciphersuites,
            Current_tls_crl, Current_tls_crlpath,
            Current_tls_key, Current_tls_version.
            ALTER INSTANCE RELOAD TLS updates those status
            variables from the corresponding system variable
            values when it reconfigures the SSL context.
       For more information, see Server-Side Runtime
       Configuration for Encrypted Connections
(http://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html#using-encrypted-connections-server-side-runtime-configuration).
       Thanks to Facebook for submitting code for a similar
       feature (although the code was not used).
       References: See also: Bug #27980097.

     * In MySQL 8.0, the default authentication plugin was
       changed from mysql_native_password. to
       caching_sha2_password. Because caching_sha2_password
       provides a superset of the capabilities of the
       sha256_password authentication plugin, sha256_password is
       now deprecated and will be removed in a future MySQL
       version. MySQL accounts that authenticate using
       sha256_password should be migrated to use
       caching_sha2_password instead.

Spatial Data Support


     * The ST_Length() function now takes an optional second
       argument enabling the unit for the return value to be
       specified. Permitted units are those listed in the new
       INFORMATION_SCHEMA ST_UNITS_OF_MEASURE table. See
       LineString and MultiLineString Property Functions
(http://dev.mysql.com/doc/refman/8.0/en/gis-linestring-property-functions.html),
       and The INFORMATION_SCHEMA ST_UNITS_OF_MEASURE Table
       (http://dev.mysql.com/doc/refman/8.0/en/st-units-of-measure-table.html).

SQL Syntax Notes


     * Incompatible Change: In MySQL 5.7, specifying a FOREIGN
       KEY definition for an InnoDB table without a CONSTRAINT
       symbol clause, or specifying the CONSTRAINT keyword
       without a symbol, causes InnoDB to use a generated
       constraint name. That behavior changed in MySQL 8.0, with
       InnoDB using the FOREIGN KEY index_name value instead of
       a generated name. Because constraint names must be unique
       per schema (database), the change caused errors due to
       foreign key index names that were not unique per schema.
       To avoid such errors, the new constraint naming behavior
       has been reverted, and InnoDB once again uses a generated
       constraint name.
       For consistency with InnoDB, the NDB storage engine now
       uses a generated constraint name if the CONSTRAINT symbol
       clause is not specified, or the CONSTRAINT keyword is
       specified without a symbol. In NDB releases based on
       MySQL 5.7 and earlier MySQL 8.0 releases, NDB used the
       FOREIGN KEY index_name value.
       The changes described above may introduce
       incompatibilities for applications that depend on the
       previous foreign key constraint naming behavior. (Bug
       #29173134)

     * Previously, MySQL permitted a limited form of CHECK
       constraint syntax, but parsed and ignored it. MySQL now
       implements the core features of table and column CHECK
       constraints, for all storage engines. Constraints are
       defined using CREATE TABLE and ALTER TABLE statements.
       For more information, see CHECK Constraints
(http://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html).
       (Bug #11744849, Bug #3464, Bug #3465, Bug #11746042, Bug #22759)

Test Suite Notes


     * mysql-test-run.pl now supports the MTR_UNIQUE_IDS_DIR
       environment variable, which may be set to specify a
       unique-IDs directory to be used as the common location
       for all chroot environments by multiple simultaneous
       mysql-test-run.pl instances. This enables those instances
       to avoid conflicts when reserving port numbers. Thanks to
       Facebook for the contribution. (Bug #29221085, Bug
       #93950)

     * The my_safe_process program was renamed to
       mysqltest_safe_process and now is installed with other
       binaries such as mysqltest rather than with test suite
       files. (Bug #29198969)

     * These changes to the all_persisted_variables test were
       implemented:

          + It limits the number of hardcoded values in the test
            output by putting them into local variables. New
            patches that are then rebased on top that add new
            system variables do not need to change as many lines
            of the original test case, making it easier on the
            rebase process.

          + It removes entries for bugs that were fixed and
            modifies the queries to include the system variables
            that were not tested due to open bugs.
       Thanks to the Facebook team for the contribution. (Bug
       #29013375, Bug #93478)

X Plugin Notes


     * X Plugin previously returned a StmtExecuteOk message to
       the client after query cleanup had ended and the session
       had been deactivated. The message is now returned as soon
       as the result is known and before query cleanup, which
       gives a noticeable improvement in performance. (Bug
       #28997370)

     * X Plugin logged the system message "X Plugin ready for
       connections" when user connections were not available
       because preparation of I/O interfaces had failed. (Bug
       #28906360)

     * Some items in the X Plugin code were not instrumented for
       the Performance Schema by default. (Bug #28898155)

     * X Protocol now supports the COM_RESET_CONNECTION utility
       command to reset the session state without
       re-authenticating or closing the connection. (Bug
       #28732455)

     * X Plugin produced compilation warnings when the MySQL
       Server source code was built using the Clang 8 compiler.
       (Bug #28732158)

Functionality Added or Changed


     * InnoDB: When the amount of memory occupied by the
       TempTable storage engine exceeds the limit defined by the
       temptable_max_ram variable, the TempTable storage engine
       allocates space for internal in-memory temporary tables
       as memory-mapped temporary files. This behavior is now
       controlled by the temptable_use_mmap variable, which can
       be disabled to have the TempTable storage engine use
       InnoDB on-disk internal temporary tables instead. For
       more information, see Internal Temporary Table Use in
       MySQL
       (http://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html).
       (Bug #28944457)

     * InnoDB: undo and purge subsystem counters were added for
       monitoring background activities associated with undo log
       truncation. For counter names and descriptions, query the
       INFORMATION_SCHEMA.INNODB_METRICS table.
SELECT NAME, SUBSYSTEM, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS
 WHERE NAME LIKE '%truncate%';

       For information about enabling counters and querying
       counter data, see InnoDB INFORMATION_SCHEMA Metrics Table
(http://dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-metrics-table.html).
       (Bug #28813526)

     * InnoDB: The new innodb_spin_wait_pause_multiplier
       variable provides greater control over the duration of
       spin-lock polling delays that occur when a thread waits
       to acquire a mutex or rw-lock. Delays can now be tuned
       more finely to account for differences in PAUSE
       instruction duration on different processor
       architectures. For more information, see Configuring Spin
       Lock Polling
(http://dev.mysql.com/doc/refman/8.0/en/innodb-performance-spin_lock_polling.html).

     * InnoDB: An internal service interface was added to
       support tracking of modified pages.

     * InnoDB: The InnoDB data-at-rest encryption feature now
       supports encryption of the mysql system tablespace. The
       mysql system tablespace contains the mysql system
       database and the MySQL data dictionary tables.

     * Some InnoDB memory allocation functions that previously
       were evaluated at runtime now are evaluated at compile
       time, resulting in performance improvements. (Bug
       #29370811, Bug #94380)

     * The semi-join optimizations for IN subqueries have been
       extended to work with EXISTS subqueries as well; these
       can now be handled with the same semi-join strategies as
       IN subqueries, including first-match, materialization,
       duplicate weedout and loose index scan.
       In addition, the optimizer decorrelates
       trivially-correlated equality predicates in the WHERE
       condition attached to the subquery, so that they can be
       treated similarly to expressions in IN subqueries. The
       decorrelation is now also performed for IN subqueries as
       well as EXISTS subqueries.
       All hints and optimizer switches applicable to IN
       subqueries which are transformed into semi-join
       operations are also applicable to transformed EXISTS
       subqueries. All limitations on such optimization of IN
       subqueries also apply to transformed EXISTS subqueries,
       so that, for example, aggregate EXISTS subqueries cannot
       be transformed.
       For more information, see Optimizing Subqueries, Derived
       Tables, View References, and Common Table Expressions
       with Semi-Join Transformations
       (http://dev.mysql.com/doc/refman/8.0/en/semi-joins.html).

     * For consistency with the SQL standard and other RDBMS,
       table aliases are now supported in single-table as well
       as multi-table DELETE statements. (Bug #27455809)

     * The group communication engine for Group Replication
       (XCom, a Paxos variant) includes a cache for messages
       (and their metadata) that are exchanged between the group
       members as a part of the consensus protocol. Among other
       functions, the message cache is used for recovery by
       members that return to the group after a period where
       they were unable to communicate with the other group
       members.
       Previously, the size limit for the message cache was
       fixed at 1GB of memory, and the maximum number of
       messages in the cache was also fixed. However, now that
       the group_replication_member_expel_timeout system
       variable (introduced in MySQL 8.0.13) can be set to allow
       up to an hour for members to return to the group rather
       than being expelled, having a fixed 1GB limit on the size
       of the cache could cause such nodes to be unable to
       recover the messages they missed on re-establishing
       communication.
       For this reason, from MySQL 8.0.16, XCom's message cache
       has no fixed limit on the number of messages it can
       contain, and is only bounded by the limit set for the
       amount of memory it can use. The cache size limit can be
       set using the new group_replication_message_cache_size
       system variable, which has a default and minimum setting
       of 1GB, as used in previous MySQL Server versions. If the
       cache size limit is reached, XCom removes the oldest
       entries that have been decided and delivered. The cache
       size limit can be increased or reduced dynamically at
       runtime. If you reduce the cache size limit, XCom removes
       the oldest entries that have been decided and delivered
       until the current size is below the limit. Group
       Replication's Group Communication System (GCS) alerts
       you, by a warning message, when a message that is likely
       to be needed for recovery by a member that is currently
       unreachable is removed from the message cache. (Bug
       #26482507)

     * Large messages sent between Group Replication group
       members can now be split into multiple messages when they
       exceed a user-defined threshold size. Sending an
       abnormally large message can result in some group members
       being reported as failed and expelled from the group.
       This is because the single thread used by the group
       communication engine (XCom, a Paxos variant) is occupied
       processing the message for too long, so some of the group
       members might report the receiver as failed.
       The new system variable
       group_replication_communication_max_message_size can be
       used to specify the maximum message size for Group
       Replication communications. Messages greater than this
       size are automatically split into fragments that are sent
       separately and reassembled by the recipients. Message
       delivery for a fragmented message is considered complete
       when all the fragments of the message have been received
       and reassembled by all the group members. Fragmentation
       is applied by default, and can be switched off by
       specifying a zero value for the system variable.
       Because older MySQL Server releases do not support
       message fragmentation, in order to ensure backward
       compatibility, Group Replication now has the concept of a
       communication protocol for the group. The communication
       protocol version is set to accommodate the oldest MySQL
       Server version that you want the group to support. A
       MySQL server at version X can only join and reach ONLINE
       status in a replication group if the group's
       communication protocol version is less than or equal to
       X.
       You can inspect the communication protocol in use by a
       group by using the new
       group_replication_get_communication_protocol() UDF, which
       returns the oldest MySQL Server version that the group
       supports. Versions from MySQL 5.7.14 allow compression of
       messages, and versions from MySQL 8.0.16 also allow
       fragmentation of messages. When a new member joins a
       replication group, it checks the communication protocol
       version that is announced by the existing members of the
       group. If the joining member supports that version, it
       joins the group and uses the communication protocol that
       the group has announced, even if the member supports
       additional communication capabilities. If the joining
       member does not support the communication protocol
       version, it is expelled from the group.
       If you need to change the communication protocol version
       of a group so that members at earlier releases can join,
       use the new
       group_replication_set_communication_protocol() UDF to
       specify the MySQL Server version of the oldest member
       that you want to allow. This makes the group fall back to
       a compatible communication protocol version if possible.
       If you upgrade all the members of a replication group to
       a new MySQL Server release, the group's communication
       protocol version is not automatically upgraded to match.
       If you no longer need to support members at earlier
       releases, use the
       group_replication_set_communication_protocol() UDF to set
       the communication protocol version to the new MySQL
       Server version to which you have upgraded the members.
       (Bug #26438884, Bug #23240361, Bug #28474580, Bug #91830,
       Bug #28642504, Bug #26941977, Bug #29240931)

     * For Group Replication, the new system variable
       group_replication_autorejoin_tries lets you specify the
       number of tries that a member makes to automatically
       rejoin the group if it is expelled, or if it is unable to
       contact a majority of the group before the
       group_replication_unreachable_majority_timeout setting is
       reached. The default setting, 0, means that the member
       does not try to rejoin, and proceeds to the action
       specified by the group_replication_exit_state_action
       system variable.
       Activate auto-rejoin if you can tolerate the possibility
       of stale reads and want to minimize the need for manual
       intervention, especially where transient network issues
       fairly often result in the expulsion of members. If you
       specify a number of tries, when the member's expulsion or
       unreachable majority timeout is reached, it makes an
       attempt to rejoin (using the current plugin option
       values), then continues to make further auto-rejoin
       attempts up to the specified number of tries. After an
       unsuccessful auto-rejoin attempt, the member waits 5
       minutes before the next try. During the auto-rejoin
       procedure, the member remains in super read only mode and
       displays an ERROR state on its view of the replication
       group. The member can be stopped manually at any time by
       using a STOP GROUP_REPLICATION statement or shutting down
       the server. If the specified number of tries is exhausted
       without the member rejoining or being stopped, the member
       proceeds to the action specified by the
       group_replication_exit_state_action system variable,
       which can be either remaining in super read only mode or
       shutting down. (Bug #25673350, Bug #84784, Bug #28732174)

     * WHERE conditions making comparisons between constants and
       column values in which the constant value is out of range
       or of the wrong type with respect to the column type are
       now handled during optimization rather than during
       execution. For example, given a table t with a column c
       whose type is TINYINT UNSIGNED, the condition in the
       query SELECT * FROM t WHERE c < 256 can be folded to
       SELECT * FROM t WHERE TRUE because 256 is out of range
       for a column of this type. Comparisons with NULL columns
       can also be optimized; if the column c is nullable, the
       same query can be optimized as SELECT * FROM t WHERE c IS
       NOT NULL.
       The comparisons that can be treated in this manner are >,
       >=, <, <=, =, <>/!=, and <=>. (BETWEEN and IN are not
       currently supported.) Types for which comparisons can be
       folded based on range and type include integer,
       floating-point, and fixed-point numeric types. BIT is not
       supported by this optimization, nor are columns of date
       and time types.
       For more information, see Constant-Folding Optimization
(http://dev.mysql.com/doc/refman/8.0/en/constant-folding-optimization.html).
       (Bug #90100, Bug #25484743, Bug #29048682, Bug #27703371)
       References: See also: Bug #28172538.

     * When binary log and relay log encryption is in use on a
       MySQL server (binlog_encryption=ON), you can now rotate
       the binary log master key at any time while the server is
       running by issuing ALTER INSTANCE ROTATE BINLOG MASTER
       KEY. You can do this on a regular basis to comply with
       your organization's security policy, and also if you
       suspect that the current or any of the previous binary
       log master keys might have been compromised.
       When you rotate the binary log master key, the new master
       key is used to encrypt the file passwords for the new
       binary log and relay log files, and subsequent files
       until the key is changed again. The file passwords for
       existing encrypted binary log files and relay log files
       on the server are also re-encrypted in turn using the new
       binary log master key, starting with the most recent
       files. Any unencrypted files are skipped. Finally, all
       binary log encryption keys that no longer apply to any
       retained binary log files or relay log files are cleaned
       up from the keyring.

     * Table encryption can now be managed globally by defining
       and enforcing encryption defaults. The
       default_table_encryption variable defines an encryption
       default for newly created schemas and general
       tablespaces. The encryption default for a schema can also
       be defined using the DEFAULT ENCRYPTION clause when
       creating a schema. By default, a table inherits the
       encryption of the schema or general tablespace it is
       created in.
       Encryption defaults are enforced by enabling the
       table_encryption_privilege_check variable. The privilege
       check occurs when creating or altering a schema or
       general tablespace with an encryption setting that
       differs from the default_table_encryption setting, or
       when creating or altering a table with an encryption
       setting that differs from the default schema encryption.
       The TABLE_ENCRYPTION_ADMIN privilege permits overriding
       default encryption settings when
       table_encryption_privilege_check is enabled.
       For more information, see Defining an Encryption Default
       for Schemas and General Tablespaces
(http://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace-encryption.html#innodb-schema-tablespace-encryption-default).

     * The system variable group_replication_exit_state_action
       specifies how Group Replication behaves when a server
       instance leaves the group unintentionally, for example
       after encountering an applier error, or in the case of a
       loss of majority, or when another member of the group
       expels it due to a suspicion timing out. Before the
       system variable was introduced, the server's response in
       these situations was to switch MySQL to super read only
       mode by setting the system variable super_read_only to
       ON. group_replication_exit_state_action provided the
       alternative option for the server to shut itself down,
       which minimizes the possibility of stale reads and means
       that servers do not need to be pro-actively monitored for
       failures. When the system variable was introduced in
       MySQL 5.7.24 and MySQL 8.0.12, the default was set to
       READ_ONLY in 5.7 for compatibility with the existing
       behavior, and to ABORT_SERVER in 8.0. Following user
       feedback, the default has now been changed to READ_ONLY
       from MySQL 8.0.16.

     * When insertions, deletions, or updates are made to
       partitioned tables, the binary log now records
       information about the partition and (if any) the
       subpartition in which the row event took place. A new row
       event is created for a modification that takes place in a
       different partition or subpartition, even if the table
       involved is the same. So if a transaction involves three
       partitions or subpartitions, three row events are
       generated. For an update event, the partition information
       is recorded for both the "before" image and the "after"
       image. The partition information is displayed if you
       specify the -v or --verbose option when viewing the
       binary log using mysqlbinlog. Partition information is
       only recorded when row-based logging is in use
       (binlog_format=ROW).

Bugs Fixed


     * NDB Cluster: EXPLAIN of a query executed with table
       access type eq_ref could also show a condition being
       pushed down, even when condition pushdown was not
       supported for the query. Now the access type is checked
       before NDB checks the condition for a possible pushdown
       optimization.
       This fix does not affect handling of tables which are
       part of a pushed join, for which NDB continues to support
       pushed conditions as before. (Bug #27429615)
       References: See also: Bug #27397802, Bug #27808758, Bug
       #90301.

     * InnoDB: Undo tablespaces remained unencrypted after
       enabling undo tablespace encryption at startup. (Bug
       #29477795)

     * InnoDB: Problematic macros introduced with undo
       tablespace DDL support in MySQL 8.0.14 were revised. (Bug
       #29324132, Bug #94243)

     * InnoDB: Static thread local variables defined at the
       wrong scope were not released at thread exit. (Bug
       #29305186)

     * InnoDB: The performance_schema.data_locks LOCK_DATA
       column only showed the secondary index values of the
       locked record for a lock placed on a unique secondary
       index, which was not sufficient to ensure the uniqueness
       of identified records. The clustered index column values
       of the locked record are now appended. (Bug #29296645)

     * InnoDB: An incorrect count of transactions using a
       rollback segment for recovery of an XA transaction
       prevented an undo tablespace truncation operation from
       proceeding and left the purge thread busy checking for
       the undo tablespace to become empty. (Bug #29273194)
       References: This issue is a regression of: Bug #29273194.

     * InnoDB: Invalid assertions were raised at startup after a
       failure to retrieve the space ID of a compressed
       file-per-table tablespace. The invalid assertion code was
       removed. (Bug #29221385, Bug #93760)

     * InnoDB: Optimized InnoDB internal temporary tables did
       not support in-place UPDATE operations, which caused the
       number of delete-marked records to increase continuously.
       The large number of delete-marked records could cause
       longer than expected query execution times. (Bug
       #29207450)

     * InnoDB: The std::sort function in the Variance-Aware
       Transaction Scheduling (VATS) algorithm was replaced by
       the std::stable_sort function to preserve the original
       FIFO order for transactions of equal weight. (Bug
       #29058967)

[To be continued]

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql

Reply via email to