binlog是一种数据库Server层(和什么引擎无关),以二进制形式存储在磁盘中的逻辑日志。bin log记录了数据库所有DDL和DML操作(不包含SELECT 和 SHOW等命令,因为这类操作对数据本身并没有修改)。
    binlog写入磁盘,其实分为两个步骤:1、先write到page cache 2、再fsync持久化到磁盘;真正占用IO的还是fsync,所以由参数sync_binlog控制写入时机:

    1. sync_binlog=0 表示每次提交事务都只write,不fsync;
    2. sync_binlog=1 表示每次提交事务都会执行fsync;
    3. sync_binlog=N(N>1) sync_binlog=N(N>1)的时候,表示每次提交事务都write,但累积N个事务后才fsync。

    常见的是将参数值定义为10-100中的值,也会有丢失近N个事务的binlog

    默认情况下,二进制日志功能是关闭的。可以通过以下命令查看二进制日志是否开启:

    1. mysql> SHOW VARIABLES LIKE 'log_bin';
    2. +---------------+-------+
    3. | Variable_name | Value |
    4. +---------------+-------+
    5. | log_bin | OFF |
    6. +---------------+-------+

    bin log也被叫做归档日志,因为它不会像redo log那样循环写擦除之前的记录,而是会一直记录日志。一个bin log日志文件默认最大容量1G(也可以通过max_binlog_size参数修改),单个日志超过最大值,则会新创建一个文件继续写。

    mysql> show binary logs;
    +-----------------+-----------+
    | Log_name        | File_size |
    +-----------------+-----------+
    | mysq-bin.000001 |      8687 |
    | mysq-bin.000002 |      1445 |
    | mysq-bin.000003 |      3966 |
    | mysq-bin.000004 |       177 |
    | mysq-bin.000005 |      6405 |
    | mysq-bin.000006 |       177 |
    | mysq-bin.000007 |       154 |
    | mysq-bin.000008 |       154 |
    

    一般来说开启bin log都会给日志文件设置过期时间(expire_logs_days参数,默认永久保存),要不然日志的体量会非常庞大。

    mysql> show variables like 'expire_logs_days';
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | expire_logs_days | 0     |
    +------------------+-------+
    1 row in set
    
    mysql> SET GLOBAL expire_logs_days=30;
    Query OK, 0 rows affected
    

    作用:
    用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步;
    用于数据库的基于时间点的还原;