一文带你实现MySQL8主从复制配置
1.主从复制是什么
MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能。
主从过程大致有3个步骤:
1)主设备将更改操作记录到binlog里;
2)从将主设备的binlog事件(sql语句)同步到从本机上并记录在relaylog里;
3)从根据relaylog里面的sql语句按顺序执行。
主设备上有一个log dump线程,用来和从的I/O线程传递binlog。从设备上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句执行。
2.配置前置条件
提前准备好两台服务器,我这边安装的是mysql8
主库Master 192.168.1.11
从库slave 192.168.1.106
3.配置Master库(192.168.1.11)
第一步:修改Mysq1数据库的配置文件/etc/my.cnf
[mysqld]
log-bin=mysql-bin #[必须]启用二进制日志,数据间复制必不可少
server-id=11 #[必须]服务器唯一ID
binlog-do-db=way_ktv #这里表示你需要同步哪一个库多个用“,”隔开
第二步:重启Mysql服务 systemctl restart mysqld
使用docker安装的mysql使用docker restart mysql 重启
第三步:登录Mysql数据库,执行下面SQL(我这边登录统一用root)
//mysql8授权用户需要先创建,创建和授权同一条语句的话会报错,mysql8默认使用的是sha256_password我这里是修改了加密插件为mysql_native_password
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'Abcd1234';
//再授权
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%'WITH GRANT OPTION;
//刷新
flush privileges;
注:上面SQL的作用是创建一个用户slave,密码为Abcd1234,并且给slave用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,可以理解为slave必须被master授权具有该权限的用户,才能通过该用户复制。
第四步:执行下面SQL,记录下结果中File和Position的值(记下来很重要)
show master status;
4.配置-从库Slave(192.168.1.106)
第一步:修改Mysq1数据库的配置文件/etc/my.cnf
[mysqld]
server-id=106 #[必须]服务器唯一ID
第二步:重启Mysql服务systemctl restart mysqld
第三步:登录Slave数据库,执行下面SQL
//执行前先停下slave
stop slave;
//清空信息
reset slave all;
//这是从库和主库连接的关键一步,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status的信息
change master to
master_host='192.168.1.11',master_user='slave',master_password='Abcd1234',
master_log_file='mysql-bin.000002',master_log_pos=1806;
//执行后启动slave
start slave;
第四步:登录slave数据库,执行下面SQL,查看从数据库的状态(我这边登录统一用root)
show slave status;
两个yes则表示成功配置主从复制,Connection和No都是配置有问题
5.同步不了,如何排错?
1.如果主从数据库同步不了,就从库执行下 show slave status\G;如果是Slave_IO_Running: No,那么,很可能是主从库server-id重复了,或者是防火墙端口没开通;
如果是 Slave_SQL_Running: No,那么我们可以通过跳过错误和手动同步来解决。
解决办法:跳过这个错误,
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;
2.如果主库一直在写入,导致主库的Position一直在变化
解决办法:锁库只读(Master)