作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
以往 MySQL 想要限度单个连贯的内存,只能小心翼翼的设置各种 SESSION 变量,避免执行某些 SQL 导致单个连贯的内存溢出!能不能间接在 MySQL 服务端蕴含这样一个性能,简化数据库的运维呢?
MySQL 最新版本 8.0.28 在前几天公布,其中有一项新性能就是在数据库侧来限度单个连贯内存,着实有点小兴奋。
MySQL 8.0.28 与此性能无关的几个新参数如下:
- connection_memory_limit:外围参数!用来限度单用户连贯的内存上限值,默认为 BIGINT UNSIGNED 的最大值:18446744073709551615 字节,最小为 2MB。
- global_connection_memory_tracking:设置是否开启对连贯内存性能的追踪,并且把连贯内存数据存入状态变量 Global_connection_memory。为了性能思考,默认敞开。
- connection_memory_chunk_size: 在参数 global_connection_memory_tracking 开启的场景下,设置状态变量 Global_connection_memory 的更新频率。
接下来咱们体验下这个新个性。
管理员端设置内存限度参数下限:为了尽快看到成果,设置为最小值。
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)