环境说明
MySQL版本8.4.0
操作系统 Linux CentOS 7.9
官网文档
https://dev.mysql.com/doc/refman/8.4/en/replication-configuration.html
以下代码片段中带分号都是在MySQL命令行( mysql -uroot -p
)中执行
1. 首先在两个节点上安装数据库
节点 | IP |
---|---|
主库=复制源 | 192.168.133.181 |
从库=副本 | 192.168.133.182 |
2. 修改主库配置文件
设置日志文件名称和服务器ID,以及需要复制的数据库
bash
vim /etc/my.cnf
[mysqld]
下增加如下配置
bash
#服务器ID
server-id=1
#打开主库binlog日志,并设置文件名前缀
log-bin=mysql-bin
关于log-bin是否要设置可以通过
sql
show variables like 'log_bin%';
查询,MySQL8是默认开启的,MySQL5.7及以下版本默认未开启。当然如果是MySQL8版本你也可以重新指定bin-log文件名称。
修改完成后重启服务
sql
systemctl restart mysqld
3. 主库创建同步账号
sql
-- 创建用户 replica
CREATE USER 'replica'@'%' IDENTIFIED BY '12345678';
-- 授权
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
4. 主库获取 bin log 坐标
要配置副本(从库)在正确的点开始复制过程,需要在 bin log 中记下复制源(主库)的当前坐标
如果主库已经有数据
通过命令行客户端连接到主库,并通过执行以下
sql
FLUSH TABLES WITH READ LOCK;
语句刷新所有表并阻止数据写入,如果退出该客户端,锁定将被释放。
使用下面语句查看bin log日志文件名称和坐标位置
8.4.0及以后版本
sql
SHOW BINARY LOG STATUS;
8.4.0以前版本
sql
SHOW MASTER STATUS;
MySQL8.4.0版本,已将SHOW MASTER STATUS
废弃,改为SHOW BINARY LOG STATUS
https://dev.mysql.com/doc/relnotes/mysql/8.4/en/news-8-4-0.html#mysqld-8-4-0-configuration
5. 同步数据
如果主库已经有数据,可以使用mysqldump工具将数据复制到从库,保证两边数据一致。
6.配置从库
bash
vim /etc/my.cnf
[mysqld]
下增加如下配置
sql
#服务器ID
server-id=2
修改完成后重启服务
sql
systemctl restart mysqld
7.在从库上配置主库连接信息
8.0.23及以后版本
sql
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.133.181',
SOURCE_PORT=3306,
SOURCE_USER='replica',
SOURCE_PASSWORD='12345678',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=668;
SOURCE_LOG_FILE
和 SOURCE_LOG_POS
参考步骤4中查询出来的结果
其他参数就不做过多解释了,看字面意思,可以自行查阅官网。
8.0.23以前版本
sql
CHANGE MASTER TO
MASTER_HOST='192.168.133.181',
MASTER_PORT=3306,
MASTER_USER='replica',
MASTER_PASSWORD='12345678',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=668;
关于语句变更说明
8.在从库开启复制
新版本(8.0.22及以后)
sql
START REPLICA;
旧版本(8.0.22以前)
sql
START SLAVE;
查看从库复制情况
新版本(8.0.22及以后)
sql
SHOW REPLICA STATUS\G;
旧版本(8.0.22以前)
sql
SHOW SLAVE STATUS\G;
可以在主库新建数据库测试从库中是否同步。
如果上面状态有报错或复制失败 可能是数据不一致的原因
在从库上
先停止复制
sql
STOP REPLICA;
然后重置复制,它将清除复制元数据存储库,删除所有中继日志文件,并启动新的中继日志文件。
sql
RESET REPLICA;
最后重启复制
sql
START REPLICA;