复制可以让数据从一个MySQL服务器(主库)复制到一个或多个MySQL服务器(从库)。复制默认是异步的,从库不需要一直连在主库上来接收主库的更新。通过不同配置,你可以复制所有DB、想要的部分DB、或者仅复制DB中选定的表。
在MySQL中使用复制的好处有:
- 水平扩展————把负载分到多个从库上提高性能。在这种情况下,所有写入和更新在主库上,而读操作可以在一个或多个从库上。这种模型可以提高写的性能(因为主库专门用来更新),同时随着从库数量增多也可以极大提高读的速度。
- 数据安全性————因为数据被复制到从库,从库能暂停复制,然后进行备份,这样不会破坏主库相关数据
- 数据分析————实时数据可以在主库上继续生成,而同时我们可以在从库上进行数据分析,不影响主库性能
- 长距离数据分发————可以使用复制技术,给远程网站访问数据备份,而不用一直连着主库
MySQL 5.7支持不同方式的复制,之前方法是从主库binlog中复制各种事件,需要保证binlog文件及文件中位置在主从间同步。新的方法基于GTID,是事务性的,因此不需要关心这些文件或者文件中的位置,这大大简化了很多复制工作。MySQL使用GTID保证所有主库提交的事务也在从库上执行,从而保证主从一致性。在MySQL 5.7.5及之后版本,GTID记入系统表(mysql.gtid_executed),因此不需要像旧版本依赖binlog来记录。
MySQL中的复制支持不同类型的同步,最初同步是单向、异步复制(复制过程中主库不关心从库是否接收成功、执行成功),在MySQL 5.7中半同步
复制被引入,即在一个事务会话中,主库提交会被阻塞,等待至少一个从库告知它收到并记录了该事务。MySQL 5.7也支持延时复制,即从库可以设置自己延迟主库一定时间。如果有同步复制需求,可以使用MySQL Cluster。
有很多方法建立服务器之间的复制,但最好的方法,还是需要看你的数据量、存储引擎类型。
复制log记录格式主要有两种,基于语句的(记录整个SQL语句)和基于行的(只记录改变的行数据),也可以用第三种,混合类型。MySQL 5.7.7之前版本默认用基于语句的,MySQL 5.7.7及之后版本默认用基于行的。
复制功能受很多不同选项、配置参数控制,它们控制了复制的核心操作、超时以及哪些DB和表被选择复制。
你可以用复制来解决很多不同的问题,包括性能、不同DB的备份、系统故障恢复等。