前言
近期有身边的小伙伴在面试的时候被面试官问到关于mysql主从复制的原理,今天就将Mysql中关于备份与复制的内容整理一下,供小伙伴们参考
一、备份
1、备份的方式角度:
- 热备份(数据库运行中进行备份,不会影响数据库的运行状态)
- 冷备份(数据库停止下来进行备份)
- 温备份(数据库运行中进行备份,会对数据库产生影响,如加个全局读锁)
2、备份后文件的内容角度:
- 逻辑备份(备份的是一条条可执行的sql,适用于数据库升级、迁移等,缺点是恢复所需时间长
- 裸文件备份(备份的是物理文件)
3、备份数据库的内容角度:
- 完全备份(对数据库进行完整备份)
- 增量备份(在完整备份的基础上,对变更的内容进行备份)
- 日志备份(二进制文件备份,默认情况下MySQL并没有启用它,通过对二进制日志的replay来完成数据库的point-in-time的恢复工作,MySQL数据库复制其实就是通过异步实时的将二进制日志重做传送并应用到从数据库);
4 冷备工具使用:
- mysqldump
- select … into outfile
5、热备工具使用:
- ibbackup(收费)
- xtraBackup(开源,涵盖了ibbackup所有功能)
6、快照备份:
- msyql本身并没有快照备份的功能,主要依赖文件管理系统支持的快照功能进行备份;
二、复制
复制是异步实时进行的,所以存在主从服务器之间的延迟;作用就是数据备份、读取负载均衡、高可用和故障转移;
三个步骤:
- master把数据变更记录到二进制日志(binlog)中
- slave中的io线程把master的binlog复制到自己的中继日志(relay log)中
- slave中的sql线程重做中继日志中的日志,把变更应用到自己的数据库中,以达到数据的最终一致性;
原理图如下:
这里有一个注意的地方:
如果master上执行了删库的操作,slave也复制过去执行了,那么我们的数据库备份就不起作用了,这是很致命的;可以通过如下方式处理:
通过对slave上的数据库所在的分区做快照,并且建议将slave设置为read-only,只进行数据的同步
相应的原理图变成如下:
*参考书籍:《MySQL技术内幕》