【MySQL】binlog是什么呢,为什么有时出现占用空间飙升呢

MySQL中的日志有很多,分别是:二进制日志(binlog)、重做日志(redo log)、回滚日志(undo log)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)
今天我们主要看看其中的binlog

介绍

在MySQL中,binlog(二进制日志)是一种记录数据库操作的日志文件。它记录了数据库更改的所有操作。具体来说,binlog记录了对MySQL数据库执行的所有DDL(数据定义语言)和DML(数据操作语言,但不包括SELECT和SHOW等查询语句)操作,以及这些操作执行的具体时间。

三种格式

1、STATEMENT

基于语句的复制,记录的是SQL语句。每个SQL语句都会被记录下来,并在从服务器上执行相同的SQL语句来进行复制。
它的优点是不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高了性能。然而,在某些情况下,Statement格式可能会导致主从数据不一致的问题。

2、ROW

基于行的复制,记录了每一行数据的变更情况。这种格式可以确保复制结果与主服务器完全一致,因为从服务器上执行的是相同的行级操作,解决了STATEMENT级别可能出现的数据不一致问题,但可能会产生大量的日志数据,它会占用更多的存储空间,并且在某些情况下可能会导致性能下降。

3、MIXED

混合模式,MySQL会根据操作的类型自动选择STATEMENT或ROW格式。对于某些SQL语句,使用STATEMENT格式进行记录,对于某些SQL语句,使用ROW格式进行记录。这种混合使用的方式既可以节省存储空间,又可以保证复制的一致性。

binlog文件是追加写入的,当文件达到一定大小时,MySQL会自动切换到新的binlog文件,从而形成一个binlog文件序列。通过设置expire_logs_days参数,可以控制binlog文件的保留天数。

查看binlog格式命令

show variables like '%binlog_format%';

修改binlog格式命令

# 针对当前会话有效
set binlog_format='MIXED';
# 全局,但重启会失效
set global binlog_format='MIXED';
# 若要永久有效可修改配置文件中的binlog_format参数

作用

1、数据恢复和备份

Binlog可以用于恢复和备份数据库。通过使用binlog,可以将数据库恢复到特定的时间点或特定的事务状态。它可以用于故障恢复、数据修复和数据同步等操作。

2、数据库复制

binlog在MySQL的主从复制中起着重要的作用。主服务器将binlog记录发送到从服务器,从服务器通过重放这些记录来保持与主服务器的数据一致性。这种复制机制可以用于实现读写分离、负载均衡和数据备份等功能。

3、数据库迁移

通过将源数据库的binlog导入到目标数据库中,可以将数据从一个数据库迁移到另一个数据库。这对于数据中心迁移、数据库版本升级和数据合并等场景非常有用。

4、审计和安全性

binlog可以用于审计数据库操作和确保数据的安全性。通过检查binlog,可以跟踪特定用户或应用程序对数据库的操作,以及检测和防止恶意行为。

总之,binlog在MySQL中具有重要的作用,它可以用于数据恢复、备份、复制、迁移以及审计和安全性等方面。

可能遇到的问题

在项目中,有时可能遇到binlog文件飙升导致MySQL的磁盘空间突然上升,此时就需要查看下是什么样的语句在重复执行,可能是哪里使用不当,不断地执行DDL(数据定义语言)和DML(数据操作语言)导致的,一般是DML可能性大些,需要找到具体日志,然后找到对应的语句进而排查问题。
比如我们这几天就遇到一个这样的问题,最后排查到时有个地方不断的执行一个update语句导致binlog一直不断的增加,然后我们就找到这个语句的根源,把它停掉,binlog就不再上升了,磁盘空间也就慢慢会降下来了。

你可能感兴趣的:(MySQL,mysql,数据库)