binlog是一种数据库Server层(和什么引擎无关),以二进制形式存储在磁盘中的逻辑日志。bin log记录了数据库所有DDL和DML操作(不包含SELECT 和 SHOW等命令,因为这类操作对数据本身并没有修改)。
binlog写入磁盘,其实分为两个步骤:1、先write到page cache 2、再fsync持久化到磁盘;真正占用IO的还是fsync,所以由参数sync_binlog控制写入时机:
- sync_binlog=0 表示每次提交事务都只write,不fsync;
- sync_binlog=1 表示每次提交事务都会执行fsync;
- sync_binlog=N(N>1) sync_binlog=N(N>1)的时候,表示每次提交事务都write,但累积N个事务后才fsync。
常见的是将参数值定义为10-100中的值,也会有丢失近N个事务的binlog
默认情况下,二进制日志功能是关闭的。可以通过以下命令查看二进制日志是否开启:
mysql> SHOW VARIABLES LIKE 'log_bin';+---------------+-------+| Variable_name | Value |+---------------+-------+| log_bin | OFF |+---------------+-------+
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进行重播,实现主从同步;
用于数据库的基于时间点的还原;
