在本篇文章中,我们将深入探讨 MySQL binlog 的原理、配置以及如何通过 binlog 实现主从同步。无论你是 MySQL 新手,还是希望进一步了解数据库高可用性的开发人员,都可以从本文中获得宝贵的实践经验和理论知识。
2. Binlog
Binlog(Binary Log,二进制日志) 是 MySQL 用来记录所有数据库修改操作的日志文件,是Mysql server层去记录,所以,不管是什么存储引擎进行的数据存储,如果BinLog开启,都会进行记录。
Binlog用途
- 数据同步与主从复制:
在 MySQL 主从复制架构中,主服务器将所有的数据库变更操作记录到 binlog 中,从服务器会读取主服务器的 binlog 文件并将其应用到本地数据库,从而实现数据的实时同步。
binlog 是主从复制的核心,通过它,MySQL 可以确保从服务器与主服务器保持数据一致性。
- 数据恢复:
- binlog 提供了基于时间点的数据恢复功能。当发生数据库崩溃或误操作时,管理员可以从最后的备份恢复数据,并通过 replay binlog 文件将其恢复到最新状态。
- 这种方式比传统的全备份方式更高效,可以更精确地恢复到某个特定时刻的数据。
Binlog配置
查询Binlog配置命令
show variables like '%log_bin%';
show variables like '%binlog%';
比较重要的配置含义
log_bin -- 默认on 开启 可以对binlog进行关闭
log_bin_basename -- bin文件前缀 默认/var/lib/mysql/mysql-bin
log_bin_index -- bin文件索引 /var/lib/mysql/mysql-bin.index
binlog_cache_size -- binlog日志 事务缓存大小
binlog_encryption -- 内容是否加密 我们的内容为了安全性可能需要加密
binlog_format -- binlog格式
binlog_expire_logs_seconds -- 多久后binlog删除 默认2592000s也就是30天
BinLog格式
STATEMENT: 基于sql语句记录,记录的是语句,后续去执行binLog的执行语句。优点是存储空间小,但在某些情况下可能会出现与主库不一致的情况,比如:
update order set pay_time = now() where id = 1;
大家想想,如果这条语句是11月1号执行的,但是11月3号数据库宕机需要恢复数据,那么pay_time就会有问题。
ROW: 基于行格式记录,binLog记录的是单个行是如何更改的,虽然这种方式会占用更多的存储空间,但能确保主从数据的一致性。比如上面那个语句:
update order set pay_time = 168535465 where @1 = 1; -- 168535465随便写的,不要纠结这个
MIXED: 混合模式,默认是STATEMENT,在个别场景会切换成ROW模式
BinLog同步机制
BinLog也是先放到内存再同步到磁盘的,这里可以联想下redolog内存与磁盘的方式
show variables like '%binlog_cache_size%'; -- 事务期间用于保存二进制日志更改的内存缓冲区的大小
show variables like '%sync_binlog%'; -- 同步方式
sync_binlog=0,不同步刷新到磁盘,交给操作系统去操作,断电或者操作系统异常,可能导致数据丢失
sync_binlog=1,能保证数据的一致性,每次提交都必须同步到磁盘,但是对性能有影响,默认
sync_binlog=N, N默认是1,最大4294967295,代表我达到N条binLog后,再同步到磁盘,能够灵活的来设置数据的一致性与性能之间的平衡
3. 主从同步
流程图:
图片
必要条件:
- 确保有唯一的server_id在配置文件中配置
server-id=xx
或者使用sql语句配置
SET GLOBAL server_id=xx; -- 更改server_id
- 数据源(master)必须开启bin_log
从库创建流程
- master创建用户
- 建立主从关系
CHANGE REPLICATION SOURCE TO
-> SOURCE_HOST='source_host_name',
-> SOURCE_USER='replication_user_name',
-> SOURCE_PASSWORD='replication_password',
-> SOURCE_LOG_FILE='recorded_log_file_name',
-> SOURCE_LOG_POS=recorded_log_position; --我要从binlog的哪个位置开始同步
- 开启主从同步
start replica; --开启主从同步
- 更改从库只读
SHOW VARIABLES LIKE'%read_only%';
SET GLOBAL super_read_notallow=1; -- super账号也只读
SET GLOBAL read_notallow=1; -- 只读
同步方式
- 异步同步:默认方式,性能比较高,但是数据一致性低,会有数据丢失可能。
- 半同步:由于异步同步会存在一定的数据丢失,所以Mysql的主从复制有一个半同步的概念,所谓半同步,就是我的主必须等待数据至少有一个副本(具体数量可以进行配置)接收并记录了,才会允许提交事务。
4. 总结
MySQL 的 binlog(二进制日志) 和 主从同步 是确保数据库高可用性、可扩展性和灾难恢复的关键技术。通过 binlog,MySQL 记录了所有数据修改操作,为主从复制提供了数据同步的基础。主服务器的变更通过 binlog 被传递到从服务器,实现了数据的实时同步,从而保证了数据的一致性和容错能力。
在配置 MySQL 主从复制时,理解和正确配置 binlog 是至关重要的。binlog 不仅是数据同步的核心,也是数据库恢复和数据审计的重要工具。通过合适的配置(如设置 log_bin、server-id、read_only 等参数),可以确保主从同步的高效性和可靠性。
此外,虽然 binlog 和主从复制为 MySQL 提供了高可用性和灾难恢复的基础,但在实际使用过程中,仍然需要关注复制延迟、网络带宽、负载均衡等因素的影响。对于复杂的生产环境,建议结合 GTID(全局事务标识符) 和 semi-sync replication(半同步复制) 等技术来进一步增强主从复制的健壮性和一致性。
总的来说,MySQL 的 binlog 和主从同步技术为我们提供了强大的数据复制和恢复能力,是构建高可用数据库架构的基石。在日常使用中,掌握这些技术不仅能帮助我们实现高效的数据同步,还能为系统的扩展性和容错能力提供保障。