主从复制原理

- 主数据库有个 bin log 二进制文件,记录了所有增删改 SQL 语句。(binlog线程)
- 从库发起连接,连接到主库。
- 此时主库创建一个 binlog dump thread,把 bin log 的内容发送到从库。
- 从库启动之后,创建一个 I/O 线程,读取主库传过来的 bin log 内容并写到 relay log
- 从库还会创建一个SQL线程,从 relay log 里面读取内容。 重做日志文件,再执行一次这些sql语句。(sql执行线程)
搭建一主一从

一台是主数据库,同时对外提供读写操作。一台是从数据库,对外提供读的操作。数据从主库同步到从库。修改主机配置
vim /etc/my.cnf
注意:mydb1 数据库现在不要创建,等搭建完成主从之后,直接在主数据库创建,从数据也会创建该数据库。如果先创建了,搭建完成之后,其实从数据库并没有mydb1这个数据库。此时直接操作数据库会导致从数据库报错。# 主库其唯一idserver-id=1# 启用二进制日志文件log-bin=makun-master-bin# 设置不要复制的数据库(可设置多个)binlog-ignore-db=mysql# 设置需要复制的数据库binlog-do-db=mydb1# 设置binlog的日志格式binlog_format=STATEMENT

重启主机服务修改从数据库配置
# 从库唯一IDserver-id=2# 启动中继日志relay-log=mysql-relay

重启从机服务关闭防火墙
```bash临时关闭防火墙
systemctl stop firewalld
永久关闭防火墙
systemctl disable firewalld
<a name="yq1Tz"></a>### 主从连接配置1. 在主机创建slave账号```sql-- 创建slave1账号create user 'slave1'@'%' identified by '123456';-- 修改加密插件alter user 'slave1'@'%' identified with mysql_native_password by '123456';-- 授权grant replication slave on *.* to 'slave1'@'%';-- 刷新权限flush privileges;-- 查看master状态show master status;

- 在从机配置连接信息 ```sql change master to master_host=’192.168.58.128’, master_user=’slave1’, master_password=’123456’, master_log_file=’makun-master-bin.000003’,master_log_pos=1110;
— 上面log-file和pos接入点就是主机的信息 — 表示从机从哪里开始复制主机的
3. 开启从机服务
```sql
start slave;
查看从机状态
show slave status\G;
当这两个全是Yes的时候表示主从已经搭建完成在主机创建数据库便添加数据

如果发生错误想重新搭建的话
# 在从机停止slave stop slave; # 重置master信息 reset master; ## 之后就可以从查看主机状态信息开始,从新配置连接信息即可遇到的问题我的从服务器是直接把主服务器的虚拟机直接拷贝一份出来的,然后在配置从数据库连接信息的时候就不是两个
Yes原因是:克隆出来的服务器,和主服务器mysql的uuid是相同的 解决:手动修改其中一个uuid
# 查看uuid
select uuid();
# 解决
cd /var/lib/mysql/
vi auto.cnf
# 修改server-uuid
# 重启MySQL服务
systemctl restart mysqld
# 查看data目录位置
show variables like 'datadir';

搭建双主双从
修改m1配置文件
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=mydb1
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
# 因为时两台主机,所以步长为2 1、3、5、7...
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
修改m2配置
#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=mydb1
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
# 因为时两台主机,所以步长为2 2、4、6、8...
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
修改s1和s2配置
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay
在两台主机上建立帐户并授权 slave
# 创建slave1账号
create user 'slave1'@'%' identified by '123456';
# 修改加密插件
alter user 'slave1'@'%' identified with mysql_native_password by '123456';
# 授权
grant replication slave on *.* to 'slave1'@'%';
# 刷新权限
flush privileges;
# 查看master状态
show master status;
在从机上配置主机连接配置
change master to master_host='192.168.58.128',
master_user='slave1',
master_password='123456',
master_log_file='makun-master-bin.000003',master_log_pos=1110;
# 上面log-file和pos接入点就是主机的信息
# 表示从机从哪里开始复制主机的
# 开启从机服务
start slave;
# 查看从机状态
show slave status
# 必须是两个 Yes
现在只是搭建好了m1->s1,m2->s2,还差m1<->m2
两个主机互相复制
两个主机都要执行下面的操作,配置自行修改
change master to master_host='192.168.58.128',
master_user='slave1',
master_password='123456',
master_log_file='makun-master-bin.000003',master_log_pos=1110;
# 上面log-file和pos接入点就是主机的信息
# 表示从机从哪里开始复制主机的
# 开启从机服务
start slave;
# 查看从机状态
show slave status
# 必须是两个 Yes
验证
此时在m1新增数据库并插入数据
