• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

MySQL视图查询报错:Prepared statement needs to be re-prepared

MySQL FAQ 彭东稳 6年前 (2018-01-23) 26974次浏览 已收录 0个评论

今天公司的项目视图查询报错,报错如:ERROR 1615 (HY000): Prepared statement needs to be re-prepared

网上找了一圈,都说调整以下值就好了:

其实真正只调整table_definition_cache问题就解决了。这两个参数是MySQL中与表对象缓存相关的参数。

table_open_cache

System Variable Name table_open_cache
Scope Global
Dynamic Yes
Permitted Values Type integer
Default 2000
Minimum 1
Maximum 524288

打开表的缓存数量。也不是定义内存大小的,而是定义可以缓存多少打开的表的文件句柄信息。如果定义的太小,那么MySQL在需要打开新表的时候就要不断的关闭已经打开的表和打开此次需要打开的表。性能会受到影响。

table_definition_cache

System Variable Name table_definition_cache
Scope Global
Dynamic Yes
Permitted Values Type integer
Default -1 (autosized)
Minimum 400
Maximum 524288

表定义信息缓存是从MySQL 5.1.3版本才开始引入的一个新的缓存区,用来存放表定义信息。当我们的MySQL中使用了较多的表的时候,此缓存无疑会提高对表定义信息的访问效率。MySQL提供了table_definition_cache参数给我们设置可以缓存的表的数量。在MySQL 5.1.25之前的版本中,默认值为128,从MySQL 5.1.25版本开始,则将默认值调整为256了,最大设置值为524288。注意,这里设置的是可以缓存的表定义信息的数目,而不是内存空间的大小。

然后就是这个两个参数跟视图访问报错有什么关系呢?有点懵逼了,就问了一个朋友@八怪,看了一下这个报错的错误码。

{ “ER_NEED_REPREPARE”, 1615, “Prepared statement needs to be re-prepared” }

分析后他应该是在函数check_and_update_table_version中抛出来的。

看来他们确实有联系,但是怎么联系的说不上来,这个观察者搞毛线的我也不知道。以后再说。断点设置

table_open_cache与table_definition_cache对MySQL(内存)的影响


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!