mysqlヒント[Warning]Invalid(old?)テーブルor database name問題の解決方法


DROP TABLE IF EXISTS[TEMP_]TABLE_NAME;create temporary table[TEMP_]TABLE_NAME]select col 1,col 2,…from[TABLE_]NAME;alter table[TEMP_]TABLE_NAME]add unique idx_col 1(col 1)以上の操作を経て、このwarning問題が何度も発生しました。検索と追跡を通じてソースコードを調整して、以下の手がかりと処理方法があります。mysqlの「[Warning]Invalid(old?)」テーブルor database name「問題発生位置:sql_table.cc:279 uint explin_filename(THD*thd,const char*from,char*to,uint to_レングスexplin_filename_mode explinmode)トレースコードが発見されました。innodb.c:1946のinnobase_convert_.identiferでexplinを呼び出します。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 */
は手がかりに沿って上に探して、2つの位置でinnobaseを呼び出したことを発見しました。convert_.identifer関数は、2つのスレッドに分けて検索を続けます。手掛かり1:ha_innodb.c:2034呼び出しinnodb_convert_.identifer関数
 
/*****************************************************************//**
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のテーブル名またはインデックス名をutf 8に変換し、文字セットに関連する関数定義および関数機能から見ている。既存のデータベースの文字セットと生成された一時テーブルの文字セットは共にlati 1であり、推論が可能な理由の一つである。処理方法:データベースの文字セットを変更するとutf 8になります。データベースがまだこのエラーが発生しているかどうかを確認します。手掛かり2:
 
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_テーブルdef関数では、row_を呼び出します。クリアードテーブルfor_mysql関数後、戻り値はDB_DUPLICATE_KEYの場合は、innodb_を呼び出します。convert_.identiferは、この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 */
はこの関数でより深いレベルの関数を呼び出したが、デバッグコードからこの問題を引き起こす点はまだ発見されていない。処理方式:スレッド一の処理方式で問題が解決できない場合は、さらにコード解析を行う。まとめ:以上のコードの調整と分析を経て、二つの手がかりが得られましたが、この問題はずっと再現できませんでした。したがって、現在は既存のサーバに対してスレッド1の処理しかできません。スレッドに沿って処理しても、この問題が残っている場合は、第二のステップについて深く分析します。作者king_ワンコイン