Mysql 复制 (主从复制)
最后更新于:2022-04-01 23:52:28
# :-: **Mysql 5.7 复制**
[TOC]
## 主从复制基本知识了解
1. Mysql复制为 **异步** 复制
2. 主从复制原理 Master 主库 Slave 从库

3. TPS 并发读写数 一般在 几百上下/s 也有部分可以达到 几千上下/s
4. 一般主从之间 避免延迟导致的数据 **延迟性** 可使用 **假一致性** (必要的时候 从主库读取实时数据 不必要的用户 依旧读取从库数据)
5. Mysql复制 基于**BinLog**日志
> 日志存在三种格式
> * Statement:BinLog中存储SQL语句,存储日志量最小
> * Row:存储event数据,存储量大,但是不能直接的进行读取
> * Mixed:介于两者之间的存储方式,对不确定的操作使用Row记录,如果每天数据操作量很大,产生日志较多,可以考虑Mixed格式。
> 注意:一般主从复制 不适用Statement日志格式,避免影响主从数据不一致。
6. 
--binglog-do-db : 同步数据库
--binglog-ignore-db : 不同步数据库
7. 
8. Mysql 复制类型
>* [ √ ] 基于二进制日志复制 (Mysql5.5之前唯一支持的复制类型)
>* [ √ ] 使用GTID(全局事务标识符)完成基于事务的复制
9. Mysql 支持半同步复制。
 5.6
 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

```
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;`

> replication_***开头的表 都是主从配置的视图表
`mysql>select * from replication_applier_configuration ;`

CHANNEL_NAME : 复制链路名称,MySQL支持多链路复制,可以存在一条空字符串的channel_name,当存在多条复制链路时链路的channel_name都不能一样。
DESIRED_DELAY:主从复制延迟,该字段用来配置当主进行操作之后延迟多少秒后才被复制到slave节点。
`mysql>select * from replication_applier_status`;

SERVICE_STATE:复制状态
REMAINING_DELAY:下次主从同步时间
多线程复制视图表
replication_applier_status_by_coordinator
replication_applier_status_by_worker
主从同步配置信息
replication_connection_configuration
链接状态
replication_connection_status
## 基于日志复制 在线转换为 基于事务的复制

**基于事务的复制 对于数据的完整性 更加安全 推荐使用 基于事务的复制**
*****
### 转换分为九个步骤


### 以下为实际操作代码块
#### 查看版本信息
`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`
';