MySQL80搭建主从复制(1主1从)

教程一:MySQL8.0手动主从复制,一主一从配置教程。

localhost ≠ 127.0.0.1 ≠ 192.168.1.%

临时关闭防火墙和seLinux。一定要记得!!!!所有服务器都要关!!99%的问题都是因为没有关闭防火墙和selinux。

#永久放行3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重载防火墙,是规则永久生效
firewall-cmd --reload

或者放行mysql服务也可以
firewall-cmd --add-service=mysql --permanent
firewall-cmd --reload

#查看所有放行端口
firewall-cmd --list-port --permanent
#查看放行服务
firewall-cmd --list-services --permanent

systemctl stop firewalld
systemctl status firewalld
#关闭selinux
setenforce 0
getenforce
# 返回 Permissive 表示临时关闭成功

准备5台服务器(虚拟机中即可),并配置好域名解析。

提前做好固定IP地址,然后再/etc/hosts文件中添加如下信息即可
192.168.1.6 master1
192.168.1.7 master2
192.168.1.8 slave1
192.168.1.9 slave1

主库保留现有数据,从库需清空现有数据,重新导入主库备份过来的数据。

在主服务器中开binlog二进制日志:
vim /etc/my.cnf

log_bin=ON
server-id=1

重启mysql服务使配置文件生效

在主服务器中主库配置授权主从复制账号,用于后续从库访问主库数据库操作

create user 'rep'@'192.168.1.%' identified by 'Rep_password123';
grant replication slave,replication client on *.* to 'rep'@'192.168.1.%';
#将mysql8.0默认密码插件从caching_sha2_password改为mysql_native_password,在企业内网环境下适配。
ALTER USER 'rep'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Rep_password123';
FLUSH PRIVILEGES;
#检查一下密码插件类型是否修改成功(也可以在创建时直接指定为mysql_native_password,即create user 'rep'@'192.168.1.%' identified with mysql_native_password by 'Rep_password123';)

SELECT user,host,plugin FROM mysql.user WHERE user='rep';

可以在本机验证一下是否能登录成功
mysql -urep -p -h 192.168.1.6 -P 3306

把主库现有数据全量备份,复制一份给从库。
mysqldump -p'Whoami77169!!!' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
也可以使用xtrabackup备份和恢复

scp -r 2026-07-10-mysql-all.sql huying2@master2:~

观察数据库备份binlog位置,后续会用到(重要!!!)
grep "CHANGE MASTER TO MASTER_LOG_FILE" 2026-7-9-mysql-all.sql
centos-bin.000007
157

更新主库数据变动,插入数据

在从库数据库服务器登录复制账户
mysql -urep -p'Rep_password123' -h master1
或者
# 把 192.168.1. 6换成你的主库实际局域网IP
mysql -urep -p -h 192.168.1.6 -P 3306

vim /etc/my.cnf

server-id=2
#这个全局标识是不能重复的
#普通用户无法写入
read_only = ON    
#连 root 超级用户也禁止写,防止人为误操作在从库改数据,造成主从数据分裂
super_read_only = ON   
#从库重启、崩溃后,自动清理损坏的中继日志(relay log),自动重新从主库拉取缺失 binlog,避免 SQL 线程报错、同步断裂。 

#开启中继日志
relay-log-recovery=ON
relay-log = relay-3
relay-log-index = relay-3.index

重启mysql服务并登录,验证数据库是否正常运行。

设置数据库日志临时关闭
set sql_log_bin=0;
source /tmp/2026-7-9-mysql-all.sql
 
检查数据是否导入

在从库配置从服务器从属关系
change master to master_host='master1',master_user='rep',master_password='Rep_password123',master_log_file='centos-bin.000007',master_log_pos=157;

启动从设备生效
start slave;

查询从设备启动状态
show slave status\G

找到如下标识则表示正常启动从状态
Slave_SQL_Running:Yes
Slave_SQL_Running:Yes

到此主从复制配置完成,到对应主从数据库验证是否同步。

一主多从原理和一主一从一致,配置好/etc/hosts文件域名解析,关闭防火墙和selinux即可。

教程二 主从复制自动协商

主库配置:
vim /etc/my.cnf

log_bin=ON
server-id=1

gtid_mode=ON
enforce_gtid_consistency=1

重启mysql服务使配置生效

create user 'rep'@'192.168.1.%' identified by 'Rep_password123';
或者在创建用户时指定密码插件为mysql_native_password
CREATE USER 'repl_user'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Rep_password123';

#授权复制
grant replication slave,replication client on *.* to 'rep'@'192.168.1.%';

#将mysql8.0默认密码插件从caching_sha2_password改为mysql_native_password,在企业内网环境下适配。
ALTER USER 'rep'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Rep_password123';
FLUSH PRIVILEGES;
#检查一下密码插件类型是否修改成功

SELECT user,host,plugin FROM mysql.user WHERE user='rep';

列出所有数据库用户:
SELECT User,Host FROM mysql.user;

扩展1:

-- 查看本地root权限
SHOW GRANTS FOR 'root'@'localhost';
-- 任意远程地址 %
SHOW GRANTS FOR 'repl'@'%';
-- 仅192.168网段
SHOW GRANTS FOR 'app'@'192.168.1.%';

扩展2:删除数据库用户

#回收权限
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'rep'@'192.168.1.%';
#刷新权限
FLUSH PRIVILEGES;
#删除用户
DROP USER 'rep'@'192.168.1.%';
#检查
SELECT user,host FROM mysql.user WHERE user='test';

可以在本机验证一下是否能登录成功

mysql -urep -p -h 192.168.1.6 -P 3306

把主库现有数据全量备份,复制一份给从库。
mysqldump -p'Whoami77169!!!' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
也可以使用xtrabackup备份和恢复

scp -r 2026-07-10-mysql-all.sql huying2@master2:~

从库服务器配置:

vim /etc/my.cnf

server-id=2

gtid_mode=ON
enforce_gtid_consistency=1
#普通用户无法写入
read_only = ON    
#连 root 超级用户也禁止写,防止人为误操作在从库改数据,造成主从数据分裂
super_read_only = ON   

#开启中继日志
relay-log = relay-3


relay-log-index = relay-3.index

重启mysql服务使配置生效

导入数据

set sql_log_bin=0;
source /xxx_backup.sql
select * from xx_db.xx_table;

change master to master_host='master1',master_user='rep',master_password='Rep_password123',master_auto_position=1;

启动从设备生效
start slave;

查询从设备启动状态
show slave status\G

找到如下标识则表示正常启动从状态
Slave_SQL_Running:Yes
Slave_SQL_Running:Yes

到此自动协商主从复制配置完成,到对应主从数据库验证是否同步。

总结:所谓手动与自动协商区别就是gtid_mode=ON,enforce_gtid_consistency=1,master_auto_position=1,其他地方是一模一样的。

如果需要清空现有主从复制关系,请执行:(避免使用rm -rf /var/lib/mysql/*带来的风险)

从库操作,停止原有同步线程
STOP SLAVE;
清空同步信息,清空所有同步配置(master.info、relay log 全部清理)
RESET SLAVE ALL;
检查是否清空
show slave status\G

主库执行:
RESET MASTER;

即可

posted @ 2026-10-16 21:49  解码青年  阅读(4)  评论(0)    收藏  举报