| Bug #82848 | Restarting a slave after seeding it with a mysqldump loses it's position | ||
|---|---|---|---|
| Submitted: | 2 Sep 2016 15:02 | Modified: | 8 Jun 2017 12:07 | 
| Reporter: | Daniël van Eeden (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: mysqldump Command-line Client | Severity: | S1 (Critical) | 
| Version: | 5.7.14 | OS: | Any | 
| Assigned to: | CPU Architecture: | Any | |
| Tags: | GTID | ||
   [2 Sep 2016 15:02]
   Daniël van Eeden        
  
 
   [3 Sep 2016 8:16]
   Daniël van Eeden        
  Some more details:
Setup with MySQL Sandbox:
make_sandbox 5.7.14 -- --check_port --gtid
make_sandbox 5.7.14 -- --check_port --gtid
Changed prompt in my.sandbox.cnf to indicate instance A or B. 
A:
RESET MASTER;
USE test
CREATE TABLE t1 (id SERIAL);
FLUSH LOGS;
PURGE BINARY LOGS BEFORE NOW();
INSERT INTO t1 VALUES(NULL),(NULL),(NULL);
A mysql > SELECT @@global.gtid_purged, @@global.gtid_executed\G
*************************** 1. row ***************************
  @@global.gtid_purged: 00005715-5714-5714-5714-000000005714:1
@@global.gtid_executed: 00005715-5714-5714-5714-000000005714:1-2
1 row in set (0.00 sec)
A mysql > SELECT * FROM mysql.gtid_executed;
+--------------------------------------+----------------+--------------+
| source_uuid                          | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| 00005715-5714-5714-5714-000000005714 |              1 |            1 |
+--------------------------------------+----------------+--------------+
1 row in set (0.01 sec)
./my sqldump --all-databases --triggers --routines --events > /tmp/dump.sql
B:
RESET MASTER;
SOURCE /tmp/dump.sql
B mysql > SELECT @@global.gtid_purged, @@global.gtid_executed\G
*************************** 1. row ***************************
  @@global.gtid_purged: 00005715-5714-5714-5714-000000005714:1-2
@@global.gtid_executed: 00005715-5714-5714-5714-000000005714:1-2
1 row in set (0.00 sec)
B mysql > SELECT * FROM mysql.gtid_executed;
+--------------------------------------+----------------+--------------+
| source_uuid                          | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| 00005715-5714-5714-5714-000000005714 |              1 |            1 |
+--------------------------------------+----------------+--------------+
1 row in set (0.00 sec)
./restart
B mysql > SELECT @@global.gtid_purged, @@global.gtid_executed\G
*************************** 1. row ***************************
  @@global.gtid_purged: 00005715-5714-5714-5714-000000005714:1
@@global.gtid_executed: 00005715-5714-5714-5714-000000005714:1
1 row in set (0.00 sec)
B mysql > SELECT * FROM mysql.gtid_executed;
+--------------------------------------+----------------+--------------+
| source_uuid                          | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| 00005715-5714-5714-5714-000000005714 |              1 |            1 |
+--------------------------------------+----------------+--------------+
1 row in set (0.00 sec)
From /tmp/dump.sql:
...
SET @@SESSION.SQL_LOG_BIN= 0;
...
SET @@GLOBAL.GTID_PURGED='00005715-5714-5714-5714-000000005714:1-2';
...
DROP TABLE IF EXISTS `gtid_executed`;
...
CREATE TABLE `gtid_executed` (
...
INSERT INTO `gtid_executed` VALUES ('00005715-5714-5714-5714-000000005714',1,1);
...
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
 
   [3 Sep 2016 9:59]
   MySQL Verification Team        
  Hello Daniël, Thank you for the report. Observed this with 5.7.14 build. Thanks, Umesh
   [3 Sep 2016 10:00]
   MySQL Verification Team        
  test results
Attachment: 82848.results (application/octet-stream, text), 21.56 KiB.
   [3 Sep 2016 10:13]
   Daniël van Eeden        
  Workaround: add '--ignore-table=mysql.gtid_executed' to mysqldump options or add this to my.cnf: ======================== [mysqldump] ignore-table=mysql.gtid_executed ======================== Fix: https://github.com/mysql/mysql-server/pull/94
   [3 Sep 2016 10:20]
   Daniël van Eeden        
  Patch https://github.com/mysql/mysql-server/pull/94 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: 0001-Don-t-dump-mysql.gtid_executed.patch (text/x-patch), 1.20 KiB.
   [3 Sep 2016 10:28]
   MySQL Verification Team        
  Bug #81692 marked as duplicate of this one
   [3 Sep 2016 11:01]
   Daniël van Eeden        
  Changing category to reflect that this is a mysqldump bug. Changed severity to S1 as this issue might not be noticed until when you restart a slave and then recovering might be difficult. Related: Bug #71565 Please report full GTID state when stopping / start a slave
   [4 Sep 2016 15:47]
   Daniël van Eeden        
  A MTR test case. (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: 0002-Add-test-case-for-Bug-82848.patch (text/x-patch), 1.78 KiB.
   [8 Jun 2017 12:07]
   Jon Stephens        
  Documented fix in the MySQL 5.7.19 and 8.0.2 changelogs, as follows:
    MySQL lost its GTID position following a restart when a dump
    from mysqldump had been used to load data.
    To keep this problem from occurring, the mysql.gtid_executed
    table is now excluded from dumps by mysqldump automatically.
Closed.
 
