首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL - max_binlog_cache_size对binlog_cache_size

MySQL - max_binlog_cache_size对binlog_cache_size
EN

Stack Overflow用户
提问于 2016-06-14 13:42:39
回答 1查看 9K关注 0票数 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。我需要知道的是,我应该考虑哪个变量,并为哪个服务器进行配置。

binlog_cache_size MySQL 5.6MySQL 5.7

还有其他与这些相关的令人困惑的变量max_binlog_stmt_cache_sizebinlog_stmt_cache_size,。

EN

回答 1

Stack Overflow用户

发布于 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定义事务的最大总大小。如果事务大于此值,则会失败。

下面是区别的简单说明。

设置:

代码语言:javascript
复制
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

(事务成功,使用缓存,不使用磁盘)

代码语言:javascript
复制
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

(事务使用缓存,缓存使用磁盘)

代码语言:javascript
复制
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

(事务失败)

代码语言:javascript
复制
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%精确的,有一些隐藏的微妙与最初分配的大小。它应该不重要的实际目的,但可能是混乱时,你玩低的价值观。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37813819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档