登 录
注 册
< 数 据 库
MySQL
ClickHouse
ES
Doris
MongoDB
Redis
其他DB
AB复制实例
读写分离架构
数据备份恢复
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
MySQL
>>
AB复制实例
AB复制实例
2020-07-04 22:18:13 星期六 阅读:4433
![](/static/images/article_images/1693752269.4788458.jpeg) AB复制是MySQL集群中常用的技术之一。 主流的数据库都会先写日志,后操作,MySQL主库开启Binary_log日志功能,主库所有的操作都会记录到Binary_log。从库在跟主库网络畅通的前提下,从库通过I/O进程,把主库的日志读到从库本地,并写到从库的日志里,通过从库里的SQL进程,再把从库里的日志解析,在从库本地做相应的操作。【其实相当于:主库干什么,从库就跟着干什么】 A就是那个主库,B就是那个从库。一般是AB复制,你也可以ABBBBBBBCCCCCCD复制。 ####AB复制主要通过2个进程实现 `从库上的` I/O进程:从主库上把bin-log下载到从库后,放到从库的Relay-log中。 SQL进程:把Relay-log中的动作,在从库上做一次。 注意: (1)、关闭防火墙,如果主库或从库中开了防火墙,会造成I/O进程无法连接。 (2)、生产遇到SQL进程报错,如何解决?从主库拿到一些操作,在从库上执行不了,通过会跳过那些执行不了的。 (3)、如果配置完AB复制后,2个进程一直是connecting状态,可能是同步的日志位置没找好【重新找一次日志位置】 咱们的数据是以为主库为准,在生产库做AB复制,主库中肯定有一些数据,`从库肯定是新的库` ####AB 复制实例 **`1.主库创建测试表`** ``` create database m; use m; create table a(a int); insert into a values(1); ``` ``` [root@rhce ~]# service iptables stop //关闭防火墙 [root@rhce ~]# setenforce 0 //临时关闭selinux vi /etc/selinux/config //永久关闭,要重启 将SELINUX=enforcing改为SELINUX=disabled ``` **`2.主从库修改my.cnf文件`** master `vim /etc/my.cnf ` ``` [mysqld] server_id = 1【配置文件,server_id的值小,代表是主】 [mysql] server_id = 1 log-bin=binlog 【在主库开启bin-log日志】 log-bin-index=binlog.index ``` slave `vim /etc/my.cnf` ``` [mysqld] server_id = 2 [mysql] server_id = 2 relay_log = /app/mysql/mysql-relay-bin 【在从库开启relay-log日志】 relay_log_index=/app/mysql/mysql-relay-bin.index ``` **`3.主从均重启MySQL服务`** ``` service mysql restart ``` **`4.从库创建测试用户`** ``` mysql> GRANT replication slave ON *.* TO "user"@"%" identified by "user"; 【创建一个用户,赋予复制权限】 Query OK, 0 rows affected (0.05 sec) mysql> flush privileges; 【权限生效】 ``` **`5.主库将现有数据备份`** 主库上有一些数据了,从库是干净的,要同步数据,两个库在同一起点才能同步。所以把主库的旧数据导出,再导入从库,让两边数据一致。 ``` mysqldump -u root -pmysql m >/tmp/full.sql cp /tmp/full.sql root@从库IP:/tmp/ scp /tmp/full.sql root@192.168.8.101:/tmp/ ``` **`6.从库将主备份的数据导入`** ``` mysql -u root -pmysql m < /tmp/full.sql ``` **`7.给主库加锁并查看bin-log状态`** ``` # 【给主库加上读锁,防止再的操作修改主库。咱们上面已经把主从库两边数据同步了】 mysql> flush tables with read lock; #【查看Bin-log状态,查看写到哪个日志的哪个位置了,从库从现在的位置同步】 mysql> show master status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000001 | 402 | | | | +---------------+----------+--------------+------------------+-------------------+ mysql>unlock tables; ``` **`8.设置从库从指定的位置开始同步`** ``` mysql> change master to master_host="主库IP", master_port=3306, master_user="同步复制的用户", master_password="同步复制的密码", master_log_file="binlog.000001",master_log_pos=402; change master to master_host="192.168.8.100", master_port=3306, master_user="user", master_password="user", master_log_file="binlog.000001",master_log_pos=402; mysql> start slave; # 查看是否复制成功 mysql> show slave status G Slave_IO_Running: Yes Slave_SQL_Running: Yes ``` **`9.主库创建新数据测试`** ``` create database slave; use slave; create table a(a int); insert into a values(1); insert into a values(2); ``` 正常情况下,在从库能看到主库建的库和表。 ###附录 【show slave status G】一些参数说明 Seconds_Behind_Master: 0 【说明同步效率非常好:主库发生变化,过了多少秒,从库就更新过来了】在实际的公司中,当连接的用户过多时,即便此处为0 ,也会存在延迟。 配置从库只读 **从库的数据应该全是从主库同步过来的,不应该有人往从库中写数据** ``` vim /etc/my.cnf read-only=1 【只读,如果使用root用户登录,可以写数据,其它用户不能】 ``` 如果从库的同步进程停止了,主库的操作还会往从库中同步吗?会丢数据吗? 比如:主库正常工作,从库意外停止了,一周后才发现。此时,`只需要把从库的mysql服务开启,主库这一周的数据就会自动写入从库中,不需要任何人为操作` more /app/mysql/data/master.info 可以认为该文件记录着主库和从库的日志同步信息,如果在从库的mysql服务停了之后,把该文件删除,一周后再启动从库的mysql服务,则这一周主库的所有操作将不会自动同步过来 配置好AB复制的架构后,某一天突然不能用了,用show slave status G 命令查看I/O和SQL进程,发现其中某一个是no或者都为no,主库的数据同步不过来,解决办法: - 删除从库下的binlog日志文件和binlog.index文件,(该文件的路径,可查看/etc/my.cnf) 把主库中的数据备份到从库,并且日志位置找对。 从库停止`mysql> stop slave ` 使用change master 根据新的日志位置再执行一遍 开启从库`mysql> start slave`