# :-: **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`