主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。复制是异步的,从机不需要永久连接以接收来自主机的更新。根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
MySQL中复制的优点包括:
Replication 的原理:当主库写入文件的时候,从库读取写入文件的SQL,到从库再次执行一次
前提是作为主服务器角色的数据库服务器必须开启二进制日志,由于MySQL不同版本之间的(二进制日志)bin-log格式可能会不一样,建议Master(主)的MySQL版本和Slave(从)的版本尽可能的相同或者更低。MySQL主从是基于binlog,在主机上需开启binlog才能进行主从。
主从过程步骤

MySQL主从作用

环境准备
| 角色 | 操作系统 | IP地址 | MySQL版本 |
|---|---|---|---|
| 主机(Master) | CentOS | 120.118.55.220 | mysql 5.7.26 |
| 从机(Slave) | Ubantu | 130.211.18.183 | mysql 5.7.26 |
注意:Centos 是mysqld, 而 Ubantu 是 mysql 服务
1、Master节点配置 /etc/my.cnf (master节点执行)注意:
- 主节点和从节点必须配置唯一id ,其他配置是可选项
- centos是 vim /etc/my.cnf
- ubantu是 vim /etc/mysql/mysql.conf.d/mysqld.cnf
> vim /etc/my.cnf
# 找到[mysqld]添加下面内容
[mysqld]
## 同一局域网内注意要server-id一定要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
## 复制过滤:过滤掉不需要的数据库,如过滤掉mysql数据库
binlog-ignore-db=mysql
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
# 重启mysql服务,一般配置文件写完后,都需要重启该服务才生效
systemctl restart mysqld
2、重启mysql服务,使新配置生效
> systemctl restart mysqld
3、mysql查看是否开启二进制日志文件
默认是OFF没有开启,只有配置了my.cnf的log_bin后,才打开,为ON
mysql> show variables like 'log_%';

4、在master服务器授权slave服务器的同步权限(master节点执行)
mysql > mysql -uroot -p密码
# 授予slave服务器可以同步master服务
mysql > grant replication slave, replication client on *.* to 'root'@'slave服务的ip' identified by '从机访问主机的密码';
mysql > flush privileges;
# 查看MySQL现在有哪些用户及对应的IP权限(可以不执行,只是一个查看)
mysql > select user,host from mysql.user;
#如:
mysql> grant replication slave, replication client on *.* to 'root'@'130.211.18.183' identified by '3456789';
mysql > flush privileges;
# 'root' :就是从机(Slave)要访问主机(Master)的用户名;
# '130.211.18.183':就是从机(Slave)的IP地址;
# '3456789' :就是从机(Slave)访问主机(Master)的密码;是你自己新设置的密码,不是主机的密码。

若出现 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)
5、查询master服务的binlog文件名和位置(master节点执行)
mysql > show master status;
日志文件名:mysql-bin.000003
复制的位置:154

1、Slave节点配置 vim /etc/mysql/mysql.conf.d/mysqld.cnf
> vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=102
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
##复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 重启mysql服务,一般配置文件写完后,都需要重启该服务才生效
systemctl restart mysql
2、重启mysql服务,使新配置生效
> systemctl restart mysqld
3、slave进行关联master节点
1.进入到slave节点:
mysql > mysql -uroot -p密码
2.开始绑定
mysql> change master to master_host='master服务器ip', master_user='root', master_password='master密码', master_port=3306, master_log_file='master二进制日志文件名',master_log_pos=master二进制日志文件Position;
# 如
mysql> change master to master_host='120.118.55.220', master_user='root', master_password='3456789', master_port=3306, master_log_file='mysql-bin.000003',master_log_pos=2897;
| master_host | 主节点(Master)的IP地址 |
|---|---|
| master_user | 在主节点数据库中授权的用户名:root |
| master_port | MySQL对应的端口:3306 |
| master_password | 在主节点数据库中授权的从节点的密码 |
| master_log_file | 在主节点中 show master status 时对应的 File 后面的文件 |
| master_log_pos | 在主节点中 show master status 时对应的 Position 后面的那个数字 |
4、在slave节点上查看主从同步状态
1.启动主从复制
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2.再查看从机的主从同步状态
mysql> show slave status\G;
# \G是换行查看,不换行查看的话,即没有格式化内容,就比较凌乱。
3.当Slave_IO_Running和Slave_SQL_Running都是 Yes 的时候,说明主从能够正常同步了

其他命令 (slave节点执行)
# 停止复制
mysql> stop slave;
5、主从复制测试
1、查看主节点(Master)中存在的数据库:

2、查看在从节点(Slave)中存在的数据库:

3、我们在主节点(Master)中创建Student数据库:
mysql > create database Student charset utf8;
mysql> show databases;

4、我们在从节点(Slave)中查看是否有 Student 数据库的存在:

5、测试完成,这时候,你在主库的Student创建的数据,在从库也会看到!
小总结
1、主从复制Connecting问题

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。
2、MYSQL镜像服务器因错误停止的恢复 —Slave_SQL_Running: No
# 在从机先stop slave,然后执行了一下提示的语句
mysql > stop slave;
mysql > set global sql_slave_skip_counter=1;
mysql > start slave;
mysql > show slave status\G ;
3、从MYSQL服务器Slave_IO_Running: No的解决
mysql > show master status;
mysql > stop slave;mysql > CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=519086591; mysql > start slave;
造成这类问题的原因一般是在主从复制的时候,基于创建表,然后又马上去删除和操作了数据表或者表,导致master节点的pos位置发生改变!