原理:
前提:
- 两个虚拟机(保证其里面的mysql数据都相同,可通过克隆虚拟机实现)
- mysql 8.0.16
- Master_IP:192.168.202.147
- Slave_IP:192.168.202.151
步骤:
1. mysql版本号一致,方便学习测试,修改网卡配置文件,重新设置IP,并关闭防火墙
2. 两个虚拟机结构中的server_uuid得保证不一样(需手动修改)
- 在数据库中查看server_uuid
show variables like'%server_uuid%';
- 修改uuid:
vi /var/lib/mysql/auto.cnf`
修改里面的值即可
- 重启MySQL服务
systemctl restart mysqld.service
3. 配置主从服务器
- 主服务器Master
vim /etc/my.cnf
开启二进制日志 binlog
[mysqld]
log-bin=mysql-bin
server-id=47
配置唯一的server_id server-id=28 建议使用IP地址后两位
- 从服务器Slave
开启中继日志
[mysqld]
relay-log=mysql-relay
server-id=51
配置唯一的server-id
mysql 启动slave服务 :
start slave
- 重启MySQL服务
systemctl restart mysqld.service
4. 在主机上建立账户并授权slave
create user 'copy'@'%' identified with mysql_native_password by 'Nebula@123';
GRANT REPLICATION SLAVE ON *.* TO ‘copy'@'%';
重新加载权限表:
flush privileges;
5. 查询master状态:show master status\G (进入数据库中执行)
记录上图结果中File和Position的值
注意:执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态发生状态值变化。
6. 告知从服务器二进制文件名与位置(从服务器操作)
CHANGE MASTER TO
master_host = ‘192.168.202.147’, #主库的IP地址
master_user = ‘copy’, #在主库上创建的复制账号
master_password = ‘Nebula@123’, #在主库上创建的复制账号密码
master_log_file = ‘mysql-bin.000001’, #开始复制的二进制文件名(从主库查询结果中获取)
master_log_pos = 826; #开始复制的二进制文件位置(从主库查询结果中获取)
注意826 左右无引号
当看到上图红色三个才表明状态正常。mysql 主从数据不一致,提示:Slave SQL Running:No的解决办法
显示如下情况表示slave不同步
解决方法
7. 先停掉slave:mysql> stop slave;
8. 跳过错误步骤,后面步数可变:mysql> set global sql_slave_skip_counter=1;
9. 在启动slave:mysql> start slave
10. 查看同步状态:mysql> show slave status\G
测试主从复制是否成功
Master中和Slave中执行SQL:
SHOW DATABASES
在Master中创建数据库并创建数据表并插入一条数据:
create database test;
use test;
create table tab1(id int auto_increment,name varchar(10),primary key(id));
insert into tab1(id,name) values (1,'why');
在Slave中查询这条数据是否同步过来
常用语句
show master status: 查看master的状态,尤其是当前的日志及位置 show slave status 查看slave的状
态
reset slave 重置slave状态
start slave 启动slave状态
stop slave 暂停状态