From: https://www.ywnds.com/?p=12609

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

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

mysql> set global table_open_cache=16384;
mysql> set global table_definition_cache=16384;

其实真正只调整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中抛出来的。

static bool
check_and_update_table_version(THD *thd,TABLE_LIST *tables, TABLE_SHARE *table_share)
{ if (! tables->is_table_ref_id_equal(table_share)){Reprepare_observer *reprepare_observer= thd->get_reprepare_observer(); if (reprepare_observer &&reprepare_observer->report_error(thd)) //这里如果前面的指针为NULL则触发这个报错逻辑 { /*Version of the table share is different from theprevious execution of the prepared statement, and it isunacceptable for this SQLCOM. Error has been reported.*/ DBUG_ASSERT(thd->is_error()); return TRUE;} /* Always maintain the latest version and type */ tables->set_table_ref_id(table_share);}DBUG_EXECUTE_IF("reprepare_each_statement", return inject_reprepare(thd);); return FALSE;
}

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

breakpoint     keep y 0x0000000000ebd5f3 in main(int, char**) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/main.cc:25 breakpoint already hit 1 time 4 breakpoint     keep y 0x00000000016a04bd in open_table_from_share(THD*, TABLE_SHARE*, char const*, uint, uint, uint, TABLE*, bool)at /root/mysql5.7.14/percona-server-5.7.14-7/sql/table.cc:3038 breakpoint already hit 4 times 5 breakpoint     keep y 0x0000000001519a10 in check_and_update_table_version(THD*, TABLE_LIST*, TABLE_SHARE*)at /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_base.cc:4219 breakpoint already hit 4 times 6 breakpoint     keep y 0x00000000015285bb in Table_cache::add_used_table(THD*, TABLE*) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/table_cache.h:353 breakpoint already hit 2 times 7 breakpoint     keep y 0x0000000001527427 in TABLE_LIST::set_table_ref_id(enum_table_ref_type, ulonglong)at /root/mysql5.7.14/percona-server-5.7.14-7/sql/table.h:2100 8 breakpoint     keep y 0x00000000015273e3 in TABLE_LIST::set_table_ref_id(TABLE_SHARE*) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/table.h:2095 breakpoint already hit 1 time

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

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

  1. mysql分页查询报错,及解决

    mysql分页查询报错: 前提: 1.每页1000条数据 2.查到57页的时候,就报错了 以下是错误信息: org.springframework.jdbc.UncategorizedSQLExcep ...

  2. centos mysql 1146_MySQL查询报错:ERROR 1146 (42S02): Table 'craw.sitePageConfig' doesn't exist

    今天一同事咨询mysql的问题,在mysql主库访问某个表报错, 但是备库上可以,感觉有点奇怪.即使不同步, 也不能说主库不能访问啊. 既然是主备,就从主备同步开始查.各种show master st ...

  3. MySQL查询视图View报错

    项目场景: 在mysql客户端workbench中查询视图View报错. 问题描述 View references invalid table(s) or column(s) or function( ...

  4. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  5. mysql查询新建查询报错_mysql开启慢查询报错:

    1.进入mysql命令行:#mysql -uroot -p123456,执行下面的命令开启慢查询报错: set global slow_query_log=on; set global long_qu ...

  6. mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column.

    mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column. 出现原因 使用g ...

  7. kettle使用mysql作为资源库报错 创建资源库时只有25张表,原本应该46张表。

    kettle使用mysql作为资源库报错 创建资源库时只有25张表,原本应该46张表. 连用户表都没有 ,导致连 默认的 admin和guest都无法登陆自己的资源库!!!! 问题是 SQL语句里边使 ...

  8. python sqlachemy模糊查询报错

    python通过sqlachemy连接postgre进行模糊查询报错,代码如下: from sqlalchemy import create_engine engine = create_engine ...

  9. mysql insert 空字符报错

    mysql insert 空字符报错 double类型字段插入空字符串时自动转为0 这样写就会报错: Data truncated for column 'x1' at row 1 这种应该是版本问题 ...

最新文章

  1. 流程控制关键字——跳转结构
  2. Pure 天气(Android),Pure天气(hanjie.app.pureweather) - 8.5.5 - 应用 - 酷安
  3. with as递归调用
  4. iphone圆点怎么弄出来_新款iPhone放出终极大招,果粉:就没高级点的嘛
  5. 跳转到保护模式并显示一个LOGO
  6. Spark系列(八)Worker工作原理
  7. 【阿里云课程】图像翻译GAN结构与应用
  8. Java 设计模式之迭代器模式
  9. 字体大小 js 控制
  10. 更高效地刷OJ——String常用方法(一)
  11. suse防火墙mysql远程配置_CentOS 6.8 配置防火墙,开放8080端口
  12. cn.cw.gps.domain.VisitReport.setVisitID([Ljava.lang.String;)]
  13. 关于自我学习停滞的思考
  14. ios上传闪退 php,iOS应用上架后出现闪退原因浅析
  15. CODESYS官方教程“您的第一个CODESYS程序”的一些注解
  16. python开发网站实例-手把手教你写网站:Python WEB开发技术实战
  17. 微信小程序开发之视频video组件报错:渲染层网络层错误
  18. [buuctf][Zer0pts2020]easy strcmp
  19. Excel分列-字母与汉字(前后)
  20. LeetCode 416分割等和子集

热门文章

  1. android 开发不能创建目录
  2. C#中的事件和委托(续)
  3. 它们是什么以及为什么我们不需要它们
  4. leetcode140. 单词拆分 II(回溯+记忆化)
  5. Koa 中实现 chunked 数据传输
  6. 基本数据类型(dict)
  7. apt-get常用命令及工作原理
  8. 2018年5月5日论文阅读
  9. JS-随机生成的密码
  10. [转载]Python量化交易平台开发教程系列0-引言