MySQL视图查询报错:Prepared statement needs to be re-prepared
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 timetable_open_cache與table_definition_cache對MySQL(內存)的影響
總結
以上是生活随笔為你收集整理的MySQL视图查询报错:Prepared statement needs to be re-prepared的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战使用Axure设计App,使用Web
- 下一篇: 数据库调优要点纪要