作者:杨涛涛
资深数据库专家,专研 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 yttReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedlocalhost:ytt>select count(r1) from t group by r1;+-----------+| count(r1) |+-----------+| 1 |+-----------+1 row in set (0.03 sec)