MySQL:max_allowed_packet影响了什么?
1个回答
展开全部
max_allowed_packet 表示 MySQL Server 或者客户端接收的 packet 的最大大小,packet 即数据包,MySQL Server 和客户端上都有这个限制。
每个数据包,都由包头、包体两部分组成,包头由 3 字节的包体长度、1 字节的包编号组成。3 字节最多能够表示 2 ^ 24 = 16777216 字节(16 M),也就是说,一个数据包的包体长度必须小于等于 16M。
如果要发送超过 16M 的数据怎么办?
当要发送大于 16M 的数据时,会把数据拆分成多个 16M 的数据包,除最后一个数据包之外,其它数据包大小都是 16M。而 MySQL Server 收到这样的包后,如果发现包体长度等于 16M,它就知道本次接收的数据由多个数据包组成,会先把当前数据包的内容写入缓冲区,然后接着读取下一个数据包,并把下一个数据包的内容追加到缓冲区,直到读到结束数据包,就接收到客户端发送的完整数据了。
那怎样算一个数据包?
下面我们通过测试来讨论 max_allowed_packet 的实际影响。
如果SQL文件中有单个 SQL 大小超过 max_allowed_packet ,会报错:
row 格式的 binlog,单个SQL修改的数据产生的 binlog 如果超过 max_allowed_packet,也会报错。
在恢复数据到指定时间点的场景,解析后的binlog单个事务大小超过1G,并且这个事务只包含一个SQL,此时一定会触发 max_allowed_packet 的报错。但是恢复数据的任务又很重要,怎么办呢?可以将 binlog 改名成 relay log,用 sql 线程回放来绕过这个限制。
查询结果中,只要单行数据不超过客户端设置的 max_allowed_packet 即可:
load data 文件大小、单行大小都不受 max_allowed_packet 影响:
从库 slave io 线程、slave sql 线程可以处理的最大数据包大小由参数 slave_max_allowed_packet 控制。这是限制 binlog event 大小,而不是单个SQL修改数据的大小。
主库 dump 线程会自动设置 max_allowed_packet为1G,不会依赖全局变量 max_allowed_packet。用来控制主库DUMP线程每次读取event的最大大小。
具体可以参考:
https://mp.weixin.qq.com/s/EfNY_UwEthiu-DEBO7TrsA
另外超过4G的大事务,从库心跳会报错:
https://opensource.actionsky.com/20201218-mysql/
每个数据包,都由包头、包体两部分组成,包头由 3 字节的包体长度、1 字节的包编号组成。3 字节最多能够表示 2 ^ 24 = 16777216 字节(16 M),也就是说,一个数据包的包体长度必须小于等于 16M。
如果要发送超过 16M 的数据怎么办?
当要发送大于 16M 的数据时,会把数据拆分成多个 16M 的数据包,除最后一个数据包之外,其它数据包大小都是 16M。而 MySQL Server 收到这样的包后,如果发现包体长度等于 16M,它就知道本次接收的数据由多个数据包组成,会先把当前数据包的内容写入缓冲区,然后接着读取下一个数据包,并把下一个数据包的内容追加到缓冲区,直到读到结束数据包,就接收到客户端发送的完整数据了。
那怎样算一个数据包?
下面我们通过测试来讨论 max_allowed_packet 的实际影响。
如果SQL文件中有单个 SQL 大小超过 max_allowed_packet ,会报错:
row 格式的 binlog,单个SQL修改的数据产生的 binlog 如果超过 max_allowed_packet,也会报错。
在恢复数据到指定时间点的场景,解析后的binlog单个事务大小超过1G,并且这个事务只包含一个SQL,此时一定会触发 max_allowed_packet 的报错。但是恢复数据的任务又很重要,怎么办呢?可以将 binlog 改名成 relay log,用 sql 线程回放来绕过这个限制。
查询结果中,只要单行数据不超过客户端设置的 max_allowed_packet 即可:
load data 文件大小、单行大小都不受 max_allowed_packet 影响:
从库 slave io 线程、slave sql 线程可以处理的最大数据包大小由参数 slave_max_allowed_packet 控制。这是限制 binlog event 大小,而不是单个SQL修改数据的大小。
主库 dump 线程会自动设置 max_allowed_packet为1G,不会依赖全局变量 max_allowed_packet。用来控制主库DUMP线程每次读取event的最大大小。
具体可以参考:
https://mp.weixin.qq.com/s/EfNY_UwEthiu-DEBO7TrsA
另外超过4G的大事务,从库心跳会报错:
https://opensource.actionsky.com/20201218-mysql/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询