server-id=1 # 服务器 id, 每台服务器必须唯一
log-bin=mysql-bin # 设置 log-bin 名称
binlog-do-db=demo # 设置要同步的数据库名称
server-id=2 # 服务器 id, 不能与主库相同
relay-log=mysql-relay-bin # 设置 relay-log 名称
replicate-wild-do-table=demo.% # 设置要同步的数据库名称
docker-compose up -d
docker-compose exec demo-mysql-master mysql -uroot -p demo
CREATE USER 'db_sync'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%';
FLUSH PRIVILEGES;
show master status;
记录输出信息中的日志文件和位点信息,如下图。
docker-compose exec demo-mysql-slave mysql -uroot -p demo
stop slave;
CHANGE MASTER TO master_host='demo-mysql-master',master_user='db_sync',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=844;
start slave;
show slave status\G
命令中的日志文件和位点信息需要按照配置主库时记录的值进行填写。配置成功后输出如下信息。
-
本例中使用显式设置位点的方式开始同步,需要在开始同步前保证主从库状态相同。
-
同步数据库(表)的相关配置有:
binlog-do-db
binlog-ignore-db
replicate-do-db
replicate-ignore-db
replicate-wild-do-table
replicate-wild-ignore-table
-
从库使用
replicate-wild-do-table=demo.%
方式进行配置,可以保证跨库执行的操作也能被同步。// my.cnf for slave replicate-do-db=db2 replicate-ignore-db=db1
use db1; update db2.table1 set ......
使用
replicate-do-db
,replicate-ignore-db
进行配置时,上面这样跨数据库执行的操作不会按照配置的预期被同步或忽略。参考: Why MySQL’s binlog-do-db option is dangerous. -
从库配置中如不设置
relay-log=mysql-relay-bin
,执行CHANGE MASTER
时日志中会出现如下警告。Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!!
当前服务器作为从库,由于未设置 relay-log,MySQL 将使用主机名作为 ralay-log 名称,如果此后主机名发生变化,将导致找不到 ralay-log 从而断开同步。显式设置 relay-log 后,警告消除。
-
要实现 A->B->C 形式的级联同步,B 节点除了要同时添加主库和从库的配置外,还要额外增加一句
log-slave-updates=1
的配置,将作为从库同步过来的修改写入 log-bin,以便让 C 节点能够同步到。