MYSQL的bin log是什么
问题
MYSQL的bin log是什么
我的回答
MySQL的bin log,全称binary log,是MySQL服务器层面的一种二进制日志,记录了所有修改数据库的操作。它主要有三个核心作用:
首先,binlog最重要的用途是用于主从复制。主库把所有数据变更记录到binlog中,从库通过拉取并重放这些binlog来保持数据同步。这是MySQL实现读写分离、高可用架构的基础。
其次,binlog用于数据恢复。比如我们做了一个全量备份,之后的增量数据可以通过binlog来恢复。如果某天凌晨3点数据库出了问题,而我们有昨天的全量备份和之后的binlog,就可以恢复到出问题前的状态。
第三,binlog还可以用于审计,因为它记录了所有的数据变更操作,可以用来追踪数据的变更历史。
关于binlog的格式,MySQL支持三种:
- STATEMENT格式:记录SQL语句原文,体积小但在某些情况下可能导致主从不一致,比如使用了NOW()、UUID()等函数时。
- ROW格式:记录行数据变化,保证主从一致性,但体积较大。这是MySQL 5.7后的默认格式。
- MIXED格式:结合前两种的优点,根据SQL语句自动选择使用STATEMENT还是ROW格式。
binlog的写入时机是在事务提交时,遵循两阶段提交机制。先写redo log并prepare,然后写binlog,最后commit redo log。这样即使崩溃,也能保证主从数据一致性。
在生产环境中,我们通常会设置sync_binlog=1,确保每次事务提交时binlog都会刷盘,提高数据安全性。但这会带来一定的性能开销,需要根据业务场景权衡。
binlog默认保留时间是30天,可以通过expire_logs_days参数调整。随着业务增长,binlog可能会占用大量磁盘空间,需要合理规划。
与redo log不同,binlog是服务器层面的日志,适用于所有存储引擎;而redo log是InnoDB特有的。另外,binlog记录的是逻辑变化(如插入一行数据),而redo log记录的是物理变化(如对哪个数据页做了什么修改)。