🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# :-: **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`