浅谈数据库主从复制
浅谈数据库主从复制
首先,我们们需要了解一下,为什么需要数据库的主从复制。
- 线下测试库需要。
- 线下的数据分析。
- 数据库的读写分离。
那么问题来了,我们应该怎么实现数据库的主从复制呢???
很多人其实对于数据库的主从复制都不是很陌生的。数据库的主从复制大概分为以下三种:
- 基于语句的复制
- 基于行复制
- 混合复制
对于第三种的混合复制没有什么好说的!我们主要说一下前面两种复制。
在说复制方式之前我们首先说一下复制是怎么一个情况呢?
如果想复制就必须知道主数据库都发生了什么!不然你何谈复制呢?所以在master数据库发生每一个操作(变化)的时候,我们的主数据库,必须首先写下一条日志记录一下发生了什么。这个东西就是bin log (binary log 二进制日志)。
每一次我们需要复制的时候,从数据库就开一个(I/O)线程从master数据库上去读取这个日志文件。然后写到另外一个relaylog 中来。这个时候我们的数据库复制还没开始。然后slave(从)数据库会启动一个sql线程把所有的relay log 重新执行一遍。这样我们的master和slave也就保持了数据库的一致性了。
接下来重点来了,那么基于语句的数据库主从复制是不是没有任何问题呢?毕竟每一条都记录下来了应该没有什么问题是吧!其实,事情不是你以为的就是你以为的哟!遇到以下情况怎么办?用户自己写了一个函数和当前系统时间有关复制的时候肯定就时间戳不一样了。update的时候跟有不确定情况。
这些话有点长,上图大家就可以看得很清楚了。
总结一下大概有以下几个问题:
- 不是所有的update语句都可以复制特别包含了不确定的情况时
- 调用udf( user define function) 复制可能有问题
- 对于增加主键,如果发生了insert语句会阻塞其他语句,复杂语句会消耗太多资源
- 确定了udf也必须在slave上执行,复制几乎必须和主服务器保持一致不然出错的可能性很大
当然了,语句复制也不是就没有一点的好处了,下面列举一下优点:
- 基于语句的数据库复制技术很成熟了
- 二进制binlog一般会相对小一点
- 包含了数据库的所有信息,可以审计数据库的安全情况
- 可以用于实时还原
- 主从版本可以不一样
数据库的主从复制还有行复制。那么复制的原理和过程都是一样的。那么有什么异同呢?
缺点:
1. log是不可读(对人而言)
2. 如果复制有类似alter table这种操作产生的数据量异常的大
3. 回滚复制有大量数据
4. 文件相对很大
5. 不适合有大量的SQL堆积情况
优点:
- 任何情况都可以复制哟
- 如果已经有主建复制速度回快很多
- 对线程复制称为了可能
楼主今年刚参加工作,才疏学浅!求支持!!!!