2

在 MySQL 的官方文档中,对这些变量的描述存在很多混淆。

根据它,max_binlog_cache_size意味着,

如果一个事务需要超过这么多字节的内存,服务器会生成一个多语句事务需要超过 'max_binlog_cache_size' 字节的存储错误。

max_binlog_cache_size 仅设置事务缓存的大小

binlog_cache_size的意思是,

在事务期间保存二进制日志更改的缓存大小。

binlog_cache_size 仅设置事务缓存的大小

在阅读文档时,我观察到这两者之间没有区别。文档中还有一些非常令人困惑的东西,例如,

在 MySQL 5.7 中,max_binlog_cache_size 对会话的可见性与 binlog_cache_size 系统变量的可见性相匹配;换句话说,更改其值只会影响更改值后启动的新会话。

当我查询服务器变量时,它同时显示。我有一个MySQL 5.6和一个MySQL 5.7。我只需要知道,我应该为哪个服务器考虑和配置哪个变量。

MySQL 5.6binlog_cache_sizeMySQL 5.7max_binlog_cache_size ??

还有与这些相关的额外的混淆变量max_binlog_stmt_cache_sizebinlog_stmt_cache_size

4

1 回答 1

9

这两个变量都可以在两个版本中配置,它们有不同的含义。手册和帮助中的定义令人困惑;这是一个更好的解释: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% 精确的,初始分配的大小有一些隐藏的细微之处。出于实际目的,这无关紧要,但是当您玩低值时可能会感到困惑。

于 2016-11-16T19:03:08.917 回答