作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
以往 MySQL 想要限制单个连接的内存,只能小心翼翼的设置各种 SESSION 变量,防止执行某些 SQL 导致单个连接内存溢出!能不能直接在 MySQL 服务端包含这样一个功能,简化数据库的运维呢?
MySQL 最新版本 8.0.28 在前几天发布,其中有一项新功能就是在数据库侧来限制单个连接的内存,着实有点小兴奋。
管理员端设置内存限制参数上限:为了尽快看到效果,设置为最小值。
localhost:(none)>set global connection_memory_limit=2097152;
Query OK, 0 rows affected (0.00 sec)
创建一个新用户 tt1 ,并赋予基于库 ytt 的只读权限。
localhost:(none)>create user tt1 identified by 'tt';
Query OK, 0 rows affected (0.03 sec)
localhost:(none)>grant select on ytt.* to tt1;
Query OK, 0 rows affected (0.02 sec)
创建一张表,插入一行记录:这里使用 longtext 数据类型能让查询结果更快内存溢出。
localhost:ytt>create table t(id int primary key, r1 longtext);
Query OK, 0 rows affected (2.39 sec)
localhost:ytt>insert t values (1,lpad('mysql',6000000,'database'));
Query OK, 1 row affected (0.63 sec)
用户 tt1 登录验证:对字段 r1 进行简单 GROUP BY 检索 ,报连接内存超出设定限制错误,连接关闭。
debian-ytt1:ytt>select count(r1) from t group by r1;
ERROR 4082 (HY000): Connection closed. Connection memory limit 2097152 bytes exceeded. Consumed 7094928 bytes.
不过这个新功能对管理员和内置用户不生效。用 ROOT 用户重新登录 MySQL 执行刚才那条 SQL :
root@debian-ytt1:~# mysql -S /tmp/mysqld_3306.sock
...
localhost:(none)>use ytt
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
localhost:ytt>select count(r1) from t group by r1;
+-----------+
| count(r1) |
+-----------+
| 1 |
+-----------+
1 row in set (0.03 sec)
本文关键字:#MySQL# #连接内存限制#
关于SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
如何获取
类型 | 地址 |
---|---|
版本库 | https://github.com/actiontech/sqle |
文档 | https://actiontech.github.io/sqle-docs-cn/ |
发布信息 | https://github.com/actiontech/sqle/releases |
数据审核插件开发文档 | https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html |