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

问题描述 投票:0回答:1

我有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

我错过了什么吗?任何帮助表示赞赏。

mysql replication gtid
1个回答
0
投票

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

所以这是我的解决方案:

ME的MySQL多源GTID复制指南:

重新/安装MySQL服务器:

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

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

然后在提示符处选择YES以删除“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 Slave Server配置:

现在我决定在导入任何数据之前完全配置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和channel是您选择的字符串。您将使用此通道访问从属数据):

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";

然后启动每个奴隶:

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

并且成功!

我拥有所有数据,没有错误,现在它与主服务器保持同步

© www.soinside.com 2019 - 2024. All rights reserved.