0

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

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

4

1 回答 1

0

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

所以这是我的解决方案:

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

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

为 Ubuntu 14-lts 重新安装 MySQL Server 5.7

$ sudo apt-get install mysql-server-5.7

如果您的系统上没有 5.7,请使用本指南

备份实时主数据库:

我创建了所有 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。如果您已经强制导入并看到此错误,您可以通过执行清除两个 GTID 变量mysql > RESET MASTER;

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

然后启动每个从站:

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

和成功!

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

于 2015-06-03T06:35:07.337 回答