多源复制 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
成功!
我有所有的数据,没有错误,现在是主服务器的最新数据
我有 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;
从 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
成功!
我有所有的数据,没有错误,现在是主服务器的最新数据