When GTIDs are in use
(gtid_mode
is
ON
), the GTID for a committed transaction
is persisted on the replica even if the content of the
transaction is filtered out. This feature prevents a replica
from retrieving previously filtered transactions when it
reconnects to the source using GTID auto-positioning. It can
also be used to skip a transaction on the replica, by
committing an empty transaction in place of the failing
transaction.
This method of skipping transactions is not suitable when you
have enabled GTID assignment on a replication channel using
the ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
option of the CHANGE REPLICATION SOURCE
TO
statement.
If the failing transaction generated an error in a worker
thread, you can obtain its GTID directly from the
APPLYING_TRANSACTION
field in the
Performance Schema table
replication_applier_status_by_worker
.
To see what the transaction is, issue
SHOW RELAYLOG EVENTS
on the
replica or SHOW BINLOG
EVENTS
on the source, and search the output for a
transaction preceded by that GTID.
When you have assessed the failing transaction for any other appropriate actions as described previously (such as security considerations), to skip it, commit an empty transaction on the replica that has the same GTID as the failing transaction. For example:
SET GTID_NEXT='aaa-bbb-ccc-ddd:N';
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';
The presence of this empty transaction on the replica means
that when you issue a START
REPLICA
statement to restart replication, the
replica uses the auto-skip function to ignore the failing
transaction, because it sees a transaction with that GTID has
already been applied. If the replica is a multi-source
replica, you do not need to specify the channel name when you
commit the empty transaction, but you do need to specify the
channel name when you issue START
REPLICA
.
Note that if binary logging is in use on this replica, the empty transaction enters the replication stream if the replica becomes a source or primary in the future. If you need to avoid this possibility, consider flushing and purging the replica's binary logs, as in this example:
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
The GTID of the empty transaction is persisted, but the transaction itself is removed by purging the binary log files.