# :-: **Mysql 5.7 复制**
[TOC]
## 主从复制基本知识了解
1. Mysql复制为 **异步** 复制
2. 主从复制原理 Master 主库 Slave 从库
![](https://box.kancloud.cn/cac3d683f1fa997d9c88d7a011b1b4d4_1076x724.png)
3. TPS 并发读写数 一般在 几百上下/s 也有部分可以达到 几千上下/s
4. 一般主从之间 避免延迟导致的数据 **延迟性** 可使用 **假一致性** (必要的时候 从主库读取实时数据 不必要的用户 依旧读取从库数据)
5. Mysql复制 基于**BinLog**日志
> 日志存在三种格式
> * Statement:BinLog中存储SQL语句,存储日志量最小
> * Row:存储event数据,存储量大,但是不能直接的进行读取
> * Mixed:介于两者之间的存储方式,对不确定的操作使用Row记录,如果每天数据操作量很大,产生日志较多,可以考虑Mixed格式。
> 注意:一般主从复制 不适用Statement日志格式,避免影响主从数据不一致。
6. ![](https://box.kancloud.cn/fbadd7ffd669517a2a84198f44d29e70_525x211.png)
--binglog-do-db : 同步数据库
--binglog-ignore-db : 不同步数据库
7. ![](https://box.kancloud.cn/a3cb58147dc9f39aa1a3d94b7d2516f0_580x343.png)
8. Mysql 复制类型
>* [ √ ] 基于二进制日志复制 (Mysql5.5之前唯一支持的复制类型)
>* [ √ ] 使用GTID(全局事务标识符)完成基于事务的复制
9. Mysql 支持半同步复制。
![](https://box.kancloud.cn/75c1b9747345ab47be7bfead1aa51812_496x404.png) 5.6
![](https://box.kancloud.cn/dc72c2c12efe152c57394527e80b128e_519x412.png) 5.7
*****
## 主从复制搭建 (主从均为Linux服务器)
>### 一、创建复制用户 (主库)
```
——不推荐使用——
IP:192.168.1.100 或 192.168.1.%匹配整个1网段
grant replication slave on *.* to '用户名'@'从库IP' identified by '密码';
——推荐——
先创建用户
create user '用户名'@'从库IP' identified by '密码';
授权用户
grant replication slave on *.* to 用户名@'从库IP';
```
>### 二、使用mysqldump导出数据(主库)
```
进入到需要导出的文件位置中
例如 导出到 /tmp/下
mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases -uroot -p> all.sql
按照提示输入密码
```
> ### 三、将导出sql文件传入 从库 中(主库)
```
scp all.sql root@192.168.2.202:/tmp/
```
>### 四、查看all.sql中的MASTER_LOG_FILE、MASTER_LOG_POS(从库)
```
more all.sql
查看 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
MASTER_LOG_FILE
MASTER_LOG_POS
将两个值记录下来
```
>### 五、从库配置
```
此处用户密码 使用 主库create生成的用户密码
mysql>change master to marset_host='主库IP',
>master_user = '用户',
>master_password='密码',
>master_log_file=上面查看的 MASTER_LOG_FILE值,
>master_log_pos=上面查看的 MASTER_LOG_POS值;
```
>### 六、开启slave
```
start slave;
```
>### 七、 查看slave status
![](https://box.kancloud.cn/da11cf0aa112946c4316f5b5ad7fd742_1028x855.png)
```
show slave status \G;
Slave_IO_Running: No
Slave_SQL_Running: Yes
查看 slave链接状态 都为yes时 连接成功
连接失败时 查看此信息
Last_IO_Errno: 1593
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
```
> **中间可能会因为个人的环境问题 有一些报错,相信大家都可以动手解决掉,解决问题的同时,学习到更广面的知识**
*****
## 扩展知识
>### 主动延时复制
在从库中进入MySQL 进行设置 主动延时复制
**设置延时操作时 先关闭slave服务**
`mysql> change master to master_delay=3600;`
> 设置完成之后,输入一下命令查询
`mysql> use performance_schema;`
`mysql> show tables;`
![](https://box.kancloud.cn/f7e98fc59898d075e127113360c6262d_583x676.png)
> replication_***开头的表 都是主从配置的视图表
`mysql>select * from replication_applier_configuration ;`
![](https://box.kancloud.cn/b69aa39d2db45e861be685971e715d64_1007x236.png)
CHANNEL_NAME : 复制链路名称,MySQL支持多链路复制,可以存在一条空字符串的channel_name,当存在多条复制链路时链路的channel_name都不能一样。
DESIRED_DELAY:主从复制延迟,该字段用来配置当主进行操作之后延迟多少秒后才被复制到slave节点。
`mysql>select * from replication_applier_status`;
![](https://box.kancloud.cn/47087727ba17e3d8ee0536f1a96ca8ce_727x106.png)
SERVICE_STATE:复制状态
REMAINING_DELAY:下次主从同步时间
多线程复制视图表
replication_applier_status_by_coordinator
replication_applier_status_by_worker
主从同步配置信息
replication_connection_configuration
链接状态
replication_connection_status
## 基于日志复制 在线转换为 基于事务的复制
![](https://box.kancloud.cn/12476f22b09547e4491ba6ec7afd3b12_1287x462.png)
**基于事务的复制 对于数据的完整性 更加安全 推荐使用 基于事务的复制**
*****
### 转换分为九个步骤
![](https://box.kancloud.cn/95ac52757b306145339bc924c3d9268d_1117x420.png)
![](https://box.kancloud.cn/2ff5e0b883ec5d28843093d4cbca99a4_1208x360.png)
### 以下为实际操作代码块
#### 查看版本信息
`mysql> show variables like 'version';`
#### 查看服务器gtid_mode
`mysql> show variables like 'gtid_mode';`
#### 设置gtid_consistency (主库和从库)
`mysql> set @@global.enforce_gtid_consistency=warn;`
#### 查看当前的错误日志配置 查询日志位置
`mysql> show variables like 'log_error';`
查看错误日志 确定没有报错的情况下
#### 再次设置gtid_consistency (主库和从库)
`mysql> set @@global.enforce_gtid_consistency=on;`
> gtid_mode 四种值 只能按顺序设置
> off 关闭
> off_permissive 关闭准备
> on_permissive 启动准备
> on 启动
#### 修改gtid_mode(主库和从库)
`mysql> set @@global.gtid_mode = off_permissive;`
`mysql> set @@global.gtid_mode = on_permissive;`
#### 查看是否有匿名复制(日志复制)
为空即可
`mysql> show status like 'ongoing_anonymounse_transcation_count';`
#### 确认没有匿名复制之后继续修改gtid_mode(主库和从库)
`mysql> set @@global.gtid_mode = on;`
然后查看一下gtid_mode
`mysql> show variables like 'gtid_mode';`
#### 重启slave(从库)
`mysql> stop slave`
`mysql> change master to master_auro_position=1;`
`mysql> start slave`