这两个变量都可以在两个版本中配置,它们有不同的含义。手册和帮助中的定义令人困惑;这是一个更好的解释:http ://dev.mysql.com/doc/refman/5.6/en/binary-log.html
binlog_cache_size 定义缓冲区可以使用的最大内存量。如果事务增长超过这个值,它使用一个临时磁盘文件。请注意,缓冲区是按连接分配的。
max_binlog_cache_size 定义事务的最大总大小。如果事务增长超过这个值,它就会失败。
以下是差异的简单演示。
设置:
MariaDB [test]> select @@binlog_cache_size, @@max_binlog_cache_size, @@binlog_format;
+---------------------+-------------------------+-----------------+
| @@binlog_cache_size | @@max_binlog_cache_size | @@binlog_format |
+---------------------+-------------------------+-----------------+
| 32768 | 65536 | ROW |
+---------------------+-------------------------+-----------------+
1 row in set (0.01 sec)
MariaDB [test]> show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`a` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
1.事务大小低于@@binlog_cache_size
(交易成功,使用缓存,不使用磁盘)
MariaDB [test]> flush status;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> begin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> insert into t1 values (repeat('a',20000));
Query OK, 1 row affected (0.01 sec)
MariaDB [test]> insert into t1 values (repeat('a',10000));
Query OK, 1 row affected (0.04 sec)
MariaDB [test]> commit;
Query OK, 0 rows affected (0.05 sec)
MariaDB [test]> show status like 'Binlog_cache%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 1 |
+-----------------------+-------+
2 rows in set (0.01 sec)
2.事务大小大于@@binlog_cache_size,但小于@@max_binlog_cache_size
(事务使用缓存,缓存使用磁盘)
MariaDB [test]> flush status;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> begin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> insert into t1 values (repeat('a',20000));
Query OK, 1 row affected (0.10 sec)
MariaDB [test]> insert into t1 values (repeat('a',20000));
Query OK, 1 row affected (0.10 sec)
MariaDB [test]> commit;
Query OK, 0 rows affected (0.03 sec)
MariaDB [test]> show status like 'Binlog_cache%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Binlog_cache_disk_use | 1 |
| Binlog_cache_use | 1 |
+-----------------------+-------+
2 rows in set (0.01 sec)
3.事务大小超过@@max_binlog_cache_size
(交易失败)
MariaDB [test]> flush status;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> begin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> insert into t1 values (repeat('a',20000));
Query OK, 1 row affected (0.12 sec)
MariaDB [test]> insert into t1 values (repeat('a',20000));
Query OK, 1 row affected (0.15 sec)
MariaDB [test]> insert into t1 values (repeat('a',20000));
Query OK, 1 row affected (0.12 sec)
MariaDB [test]> insert into t1 values (repeat('a',20000));
ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
所以,如果你的事务很大,但你没有太多的连接,你可能想增加@@binlog_cache_size 以避免过多的磁盘写入。
如果您有许多并发连接,则应小心避免连接尝试同时为缓存分配过多内存。
如果您想确保事务不会变得太大,您可能需要限制@@max_binlog_cache_size。
@@binlog_stmt_cache_size 和 @@max_binlog_stmt_cache_size 应该以类似的方式工作,不同之处在于 %binlog_cache% 值用于事务更新,而 %binlog_stmt_cache% 用于非事务更新。
在试验时,请注意这些值不是 100% 精确的,初始分配的大小有一些隐藏的细微之处。出于实际目的,这无关紧要,但是当您玩低值时可能会感到困惑。