在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。我需要知道的是,我应该考虑哪个变量,并为哪个服务器进行配置。
binlog_cache_size MySQL 5.6和MySQL 5.7?
还有其他与这些相关的令人困惑的变量max_binlog_stmt_cache_size和binlog_stmt_cache_size,。
发布于 2016-11-16 19:03:08
这两个变量都可以在两个版本中配置,它们有不同的含义。手册和帮助中的定义很混乱;下面是一个更好的解释: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%精确的,有一些隐藏的微妙与最初分配的大小。它应该不重要的实际目的,但可能是混乱时,你玩低的价值观。
https://stackoverflow.com/questions/37813819
复制相似问题