多源复制 MySQL 5.6 到 5.7 GTID 自动定位问题

Multi Source Replication MySQL 5.6 to 5.7 GTID Auto Position Issues

我有 3 个主服务器,不同的数据库,我正在尝试复制到单个服务器中。我很难让他们设置和最新。我在所有 3 个频道上都有重复输入错误。手动跳过它们至少可以说是痛苦的。有没有办法自动同步到正确的位置?我的印象是这对 GTID 来说就像馅饼一样简单。

我用过:

转储:

mysqldump --databases profiles --single-transaction --triggers --routines --host=10.10.10.10 --port=3306 --user=user --password=pass > ~/dump.sql

初始化:

CHANGE MASTER TO MASTER_HOST="10.10.10.10", MASTER_PORT=3306, MASTER_USER="user", MASTER_PASSWORD="pass", MASTER_AUTO_POSITION=1 FOR CHANNEL "channel1";

硕士My.cnf:

gtid_mode       = ON
enforce_gtid_consistency        = true
log_bin = /var/log/mysql/bin_log.index
log_slave_updates       = true
server-id       = 2061

奴隶 My.cnf:

  [client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
server-id       = 10001
explicit_defaults_for_timestamp

gtid_mode=ON
enforce_gtid_consistency=true
log_bin=/var/log/mysql/bin_log.index
log_slave_updates=true
master_info_repository=TABLE
relay_log_info_repository=TABLE


# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address   = 127.0.0.1

log-error       = /var/log/mysql/error.log

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

我错过了什么吗?感谢任何帮助。

问题是 GLOBAL.GTID_PURGED 只注册了我的一个主数据库,它设置了继续复制过程的正确位置。 其他数据库基本上是从时间的开始开始的。 因此我收到了不正确的定位和重复记录错误。

所以这是我的解决方案:

MySQL ME 的多源 GTID 复制指南:

Re/Install MySQL 服务器:

保护当前数据后,我将 MySQL Server 5.7.7-rc 全新安装到从属服务器上。可以使用以下方法完全删除任何 MySQL 服务器:

$ sudo apt-get --purge remove mysql-client mysql-server mysql-common
$ sudo apt-get autoremove

然后在提示时选择是删除 "Data" 目录(这将永久删除所有数据库、配置等)。如果您有任何自定义配置,现在是时候备份您的 /etc/mysql/my.cnf 文件了。

为 Ubuntu 14-lts

重新安装 MySQL Server 5.7
$ sudo apt-get install mysql-server-5.7

如果您的系统上没有 5.7,请使用 this guide

备份实时主数据库:

我创建了所有 3 个 Live Master 数据库的当前 MySQL 转储。我的每个数据库都有不同的名称,例如db01, db02, db03 正在直接保存到从服务器上。

在我的例子中,每个数据库都在自己的服务器上,所以我 运行 这几次更改了 ip 和数据库,以及文件名。

$ mysqldump -u username -p -h 10.10.10.10 --skip-lock-tables --single-transaction --triggers --routines --databases db01 > ~/dumpDB01.sql

完成后,您将需要每个转储中的 GTID_PURGED 数据并保存以备后用:

$ grep PURGED ~/dumpDB01.sql
SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

您将需要整个字符串:d23dceda-08a4-11e5-85e4-005056a2431f:1-10073

MySQL 从服务器配置:

现在我决定在导入任何数据之前完全配置 mysql,我将很快解释原因。

编辑my.cnf:

sudo vi /etc/mysql/my.cnf

gtid_mode                             =ON
enforce_gtid_consistency              =true
log_bin                               =/var/log/mysql/bin_log.index
log_slave_updates                     =true
master_info_repository                =TABLE
relay_log_info_repository             =TABLE
server-id                             =1001

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address   = 127.0.0.1

您需要保存配置文件并创建 bin_log.index 文件,否则服务器将无法启动。

$ sudo touch /var/log/mysql/bin_log.index
$ sudo chown mysql:mysql /var/log/mysql/bin_log.index
$ sudo service mysql restart

导入/配置数据:

导入转储时,第一个转储会像这样自动注册其 GTID_PURGED:

SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

一旦发生这种情况,您的 GTID_EXECUTED 将被设置为相同的数据,并且每次后续导入都会产生如下错误:

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

在使用 $ mysql -u username -p -f < ~/dumpDB02.sql 导入时可以忽略这些错误,因为我们将在导入过程后手动修改 GTID_PURGED。如果您已经强制导入并看到此错误,您可以通过执行 mysql > RESET MASTER;

清除两个 GTID 变量

从 mysql 控制台 运行 以下内容:

mysql> RESET MASTER; 

您需要转储中的所有 3 个 GTID,并在下面的作业中用逗号分隔它们。

mysql> SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';

您现在可以初始化并开始复制:

对于每个数据库(在我的例子中,我更改了 ip,通道是您选择的字符串。您将使用此通道访问从属数据):

mysql> CHANGE MASTER TO MASTER_HOST="10.10.10.10", MASTER_PORT=3306, MASTER_USER="username", MASTER_PASSWORD="password", MASTER_AUTO_POSITION=1 FOR CHANNEL "db01";

然后启动各个slave:

mysql> START SLAVE FOR CHANNEL "db01";
mysql> SHOW SLAVE STATUS FOR CHANNEL "db01"\G

成功!

我有所有的数据,没有错误,现在是主服务器的最新数据