Because GTID-based replication is dependent on transactions, some features otherwise available in MySQL are not supported when using it. This section provides information about restrictions on and limitations of replication with GTIDs.
Updates involving nontransactional storage engines.
When using GTIDs, updates to tables using nontransactional
storage engines such as MyISAM
cannot be made in the same statement or transaction as updates
to tables using transactional storage engines such as
InnoDB
.
This restriction is due to the fact that updates to tables that use a nontransactional storage engine mixed with updates to tables that use a transactional storage engine within the same transaction can result in multiple GTIDs being assigned to the same transaction.
Such problems can also occur when the source and the replica use different storage engines for their respective versions of the same table, where one storage engine is transactional and the other is not. Also be aware that triggers that are defined to operate on nontransactional tables can be the cause of these problems.
In any of the cases just mentioned, the one-to-one correspondence between transactions and GTIDs is broken, with the result that GTID-based replication cannot function correctly.
CREATE TABLE ... SELECT statements.
For storage engines which support atomic DDL,
CREATE
TABLE ... SELECT
is recorded in the binary log as one
transaction. For more information, see
Section 15.1.1, “Atomic Data Definition Statement Support”.
Temporary tables.
If binlog_format
is set to
STATEMENT
,
CREATE TEMPORARY
TABLE
and
DROP TEMPORARY
TABLE
statements cannot be used inside transactions,
procedures, functions, and triggers when GTIDs are in use on the
server (that is, when the
enforce_gtid_consistency
system
variable is set to ON
). They can be used
outside these contexts when GTIDs are in use, provided that
autocommit=1
is set. When
binlog_format
is set to
ROW
or MIXED
,
CREATE TEMPORARY
TABLE
and
DROP TEMPORARY
TABLE
statements are allowed inside a transaction,
procedure, function, or trigger when GTIDs are in use. The
statements are not written to the binary log and are therefore
not replicated to replicas. The use of row-based replication
means that the replicas remain in sync without the need to
replicate temporary tables. If the removal of these statements
from a transaction results in an empty transaction, the
transaction is not written to the binary log.
Preventing execution of unsupported statements.
To prevent execution of statements that would cause GTID-based
replication to fail, all servers must be started with the
--enforce-gtid-consistency
option
when enabling GTIDs. This causes statements of any of the types
discussed previously in this section to fail with an error.
Note that
--enforce-gtid-consistency
only
takes effect if binary logging takes place for a statement. If
binary logging is disabled on the server, or if statements are not
written to the binary log because they are removed by a filter,
GTID consistency is not checked or enforced for the statements
that are not logged.
For information about other required startup options when enabling GTIDs, see Section 19.1.3.4, “Setting Up Replication Using GTIDs”.
Skipping transactions.
sql_replica_skip_counter
is not
available when using GTID-based replication. If you need to skip
transactions, use the value of the source's
gtid_executed
variable instead.
If you have enabled GTID assignment on a replication channel
using the
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
option
of the CHANGE REPLICATION SOURCE
TO
statement,
sql_replica_skip_counter
is
available. For more information, see
Section 19.1.7.3, “Skipping Transactions”.
Ignoring servers.
IGNORE_SERVER_IDS
cannot be
used with CHANGE REPLICATION SOURCE
TO
when using GTIDs, because transactions that have
already been applied are automatically ignored. Before starting
GTID-based replication, check for and clear all ignored server
ID lists that have previously been set on the servers involved.
The SHOW REPLICA STATUS
statement, which can be issued for individual channels, displays
the list of ignored server IDs if there is one. If there is no
list, the Replicate_Ignore_Server_Ids
field
is blank. If the list of ignored server IDs is not empty, you
can clear it with CHANGE REPLICATION SOURCE TO ...
IGNORE_SERVER_IDS=()
(in other words, with an empty
list of server IDs to be ignored).