从零真实搭建一主一从的复制关系,验证从配置命令到数据真实同步的完整闭环是怎么跑通的。
代码-- source:server-id=1,开binlog+GTID mysqld --server-id=1 --log-bin=source-bin --gtid-mode=ON --enforce-gtid-consistency=ON ... -- replica:server-id=2,同样开binlog+GTID(自己也要能产生GTID记录本地事件) mysqld --server-id=2 --log-bin=replica-bin --gtid-mode=ON --enforce-gtid-consistency=ON ... -- source上真实建复制专用账号 CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
代码(在replica上执行)CHANGE REPLICATION SOURCE TO SOURCE_HOST='127.0.0.1', SOURCE_PORT=19310, SOURCE_USER='repl', SOURCE_PASSWORD='ReplPass123!', SOURCE_AUTO_POSITION=1; START REPLICA;
Source_Host: 127.0.0.1 Source_Port: 19310 Replica_IO_Running: Yes Replica_SQL_Running: Yes Last_Error: (空) Seconds_Behind_Source: 0 Auto_Position: 1
两个线程都真实显示Yes,没有任何错误——SOURCE_AUTO_POSITION=1真实是关键的一步,它让replica用GTID自动判断"我应该从source的哪个位置开始拉取",不需要像传统复制那样手动去查、手动指定binlog文件名和偏移量。
-- source
CREATE DATABASE shop;
CREATE TABLE shop.orders (id INT PRIMARY KEY AUTO_INCREMENT, item VARCHAR(50), qty INT);
INSERT INTO shop.orders (item, qty) VALUES ('apple', 10), ('banana', 5);
-- replica(几乎同时查询)
SELECT * FROM shop.orders;
→ 1 apple 10
2 banana 5 ← 真实一模一样,包括数据库和表结构本身也是复制过来的每一步都是本文上面用真实两节点复制环境跑出来的原始结果。
CHANGE REPLICATION SOURCE TO ... SOURCE_AUTO_POSITION=1 + START REPLICA