国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

mysql提示[Warning] Invalid (old?) table or database name問題的解決方法

2020-01-18 23:58:47
字體:
供稿:網(wǎng)友
DROP TABLE IF EXISTS [TEMP_TABLE_NAME];
create temporary table [TEMP_TABLE_NAME] select col1,col2,... from [TABLE_NAME];
alter table [TEMP_TABLE_NAME] add unique idx_col1(col1);
經(jīng)過以上操作中,多次出現(xiàn)該warning問題。通過查詢和跟蹤調(diào)試源碼,有以下線索和處理方式:
mysql的"[Warning] Invalid (old?) table or database name"問題出現(xiàn)位置:

sql_table.cc:279
uint explain_filename (THD* thd, const char *from, char *to , uint to_length , enum_explain_filename_mode explain_mode )

跟蹤代碼發(fā)現(xiàn),只有在ha_innodb.cc:1946的innobase_convert_identifier 中調(diào)用explain_filename函數(shù)。
復(fù)制代碼 代碼如下:

/*****************************************************************//**
Convert an SQL identifier to the MySQL system_charset_info (UTF-8)
and quote it if needed.
@return pointer to the end of buf */
static char* innobase_convert_identifier (
/*========================*/
char* buf, /*!< out: buffer for converted identifier */
ulint buflen, /*!< in: length of buf, in bytes */
const char * id, /*!< in: identifier to convert */
ulint idlen, /*!< in: length of id, in bytes */
void* thd, /*!< in: MySQL connection thread, or NULL */
ibool file_id) /*!< in: TRUE=id is a table or database name;
FALSE=id is an UTF-8 string */

順著線索向上查找,發(fā)現(xiàn)在有兩個(gè)位置調(diào)用了innobase_convert_identifier 函數(shù),分兩個(gè)線索繼續(xù)查找。

線索一:
ha_innodb.cc:2034
調(diào)用innodb_convert_identifier函數(shù)
復(fù)制代碼 代碼如下:

/*****************************************************************//**
Convert a table or index name to the MySQL system_charset_info (UTF-8)
and quote it if needed.
@return pointer to the end of buf */
extern "C" UNIV_INTERN char* innobase_convert_name (
/*==================*/
char* buf, /*!< out: buffer for converted identifier */
ulint buflen, /*!< in: length of buf, in bytes */
const char * id, /*!< in: identifier to convert */
ulint idlen, /*!< in: length of id, in bytes */
void* thd, /*!< in: MySQL connection thread, or NULL */
ibool table_id) /*!< in: TRUE=id is a table or database name;
FALSE=id is an index name */

從函數(shù)定義和函數(shù)功能來看,該函數(shù)是將mysql的表名或者索引名轉(zhuǎn)換成utf8,與字符集相關(guān)。查看現(xiàn)有數(shù)據(jù)庫字符集和生成的臨時(shí)表字符集均為lanti1,推斷是可能的原因之一。
處理方式:
修改數(shù)據(jù)庫的字符集為utf8,觀察數(shù)據(jù)庫是否仍然出現(xiàn)該錯(cuò)誤。

線索二:
復(fù)制代碼 代碼如下:

ha_innodb.cc:6269
調(diào)用innodb_convert_identifier函數(shù)
/*****************************************************************//**
Creates a table definition to an InnoDB database. */
static create_table_def (
/*=============*/
trx_t* trx, /*!< in: InnoDB transaction handle */
TABLE* form, /*!< in: information on table
columns and indexes */
const char * table_name, /*!< in: table name */
const char * path_of_temp_table, /*!< in: if this is a table explicitly
created by the user with the
TEMPORARY keyword, then this
parameter is the dir path where the
table should be placed if we create
an .ibd file for it (no .ibd extension
in the path, though); otherwise this
is NULL */
ulint flags) /*!< in: table flags */

在create_table_def 函數(shù)中,調(diào)用row_create_table_for_mysql函數(shù)后,當(dāng)返回值為DB_DUPLICATE_KEY時(shí),調(diào)用innodb_convert_identifier,從而觸發(fā)該warning。
復(fù)制代碼 代碼如下:

row0mysql.c:1820
UNIV_INTERN int row_create_table_for_mysql(
/*=======================*/
dict_table_t* table, /*!< in, own: table definition
(will be freed) */
trx_t* trx) /*!< in: transaction handle */

該函數(shù)中調(diào)用了更深層次的函數(shù),但從調(diào)試代碼來看,暫時(shí)沒有發(fā)現(xiàn)導(dǎo)致該問題的點(diǎn)。
處理方式:
在線索一中的處理方式不能解決問題的情況下,再進(jìn)行進(jìn)一步的代碼分析。
總結(jié):
經(jīng)過以上代碼調(diào)試和分析,得出兩條線索,但是一直未能重現(xiàn)該問題。因此,目前只能對現(xiàn)有服務(wù)器進(jìn)行線索一的處理。如果按照線索一處理方式處理后,仍然出現(xiàn)該問題,將對第二步進(jìn)行深入的分析。

作者 king_wangheng
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安多县| 滨海县| 原阳县| 阿城市| 宿迁市| 通城县| 探索| 呼图壁县| 德昌县| 商洛市| 屏边| 新昌县| 五河县| 巫溪县| 延长县| 县级市| 清镇市| 奉贤区| 监利县| 桦南县| 河北省| 肥城市| 甘谷县| 方正县| 乌拉特后旗| 贵阳市| 桐梓县| 临桂县| 新源县| 易门县| 新丰县| 呼伦贝尔市| 山阴县| 望城县| 普宁市| 栖霞市| 芦山县| 南京市| 霍州市| 五大连池市| 阳新县|