[Due to length restrictions, this announcement is split into three parts. This is part 2.]
Bugs Fixed * Performance; Replication: When processing the dump thread, a semisynchronous replication master checked whether or not the dump thread came from a semisynchronous slave by checking the value of rpl_semi_sync_slave_enabled, but did so for every operation performed on this thread, which had significant negative impact on performance. Now this check is made only once, when the dump thread is started, which should noticeably improve the performance of semisynchronous replication in most cases. (Bug #17932935) * Important Change; Partitioning: In an ALTER TABLE statement, the server accepted REBUILD with the name of a subpartition as valid syntax even though the REBUILD keyword in this case did nothing. Now REBUILD is rejected in such cases, and causes the statement to fail with an error. (Bug #19075411, Bug #73130) References: This bug is a regression of Bug #14028340, Bug #65184. * Important Change; Replication: A DROP TABLE statement may be divided into multiple statements before it is sent to the binary log if it contains regular (not temporary) tables and temporary tables, or if it contains temporary tables using both transactional and non-transactional storage engines. Now, when using GTIDs, DROP TABLE statements affecting these combinations of tables are no longer allowed unless the value of the gtid_next system variable is AUTOMATIC. This is because, with GTIDs enabled on the server, issuing a DROP TABLE in the cases just described while having only one GTID associated with each statement (the SQL thread does this following SET gtid_next='uuid:number') causes problems when there are not enough GTIDs for assignment to all the resulting statements following the division of the original DROP TABLE. A DROP TABLE statement might be split due to the behavior of the statement with respect to the current transaction varying, depending on table characteristics, as follows: + DROP TABLE of a regular (not temporary) table is committed immediately + DROP TABLE of a temporary table using a transactional storage engine is committed with the current transaction (following COMMIT) + DROP TABLE of a temporary table that uses a nontransactional storage engine is committed immediately Naming all three of these types of tables in a single DROP TABLE statement causes the MySQL server to divide the original statement into three separate DROP TABLE statements in the binary log. If GTIDs are enabled but the value of gtid_next is not AUTOMATIC, issuing a DROP TABLE statement that mixes any of the table types described previously causes the server to have an insufficient number of GTIDs to write with all of the resulting statements into the binary log. In addition, DROP TABLE IF EXISTS is always written in the binary log for all tables specified in the statement, even if some or all of the tables do not exist. Because temporary tables are handled differently by DROP TABLE depending on whether they use a transactional or nontransactional storage engine, any tables named by a DROP TEMPORARY TABLE statement that do not exist are assumed to be transactional. This means that, if a DROP TEMPORARY TABLE with two nontransactional temporary tables is issued on the master, it would writes only one DROP TABLE statement naming both tables. If one of the temporary tables no longer exists on the slave, then, when the SQL thread executes the statement, it tries to divide it into multiple statements due to it affecting a nontransactional (but existing) temporary table and a nonexistent transactional temporary table; this leads to problems because the SQL thread has only one GTID for the original DROP TABLE statement but must write two DROP TABLE statements in the binary log. In addition, when the slave dropped temporary tables after detecting that the master had restarted, it logged one DROP TABLE statement per pseudo-thread and per database, but combined temporary tables using transactional and nontransactional storage engines in a single DROP TABLE statement. Now, we throw an error in the client session if gtid_next is set to a uuid:number value and a DROP TABLE statement is issued mixing any of the table types described previously. In addition, we now group the nonexistent temporary tables and assume them to be transactional only if at least one transactional temporary table is dropped by the statement. If no transactional temporary tables are dropped, any nonexistent temporary tables are assumed to be nontransactional temporary tables. The slave now also handles dropping of temporary tables correctly in the event of the restart by the master. (Bug #17620053) * Important Change; Replication: The maximum length that can be used for the password in a CHANGE MASTER TO statement is 32 characters. Previously, when a longer password was employed, it was accepted, but any excess length was silently truncated by the server. Following this fix, when the password's length exceeds 32 characters, CHANGE MASTER TO fails with an error. (Bug #11752299, Bug #43439) * InnoDB; Partitioning: Large numbers of partitioned InnoDB tables could consume much more memory when used in MySQL 5.6 or 5.7 than the memory used by the same tables used in previous releases of the MySQL Server. (Bug #17780517, Bug #70641) References: This bug was introduced by Bug #11764622, Bug #57480. * InnoDB: If a crash occurs after a drop index action during a TRUNCATE TABLE operation, the root page could be left in a free state. On crash recovery, an LSN (http://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_lsn ) check failed to check free pages when attempting to pin the root page, resulting in an assertion. (Bug #19520482) * InnoDB: The TTASFutexMutex, the mutex implementation that uses the Linux futex, failed to request m_lock_word alignment. (Bug #19525395, Bug #73760) * InnoDB: Removed unused code related to binlog information stored in the InnoDB trx_sys page. (Bug #19471743) * InnoDB: Replaced a goto statement with an if statement in the fil_mutex_enter_and_prepare_for_io function in fil0fil.cc. (Bug #19488149) * InnoDB: An ALTER TABLE ... ADD FOREIGN KEY operation could cause a serious error. (Bug #19471516, Bug #73650) * InnoDB: An INSERT operation on a table with spatial data columns raised an assertion. (Bug #19474851) * InnoDB: A transaction returned from the transaction pool was not in a clean state. (Bug #19244969) * InnoDB: An ALTER TABLE operation raised an fk_tables.empty() assertion. After calling dict_load_foreigns(), all associated tables that are linked by a foreign key should be loaded to ensure that foreign keys are cached. (Bug #19267051) References: This bug is a regression of Bug #16244691. * InnoDB: In debug builds, an INSERT operation affecting compressed tables would raise a sync-related assertion. (Bug #19295893) * InnoDB: Reduced mem_heap_zalloc calls in upd_create. Only a single call is necessary to allocate memory for upd_t. (Bug #19297656, Bug #73272) * InnoDB: Retrieval of multiple values with a single get command would return incorrect results instead of an error message. The InnoDB memcached plugin does not currently support retrieval of multiple values with a single get command. (Bug #19172212, Bug #72453) * InnoDB: When multiple daemon_memcached_option options are defined, the INFORMATION_SCHEMA.GLOBAL_VARIABLES table and SHOW VARIABLES statement should only display the first daemon_memcached_option option that is defined in the command line string or in the MySQL configuration file. (Bug #19204759, Bug #73287) * InnoDB: Removed unused one_flush variable from storage/innobase/include/log0log.h. (Bug #19192364, Bug #73269) * InnoDB: Running SHOW ENGINE INNODB STATUS repeatedly under performance testing conditions could result in a serious error. (Bug #19196052) * InnoDB: Attempting to perform operations on a timed out key would cause the memcached daemon to crash and restart. (Bug #19172013, Bug #72586) * InnoDB: An MLOG_CHECKPOINT marker was incorrectly omitted when performing a log checkpoint. (Bug #19233510) * InnoDB: On crash recovery, InnoDB would call exit() when encountering a corruption or inconsistency. Some of the exit() calls have been removed to allow InnoDB to shut down properly. (Bug #19229231) * InnoDB: With a transaction isolation level less than or equal to READ COMMITTED, gap locks were not taken when scanning a unique secondary index to check for duplicates. As a result, duplicate check logic failed allowing duplicate key values in the unique secondary index. (Bug #19140907) References: This bug is a regression of Bug #16133801. * InnoDB: Improved error handling, diagnostics, and test coverage related to crash recovery error handling. (Bug #19145637, Bug #73179) * InnoDB: Improved error handling for calls to handler::records(). (Bug #19142753) References: This bug is a regression of Bug #16802288. * InnoDB: An ALTER TABLE operation that does not perform a sort on the clustered index could result in a duplicate record. (Bug #19163915) References: See also Bug #17657223. * InnoDB: The INNODB_PAGE_ATOMIC_REF_COUNT CMake option is removed in MySQL 5.7.5. This option was enabled by default but could be disabled for systems that do not support atomics. As of MySQL 5.7.5, support for atomics is required to build MySQL, making the INNODB_PAGE_ATOMIC_REF_COUNT option obsolete. (Bug #19061440) * InnoDB: A race condition that occurred when dynamically disabling innodb_adaptive_hash_index caused the purge thread to assert. (Bug #19069698) * InnoDB: In debug builds, an invalid rw_latch == RW_NO_LATCH assertion would cause the server to halt. (Bug #18977128) * InnoDB: A code comment for the os_event_is_set function in storage/innobase/os/os0event.cc was incorrect. (Bug #18940008, Bug #72919) * InnoDB: Added debug assertions to the adaptive hash index code to check that the tablespace ID in buffer blocks match the index space. (Bug #18965518, Bug #72986) * InnoDB: During recovery, a segmentation fault would occur when marking a table as corrupt. (Bug #18942294) * InnoDB: A latching order violation would occur while inserting BLOB data. (Bug #18883885) * InnoDB: trx_cleanup_at_db_startup failed to reset trx->rsegs->m-redo content in debug code. (Bug #18795594) * InnoDB: Removed unused function definitions and declarations from the InnoDB memcached API. (Bug #18815992, Bug #72723) * InnoDB: The innodb_memcached_config.sql configuration script failed after running the mysql_secure_installation script, which removes the MySQL test database. The innodb_memcached_config.sql script now creates the test database if it does not exist. (Bug #18816381, Bug #72678) * InnoDB: Opening a parent table that has thousands of child tables could result in a long semaphore wait condition. (Bug #18806829) * InnoDB: A regression introduced by the fix for Bug #11758237 resulted in a cursor->index->name == TEMP_INDEX_PREFIX assertion. (Bug #18723872) * InnoDB: For single item full-text searches, deleted documents were included in inverse document frequency (IDF) calculations. (Bug #18711306, Bug #72548) * InnoDB: On mysqld start, specifying multiple data files using the innodb_data_file_path option would return a Space id in fsp header error after data is written to the second file. (Bug #18767811) * InnoDB: When storing BLOB data, InnoDB failed to reserve the required tablespace pages prior to allocating the pages, which raised an assertion on INSERT. (Bug #18756233) * InnoDB: A failed in-place ALTER TABLE operation would leave behind non-unique temporary file names in the data dictionary preventing future ALTER TABLE operations on the same table due to temporary file name conflicts. To avoid this problem, temporary file names are made unique by appending a static global number that is initialized to a random distributed 32-bit number using ut_time() and ut_crc32(). The number is then incremented atomically for each assigned temporary file name. Previously, temporary files were named using the format #sql-ibtid, where tid is the table ID. Temporary files are now named using the format #sql-ibtid-inc, where tid is the table ID and inc is the incremented number. (Bug #18734396, Bug #72594) * InnoDB: The page_create function has been optimized to use simpler functions to initialize pages. (Bug #18704384) * InnoDB: An INSERT operation on a table with BLOB columns raised an assertion. (Bug #18646430) References: This bug is a regression of Bug #16963396. * InnoDB: A DELETE operation on a table with full-text search indexes raised an assertion. (Bug #18683832) References: See also Bug #14639605. * InnoDB: When calling the memcached flush_all command, InnoDB attempts to initialize a connection and a transaction. If the transaction is in TRX_STATE_NOT_STARTED state, InnoDB failed to set CONN_DATA->CRSR_TRX to NULL, resulting in a serious error. (Bug #18652854) * InnoDB: When InnoDB is built as a shared library, attempting to load the InnoDB full-text search (FTS) INFORMATION_SCHEMA plugin would fail with a Can't open shared library 'ha_innodb.so' error. (Bug #18655281, Bug #70178) * InnoDB: To-be-imported tablespace files (FIL_TYPE_IMPORT) were not flushed after being converted to normal tablespace files (FIL_TYPE_TABLESPACE), resulting in too many open files. (Bug #18663997) References: This bug is a regression of Bug #18236692. * InnoDB: On startup, with innodb_file_per_table=ON, the page cleaner thread would raise a srv_get_active_thread_type() == SRV_NONE debug assertion when encountering an active master thread. (Bug #18598813) * InnoDB: After upgrading from 5.6.10 to MySQL versions up to and including MySQL 5.6.18, InnoDB would attempt to rename obsolete full-text search auxiliary tables on server startup, resulting in an assertion failure. (Bug #18634201, Bug #72079) * InnoDB: After running OPTIMIZE TABLE on an InnoDB table with a spatial index, running a SELECT statement that uses the spatial index could result in a crash. (Bug #18619945, Bug #72361) References: This bug is a regression of Bug #13975225. * InnoDB: An INSERT operation on a table with GEOMETRY columns raised an assertion in rtr_page_split_and_insert(). (Bug #18644435) * InnoDB: The temporary tablespace file (ibtmp1) was held open by the page_cleaner thread and could not be removed on startup, resulting in a hang. (Bug #18642372) * InnoDB: InnoDB would try to merge a b-tree change buffer for a dedicated undo tablespace. (Bug #18593561) * InnoDB: A regression introduced in MySQL 5.6.5 would cause full-text search index tables to be created in the system tablespace (space 0) even though innodb_file_per_table was enabled. (Bug #18635485) * InnoDB: In rare cases, the purge process would attempt to delete a secondary index record that was not marked for deletion, resulting in an inconsistent secondary index. (Bug #18631496) * InnoDB: Included unistd.h in innodb.cmake to enable futexes in debug builds. (Bug #18522549, Bug #72225) * InnoDB: A DB_LOCK_WAIT during a foreign key check caused redundant delete marking, resulting in a failing assertion. (Bug #18451287) * InnoDB: TRUNCATE TABLE would write page-level redo logs during the DROP TABLE step of a TRUNCATE TABLE operation. (Bug #18511398) * InnoDB: srv_active_wake_master_thread() was called directly in innobase_commit and innobase_prepare, waking up the master thread and incrementing srv_activity_count. srv_active_wake_master_thread() should only be called after committing write transactions, not after read-only transactions or rollbacks. This patch also replaces some calls to srv_active_wake_master_thread() with calls to ib_wake_master_thread(). (Bug #18477009, Bug #72137) * InnoDB: A COMMIT operation related to full-text search resulted in a segmentation fault. (Bug #18503734) * InnoDB: The os_event_wait_time_low function would sometimes return OS_SYNC_TIME_EXCEEDED before the sync time has elapsed. (Bug #18386498) * InnoDB: Running a SELECT on a partitioned table caused a memory access violation in memcpy(). (Bug #18383840) References: See also Bug #18167648. * InnoDB: With UNIV_SYNC_DEBUG enabled, a late call to sync_check_enable() would result in an m_enabled assertion failure. (Bug #18433658) * InnoDB: InnoDB would write to the redo log for an IMPORT TABLESPACE operation before the tablespace import was complete. (Bug #18424134) * InnoDB: The InnoDB memcached plugin would call plugin_del without acquiring the lock_plugin mutex. This bug fix also addresses a race condition in ib_cursor_delete_row. (Bug #18409840) * InnoDB: With persistent statistics enabled, SHOW TABLE STATUS output and the TABLE_ROWS column of INFORMATION_SCHEMA.TABLES could report an incorrect number of table rows for tables with externally stored pages. (Bug #18384390) * InnoDB: Added the C++ ostream mechanism for error logging. (Bug #18320915) * InnoDB: Code quality improvements for the redo log subsystem. (Bug #18345004) * InnoDB: The fix for Bug#17699331 caused a high rate of read/write lock creation and destruction which resulted in a performance regression. (Bug #18345645, Bug #71708) * InnoDB: A regression introduced by the fix for Bug#18069105 could result in a table corruption and failing assertions. (Bug #18368345) * InnoDB: The data file was not opened prior to calling fil_fusionio_enable_atomic_write(), resulting in an assertion failure. (Bug #18368241) * InnoDB: Removed the recv_max_parsed_page_no code variable, which was only used in a diagnostic error message. (Bug #18312967) * InnoDB: buf_pool->flush_rbt, which is only intended to be used for recovery, would be allocated for database creation and never freed. (Bug #18253089) * InnoDB: Calls to sched_getcpu would cause page faults. (Bug #18225489) * InnoDB: ib_heap_resize failed to verify that new_size is greater than or equal to old_size before calling memcpy. (Bug #18178915) * InnoDB: After crash recovery and with UNIV_DEBUG enabled, purge failed with a buf_pool_from_bpage(bpage) == buf_pool assertion failure. (Bug #18154145) * InnoDB: For each insert, memset would be called three times to allocate memory for system fields. To reduce CPU usage, the three memset calls are now combined into a single call. (Bug #17858679, Bug #71014) * InnoDB: Assertion code in buf_page_release_latch() in buf0buf.ic was too restrictive. (Bug #17869571) * InnoDB: The fix for Bug#16418661 added superfluous buf_flush_list() logic to InnoDB startup code. (Bug #17798076, Bug #70899) * InnoDB: A problem renaming temporary tables during an ALTER TABLE operation would raise an assertion and print a warning to the error log. Temporary table names were not sufficiently unique. (Bug #17713871) * InnoDB: In-place ALTER TABLE operations requiring a table rebuild would sort the clustered index even though the primary key order remained unchanged. This behavior caused unnecessary temporary table usage and I/O. (Bug #17657223) * InnoDB: A race condition in fts_get_next_doc_id resulted in Duplicate FTS_DOC_ID and Cannot find index FTS_DOC_ID_INDEX in InnoDB index translation table errors. (Bug #17447086, Bug #70311) References: See also Bug #16469399. * InnoDB: Enabling the InnoDB Table Monitor would result in a ib_table->stat_initialized assertion failure. (Bug #17039528, Bug #69641) * InnoDB: Redo log writes for large, externally stored BLOB fields could overwrite the most recent checkpoint. The 5.6.20 patch limits the size of redo log BLOB writes to 10% of the redo log file size. The 5.7.5 patch addresses the bug without imposing a limitation. For MySQL 5.5, the bug remains a known limitation. (Bug #16963396, Bug #19030353, Bug #69477) * InnoDB: The error log message that is printed on CREATE TABLE when the number of BLOB or TEXT fields exceed the row size limit did not provide sufficient information. The error message now provides the maximum row size, current row size, and the field that causes the maximum row size to be exceeded. (Bug #16874873, Bug #69336) * InnoDB: An in-place ALTER TABLE operation on a table with a broken foreign key constraint could raise an assertion. (Bug #16869435) * InnoDB: The lock_number_of_rows_locked function used a bit vector to track the number of record locks held by a transaction. To optimize reporting, the bit vector was replaced by a simple counter. (Bug #16479309, Bug #68647) * InnoDB: Inserting a record into an InnoDB table with a key that falls between the maximum key of a full page and the minimum key of the "next" page could result in unnecessary page splits and under-filled pages. If the insert point is at the end of a page, InnoDB now attempts to insert to the next page before splitting the page. (Bug #15923864, Bug #67718) * InnoDB: With innodb_max_dirty_pages_pct=0 buffer pool flushing would not be initiated until the percentage of dirty pages reached at least 1%, which would leave up to 1% of dirty pages unflushed. (Bug #13029450, Bug #62534) * InnoDB: Due to differences in memory ordering on different processor types, some mutex and read-write lock flags were not read consistently. (Bug #11755438, Bug #47213) * InnoDB: When foreign_key_checks is disabled, InnoDB would allow an index required by a foreign key constraint to be dropped, thereby placing the table into an inconsistent state. Dropping an index required by a foreign key constraint should not be permitted. (Bug #70260, Bug #17449901) * InnoDB: Debug assertion code in file row0ins.cc did not account for rw-lock shared-exclusive (sx-lock) mode, resulting in an assertion failure. (Bug #73534, Bug #19420253) * Partitioning: When the index_merge_intersection flag (enabled by default) or the index_merge_union flag was enabled by the setting of the optimizer_switch system variable, queries returned incorrect results when executed against partitoned tables that used the MyISAM storage engine, as well as partitioned InnoDB tables that lacked a primary key. (Bug #18167648) References: See also Bug #16862316, Bug #17588348, Bug #17648468. * Partitioning: Selecting from a table having multiple columns in its primary key and partitioned by LIST COLUMNS(R), where R was the last (rightmost) column listed in the primary key definition, returned an incorrect result. (Bug #17909699, Bug #71095) * Replication: Misleading or confusing error messages have been revised, which were produced in the following 2 cases when using mysqlbinlog with the --raw option: + When this option was used together with --include-gtids. + When this option was used together with --exclude-gtids and --read-from-remote-master=BINLOG-DUMP-NON-GTIDS. (Bug #19459836, Bug #73625) * Replication: After the fix for Bug #16861624, killing a multi-threaded slave worker which was waiting for a commit lock caused a debug assertion to fail. This fix ensures that such a situation can not occur. (Bug #19311260) * Replication: Temporary errors related to a slave worker thread which was retrying a transaction were visible in SHOW SLAVE STATUS. This fix ensures that slave worker threads do not store temporary errors in the slave status. (Bug #19282301) * Replication: Removed an unnecessary write lock that was taken by an internal function while adding a GTID to a GTID set, which should improve the performance of the function and the code dependent on it during such operations. (Bug #18963555, Bug #72977) * Replication: RESET SLAVE ALL did not clear IGNORE_SERVER_IDS, although this statement should clear any values that are set by CHANGE MASTER TO. Now RESET SLAVE ALL always empties the list of server IDs to ignore, whenever it is executed. (Bug #18816897) * Replication: The same internal function had effects which caused three similar problems when resetting or starting slaves. These three issues are listed here: + RESET SLAVE automatically set the heartbeat period (Slave_heartbeat_period) to its default value. + RESET SLAVE automatically set SSL_VERIFY_SERVER_CERT to the default. + When a server was not configured as a slave (that is, when no CHANGE MASTER TO statement had yet been executed), the subsequent failure of START SLAVE was expected but had the unintended side effect of resetting the heartbeat period to the default. The function has been rewritten such that code affecting heartbeat or SSL certificate usage has been eliminated or moved to a more appropriate location, eleminating the side effects formerly seen with RESET SLAVE or a failed START SLAVE. As part of this fix, in order to be able to keep heartbeats enabled by default when changing the master, if host and port are given but the heartbeat period is not specified in a CHANGE MASTER TO statement, we force it to the default value. (Bug #18791604, Bug #18778485, Bug #18777899) * Replication: Semi-synchronous replication did not work as expected when the rpl_semi_sync_master_wait_no_slave and rpl_semi_sync_master_wait_for_slave_count variables were set. The values of the variables were changed, but the related internal status was not updated during initialization. (Bug #18835117, Bug #18466390) * Replication: mysqlbinlog --raw did not check for errors caused by failed writes, which could result in silent corruption of binary logs. Now in such cases it stops with an error. (Bug #18742916, Bug #72597) * Replication: When committing a transaction, a flag is now used to check whether a thread has been created, rather than checking the thread itself, which uses more resources, particularly when running the server with master_info_repository=TABLE. (Bug #18684222) References: See also Bug #17967378. * Replication: When a slave worker thread tried to execute a statement that was too large, the resulting error caused a crash. Now in such cases, the error is truncated to fit the size of the buffer. (Bug #18563480) * Replication: When using GTIDs with MASTER_AUTO_POSITION enabled, if an I/O thread was restarted it failed with an ER_GTID_NEXT_TYPE_UNDEFINED_GROUP error due to a partial transaction not being correctly rolled back before resuming the I/O thread. This fix ensures that the partial transaction is correctly rolled back. (Bug #18472603) * Replication: Log rotation events could cause group_relay_log_pos to be moved forward incorrectly within a group. This meant that, when the transaction was retried, or if the SQL thread was stopped in the middle of a transaction following one or more log rotations (such that the transaction or group spanned multiple relay log files), part or all of the group was silently skipped. This issue has been addressed by correcting a problem in the logic used to avoid touching the coordinates of the SQL thread when updating the log position as part of a relay log rotation whereby it was possible to update the SQL thread's coordinates when not using a multi-threaded slave, even in the middle of a group. (Bug #18482854) * Replication: When using row-based replication, updating or deleting a row on the master that did not exist on the slave led to failure of the slave when it tried to process the change. This problem occurred with InnoDB tables lacking a primary key. (Bug #18432495, Bug #72085) * Replication: A multi-threaded slave now checks that a free worker is available to dispatch the next event. In previous versions, a multi-threaded slave crashes with a worker error if the thread coordinator can not find a free worker. The crash was caused when the coordinator did not return a free worker, for example if the coordinator was aborted at the same time using STOP SLAVE. (Bug #18363515) * Replication: When replicating from a MySQL 5.5 or earlier master to a MySQL 5.6 or later slave, the SOURCE_UUID column of the slave's performance_schema.replication_connection_status table contained random data. Now in such cases, SOURCE_UUID is left blank. (Bug #18338203) * Replication: During relay log initialization, the thread context was used as a flag for the reconstruction of the retrieved GTID set, an operation that does not depend on this parameter. This could be problematic if relay log initialization was called in another context other than the legacy replication scenario; if the invocation was made in a context where the thread context was always present, this prevented the set's reconstruction. The opposite could also happen when the thread context was not present, which cause the initialization to be performed twice. To avoid such issues, the thread context flag is replaced with a new flag that allows the reconstruction in all contexts but prevents multiple invocations. (Bug #18337036) * Replication: When mysqlbinlog processed multiple binary log files into a single output file, this file was not in a useful state for point-in-time recovery, when it failed with the error, When @@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it to a different value after a COMMIT or ROLLBACK. Please check GTID_NEXT variable manual page for detailed explanation. Current @@SESSION.GTID_NEXT is 'xyz'. When mysqlbinlog processes a binary log containing GTIDs, it outputs SET gtid_next statements, but gtid_next is set to undefined whenever a commit occurs; this left gtid_next undefined when the server had finished processing the output from mysqlbinlog. When the next binary log file started with one or more anonymous statements or transactions, the combination of gtid_next being left undefined at the end of the first binary log and the second binary log containing anonymous transactions to the error described previously (Error 1837, ER_GTID_NEXT_TYPE_UNDEFINED_GROUP). To fix this issue, now, whenever mysqlbinlog encounters this situation, it inserts SET gtid_next = AUTOMATIC if required to avoid leaving the previous binary log with gtid_next undefined. In addition, as a result of this fix, mysqlbinlog no longer outputs session variable information for every binary log; now, this value is printed only once unless it changes. (Bug #18258933, Bug #71695) * Replication: Changing master_info_repository between TABLE and FILE could produce duplicate values in the Replicate_Ignore_Server_Ids column of the output from SHOW SLAVE STATUS and the Ignored_server_ids column of the mysql.slave_master_info table. This could arise because the list of IDs stored internally by the server was not always sorted before checking for duplicates when inserting new values into the list. Now the list of server IDs to be ignored is always sorted, prior to performing this check. (Bug #18192817, Bug #18593479, Bug #18920203) * Replication: Quotation marks were not always handled correctly by LOAD DATA INFILE when written into the binary log. (Bug #18207212, Bug #71603) * Replication: In certain cases, the server mishandled triggers and stored procedures that tried to modify other tables when called by CREATE TABLE ... SELECT. This is now handled correctly as an error. (Bug #18137535) * Replication: The REPLICATE_WILD_DO_TABLE and REPLICATE_WILD_IGNORE_TABLE options for CHANGE REPLICATION FILTER could be employed with values which contained no period (.) character, even though values for these options must be in the format db_name.tbl_name.. (Bug #18095449) * Replication: When used on a table employing a transactional storage engine, a failed TRUNCATE TABLE was still written to the binary log and thus replayed on the slave. This could lead to inconsistency when the master retained data that was removed on the slave. Now in such cases TRUNCATE TABLE is logged only when it executes successfully. (Bug #17942050, Bug #71070) * Replication: Beginning in MySQL 5.6.20, when a user specified AUTO_INCREMENT value falls outside of the range between the current AUTO_INCREMENT value and the sum of the current and number of rows affected values it is replicated correctly. In previous versions, an error was generated by the slave even if the user specified AUTO_INCREMENT value fell outside of the range. (Bug #17588419, Bug #70583) * Replication: When the I/O thread reconnected to a master using GTIDs and multithreaded slaves while in the middle of a transaction, it failed to abort the transaction, leaving a partial transaction in the relay log, and then retrieving the same transaction again. This occurred when performing a rotation of the relay log. Now when reconnecting, the server checks before rotating the log in such cases, and waits first for any ongoing transaction to complete. (Bug #17326020) * Replication: On Windows, mysqldump failed if the error log file was deleted (missing) from the active MySQL server. (Bug #17076131) * Replication: When the binary log was rotated due to receipt of a SIGHUP signal, the new binary log did not contain the Previous_gtid_event required for subsequent processing of that binary log's GTID events. Now when SIGHUP is received, steps are taken to insure that the server writes the necessary Previous_gtid_event to the new log before writing any GTID events to the new log. (Bug #17026898) * Replication: When using semisynchronous replication, if the binary log position was changed to a future position on a slave then an assertion error was generated on the master. This fix ensures that in such a situation the future position is correctly acknowledged and an error is instead generated on the slave. (Bug #70327, Bug #17453826) * Replication: When an SQL thread which was waiting for a commit lock was killed and restarted it caused a transaction to be skipped on slave. This fix ensures that thread positions are correctly persisted and transactions resume at the correct position. (Bug #69873, Bug #17450876) * Replication: On a master that is using semisynchronous replication, where rpl_semi_sync_master_wait_no_slave is enabled and rpl_semi_sync_master_timeout is set to long timeout, killing the I/O thread could cause the server to hang on shutdown. This fix ensures that if the dump thread finds that there no semisynchronous slaves connected to the master, the setting of rpl_semi_sync_master_wait_no_slave is ignored and the shutdown proceeds correctly. (Bug #71047, Bug #17879675) * Replication: When using row-based replication, setting a slave's slave_rows_search_algorithms variable to HASH_SCAN caused an ER_RECORD_NOT_FOUND error even though that record existed in the storage layer. This fix ensures that the unique key for each record is correctly maintained and such a situation does not occur. (Bug #72788, Bug #18860225) * Replication: When an event group was spanned across multiple relay log files, a slave could incorrectly identify GTID-header group boundaries. This meant that when a transaction was retried, or if the SQL thread was stopped in the middle of a transaction after some rotates, the Gtid_log_event was being silently skipped on the slave, and the transaction was logged with the slave's GTID. This problem also impacted on using START SLAVE UNTIL MASTER_LOG_POS = log_pos; with GTIDs enabled. If log_pos was in the middle of a transaction, the Gtid_log_event was not correctly detected as the beginning of the transaction and replication stopped before this event. With this fix, threads correctly detect that they are part of a group, and this is used to check if a Gtid_log_event is part of a transaction. (Bug #72313, Bug #18652178, Bug #18306199) * Replication: The error messages generated when a duplicate server UUID causes issues during replication have been improved. The slave error now identifies the duplicate server UUID and the master error identifies the zombie thread that has been killed. (Bug #72578, Bug #18731211) * Replication: Replication of tables that contained temporal type fields (such as TIMESTAMP, DATETIME, and TIME) from different MySQL versions failed due to incompatible TIMESTAMP types. The fractional TIMESTAMP format added in MySQL 5.6.4 was not being correctly converted. You can now replicate a TIMESTAMP in either format correctly according to the slave_type_conversions variable. (Bug #70124, Bug #17532932) * Replication: The CLIENT_REMEMBER_OPTIONS flag for compressed slave connections is no longer reset and all options are retained. This restores functionality of all options to compressed slave connections. (Bug #72901, Bug #18923691, Bug #73324, Bug #19244772) * Replication: When using row-based replication, running a long transaction involving a large number of events could trigger an Out of Memory (OOM) error if the slave's table structure was not compatible with the master's table structure. Such an incompatible situation could occur if the table on the slave had been manually changed, or when replicating between different MySQL versions that have different data types. This OOM error was caused because the virtual temporary tables created for the row conversion were not being freed until the end of the transaction, which was a problem when replicating large numbers of events. Starting with this version, such virtual tables are correctly freed during the conversion process. (Bug #72610, Bug #18770469) * Replication: Client applications should be able to set the BINLOG_DUMP_NON_BLOCK flag in the initial handshake packet (COM_BINLOG_DUMP). Clients connecting to a server issuing a COM_BINLOG_DUMP with the flag unset do not get an EOF when the server has sent the last event in the binary log, which causes the connection to block. This flag, which was removed in error in MySQL 5.6.5, is now restored in the current release. As part of this fix, a new --connection-server-id option is added to mysqlbinlog. This option can be used by the client to test a MySQL server for the presence of this issue. (Bug #71178, Bug #18000079) * Replication: A group of threads involved in acquiring locks could deadlock when the following events occurred: 1. Dump thread reconnects from slave; on master, a new dump thread tries to kill zombie dump threads; having acquired the thread's LOCK_thd_data, it is about to acquire LOCK_log. 2. Application thread executing show binary logs, having acquired LOCK_log and about to acquire LOCK_index. 3. Application thread executing PURGE BINARY LOGS; having acquired LOCK_index, it is about to acquire LOCK_thread_count. 4. Application thread executing SHOW PROCESSLIST (or SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST), having acquired LOCK_thread_count and about to acquire the zombie dump thread's LOCK_thd_data. This leads to the 4 threads deadlocking in the same order which the threads have been listed here. This problem arises because there are ordering rules for LOCK_log and LOCK_index, as well as rules for ordering LOCK_thread_count and LOCK_thd_data, but there are no rules for ordering across these two sets of locks. This was because the internal mysqld_list_processes() function invoked by SHOW PROCESSLIST acquired LOCK_thread_count for the complete lifetime of the function as well as acquiring and releasing each thread's LOCK_thd_data. Now this function takes a copy of the threads from the global thread list and performs its traversal on these, and only after releasing LOCK_thread_count. During this traversal, removal from the global thread list is blocked using LOCK_thd_remove such that the copies that would otherwise be destroyed by the removal remain valid during traversal. The locking order following this fix is shown here: LOCK_thd_remove -> LOCK_thd_data -> LOCK_log -> LOCK_index -> LOCK_th read_count (Bug #69954, Bug #17283409) References: See also Bug #73475, Bug #19364731, Bug #19365180. * Replication: When gtid_mode=ON, and a transaction is filtered out on the slave, the GTID of the transaction is still logged on the slave as an "empty" transaction (consisting of a GTID followed immediately by BEGIN and then COMMIT). This is necessary to prevent the transaction from being retransmitted the next time the slave reconnects or is involved in a failover. The current fix addresses two issues relating to such "empty" transactions: + No empty transaction was generated for CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE statements. + If the slave used a database filter (--replicate-do-db or --replicate-ignore-db option), no empty transaction was generated. (Bug #71376, Bug #18095502, Bug #18145032) -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/mysql