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

來源:互聯網
上載者:User

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);
經過以上操作中,多次出現該warning問題。通過查詢和跟蹤調試源碼,有以下線索和處理方式:
mysql的"[Warning] Invalid (old?) table or database name"問題出現位置:

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

跟蹤代碼發現,只有在ha_innodb.cc:1946的innobase_convert_identifier 中調用explain_filename函數。 複製代碼 代碼如下:/*****************************************************************//**
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 */

順著線索向上尋找,發現在有兩個位置調用了innobase_convert_identifier 函數,分兩個線索繼續尋找。

線索一:
ha_innodb.cc:2034
調用innodb_convert_identifier函數 複製代碼 代碼如下:/*****************************************************************//**
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 */

從函數定義和函數功能來看,該函數是將mysql的表名或者索引名轉換成utf8,與字元集相關。查看現有資料庫字元集和產生的暫存資料表字元集均為lanti1,推斷是可能的原因之一。
處理方式:
修改資料庫的字元集為utf8,觀察資料庫是否仍然出現該錯誤。

線索二: 複製代碼 代碼如下:ha_innodb.cc:6269
調用innodb_convert_identifier函數
/*****************************************************************//**
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 函數中,調用row_create_table_for_mysql函數後,當傳回值為DB_DUPLICATE_KEY時,調用innodb_convert_identifier,從而觸發該warning。 複製代碼 代碼如下: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 */

該函數中調用了更深層次的函數,但從調試代碼來看,暫時沒有發現導致該問題的點。
處理方式:
線上索一中的處理方式不能解決問題的情況下,再進行進一步的程式碼分析。
總結:
經過以上代碼調試和分析,得出兩條線索,但是一直未能重現該問題。因此,目前只能對現有伺服器進行線索一的處理。如果按照線索一處理方式處理後,仍然出現該問題,將對第二步進行深入的分析。

作者 king_wangheng

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.