我有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只注册了我的一个主数据库,它设置了继续复制过程的正确位置。其他数据库基本上是从一开始就开始的。因此,我收到的不正确的定位和重复记录错误。
所以这是我的解决方案:
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
并且成功!
我拥有所有数据,没有错误,现在它与主服务器保持同步