我正在尝试设置从单个主服务器到多个从服务器的复制。我遵循了传统的步骤...
在 Master 上:
更新了my.cnf文件:
log-bin = /var/log/mysql/master-bin
log-bin-index = /var/log/mysql/master-bin.index
binlog_format = mixed
server-id = 01
replicate-do-db = database_name
使用以下命令为每个从属创建一个用户:
create user 'replicant'@'%' identified by 'replicant_password';
grant replication slave on *.* to replicant;
flush privileges;
在从属服务器上我做了以下操作:
更新 my.cnf 内容如下:
server-id = 02 [and 03,04 for the other slaves]
relay-log-index = /var/log/mysql/slave-relay-bin.index
relay-log = /var/log/mysql/slave-relay-bin
replicate-do-db = database_name
sudo systemctl restart mariadb
我锁定了主服务器上的表。我运行了 show master status 来获取日志文件和位置。我将数据库转储到 .sql 文件中,将其传输到从服务器并导入。这就是我遇到问题的地方...
在第一个从属服务器上,我能够运行以下命令,启动从属服务器,并且复制工作完美。
MariaDB [(none)]> change master 'master01' to
-> master_host='master_IP_address',
-> master_user='replicant',
-> master_password='replicant_password',
-> master_port=3306,
-> master_log_file='master-bin.000001',
-> master_log_pos=62307428,
-> master_connect_retry=10,
-> master_use_gtid=slave_pos;
但是,当我在第二台和第三台从服务器上执行相同的步骤时,我收到各种错误,表明它无法插入表、行等,因为数据已经存在。这几乎就像它忽略了主服务器的日志位置并试图再次覆盖所有内容。我尝试重置从服务器,并多次运行该过程。
唯一有效的方法是从从属服务器 2 和 3 中完全删除数据库,然后启动从属服务而不导入数据库。此时,数据库已创建并追上所有事务。这是正常行为吗?我只是想确保我没有遗漏任何东西。
我正在运行带有 Maria DB 10.4.7 的 Ubuntu 18.04.3 LTS。
答案1
对于后续的Slave,克隆一个现有的从属Slave:
SLAVE STOP
- 复制所有与 MySQL/MariaDB 相关的文件。
- 进行一处更改:
server_id
。 SLAVE START
在两个从属设备上。
使用此作为添加新从站(或替换死站)的程序。