MYSQL视图查询table_open_cache和table_definition_cache设置不合理导致报错:Prepared statement needs to be re-prepared

文章讲述了项目中使用TDSQL时,接口查询视图报错PreparedStatementneedtobere-prepared。经分析,问题可能源于table_definition_cache参数过小,通过调整参数设置为16384解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

项目使用TDSQL为系统的业务库,上线之后测试发现有一个接口查询视图数据时一直报错,报错内容:Prepared statement needs to be re-prepared 报表需要重新准备,检查发现查询的视图已创建,且sql语句放到navicat也是可以正常查询的,代码在测试环境可以正常运行并没有报错。通过分析,怀疑是数据库的问题。


问题描述

一个查询视图表的接口一直报错:
在这里插入图片描述
单独拿sql语句在数据库可以正常执行,并查到结果。

原因分析:

经过查阅帖子,有博主提到可能是数据库table_definition_cache 参数色设置问题导致。于是查询了当前数据库的一些参数:
#查询表高速缓存大小和高速缓存实例大小
SHOW VARIABLES LIKE ‘%table_open_cache%’;
在这里插入图片描述

#查询表定义文件默认缓存大小
SHOW VARIABLES LIKE ‘%table_definition_cache%’;
在这里插入图片描述
这里首先需要了解一下这两个参数的含义:
mysql官方问的文档:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_table_definition_cache

1.table_open_cache参数
在这里插入图片描述
table_open_cache是个全局参数,叫:查询表高速缓存大小,默认是2000,最小值1最大值524288,这是mysql服务器当前所有线程打开的表的数据量,增加这个值会增加mysql需要的文件描述符的数量。可以通过检查Opened_tables状态变量来检查是否需要增加表缓存。FLUSH TABLES命令会强迫所有的表去关闭然后重新打开。

2.table_definition_cache参数
在这里插入图片描述
table_definition_cache是全局参数,叫:查询表定义文件默认缓存大小。默认值为-1,最小是为400,描述的是.frm文件在定义换成里面存储的总量,如果你创建一个比较大的值,会加快你打开表的速度。这个表定义缓存会占据一些空间,它不同于常规的表缓存,它不会用文件描述符。

它的值最小400,一般依据下面的简单计算公式来估算:

table_definition_cache = (table_open_cache / 2) + 400

3.table_open_cache_instances参数
在这里插入图片描述
table_open_cache_instances高速缓存实例大小也是全局参数,默认16,最小1,最大64,打开的表缓存实例的数量。
通过分析,发现TDSQL 库的table_definition_cache 参数设置为400,该值过小,导致查询无法命中。测算一下:
table_definition_cache = (table_open_cache / 2) + 400 = (20480/2)+400 = 10640
所以需要设置:table_definition_cache >=10640

解决方案:

设置:table_definition_cache >=10640,我这里设置为:16384,命名如下:

mysql> set global table_definition_cache=16384;

设置完后,完美解决问题。以上仅供参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值