Mysql Prepared statement needs to be re-prepared

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

这个是我自己的笔记没有阅读性。也没仔细看。但是记录下断点以后好研究。

朋友遇到这个错修改了参数
| table_definition_cache | 1400 |
| table_open_cache | 2000 |
均设置为16384就好了。

但是他搞不明白有什么关系。我就看了一下这个报错的错误码
{ "ER_NEED_REPREPARE", 1615, "Prepared statement needs to be re-prepared" },
分析后他应该是在函数check_and_update_table_version中抛出来的。
其注释有

  Compare metadata versions of an element obtained from the table
  definition cache and its corresponding node in the parse tree.

其逻辑有

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 the
        previous execution of the prepared statement, and it is
        unacceptable 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;
}

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

1       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
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
Could not execute query ---> MySql.Data.MySqlClient.MySqlException: You have an error in your SQL sy
Could not execute query ---> MySql.Data.MySqlClient.MySqlException: You have an error in your SQL sy
17 0
|
8月前
|
容器
prepareEnvironment
prepareEnvironment
37 0
|
9月前
|
Java 关系型数据库 MySQL
java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@27ce24aa is still active
java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@27ce24aa is still active
260 0
|
SQL Java 关系型数据库
开发指南—Prepared语句
本文介绍了Prepare协议的概念、用途及在Java中的开启方法。
|
网络协议 MySQL 关系型数据库
|
关系型数据库 PostgreSQL 数据库连接
|
关系型数据库 C语言 机器学习/深度学习