共计 3320 个字符,预计需要花费 9 分钟才能阅读完成。
如何理解 ERROR 中的 Unknown storage engine MyISAM,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
一、错误演示
如下:
root@localhost:test:09:49:03 create table ttt(id int) engine=myisam ;
ERROR 1286 (42000): Unknown storage engine MyISAM
二、相关参数
enforce_storage_engine:建表进行引擎检查,是否满足设置的引擎值。
sql_mode(NO_ENGINE_SUBSTITUTION):根据前面的检查值进行综合判断,如果设置了 NO_ENGINE_SUBSTITUTION 则进行报错,如果没有设置则进行,且将新建表的引擎转为 enforce_storage_engine 设置的引擎。
我们环境中设置 enforce_storage_engine 为 Innodb,sql_mode 中设置了 NO_ENGINE_SUBSTITUTION。
三、相关函数
check_engine
– ha_enforce_handlerton
部分逻辑如下:
根据 ha_enforce_handlerton 函数进行引擎检查,主要检查 enforce_storage_engine 参数设置的值是否为已知的引擎。否则报错 Unknown storage engine,返回值为 enforce_storage_engine 指定的引擎(比如 Innodb)。
根据上面的返回值进行判断
如果建表指定的引擎(比如这里的 MyISAM)和 enforce_storage_engine 设置的引擎(比如这里的 Innodb)不同,同时 sql_mode 设置了 NO_ENGINE_SUBSTITUTION。则报错 ERROR 1286 (42000): Unknown storage engine‘MyISAM’,这也是当前的报错。
如果没有设置 sql_mode NO_ENGINE_SUBSTITUTION,那么使用 enforce_storage_engine 指定的值代替建表语句的指定的引擎值(比如用 Innodb 代替 MyISAM),同时报出警告,ER_WARN_USING_OTHER_HANDLER,输出为新的引擎值。
四、修改
注销掉 enforce_storage_engine 参数即可。
五、栈
#0 check_engine (thd=0x7fffe400a8a0, db_name=0x7fffe40108f0 test , table_name=0x7fffe4010328 ttt , create_info=0x7fffe8ecd890, alter_info=0x7fffe8ecd300)
at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_table.cc:11318
#1 0x000000000155d81e in create_table_impl (thd=0x7fffe400a8a0, db=0x7fffe40108f0 test , table_name=0x7fffe4010328 ttt , error_table_name=0x7fffe4010328 ttt ,
path=0x7fffe8eccf60 ./test/ttt , create_info=0x7fffe8ecd890, alter_info=0x7fffe8ecd300, internal_tmp_table=false, select_field_count=0, no_ha_table=false, is_trans=0x7fffe8ecd1ee,
key_info=0x7fffe8ecd170, key_count=0x7fffe8ecd16c) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_table.cc:5138
#2 0x000000000155f352 in mysql_create_table_no_lock (thd=0x7fffe400a8a0, db=0x7fffe40108f0 test , table_name=0x7fffe4010328 ttt , create_info=0x7fffe8ecd890, alter_info=0x7fffe8ecd300,
select_field_count=0, is_trans=0x7fffe8ecd1ee) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_table.cc:5753
#3 0x000000000155f47a in mysql_create_table (thd=0x7fffe400a8a0, create_table=0x7fffe4010368, create_info=0x7fffe8ecd890, alter_info=0x7fffe8ecd300)
at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_table.cc:5801
#4 0x00000000014cc36d in mysql_execute_command (thd=0x7fffe400a8a0, first_level=true) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_parse.cc:3510
#5 0x00000000014d2e1b in mysql_parse (thd=0x7fffe400a8a0, parser_state=0x7fffe8ece4a0, update_userstat=false) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_parse.cc:5927
#6 0x00000000014c7a55 in dispatch_command (thd=0x7fffe400a8a0, com_data=0x7fffe8ecec90, command=COM_QUERY) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_parse.cc:1539
#7 0x00000000014c688a in do_command (thd=0x7fffe400a8a0) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/sql_parse.cc:1060
#8 0x00000000015fab28 in handle_connection (arg=0x3c4f150) at /cdh/mysqldebug/percona-server-5.7.29-32/sql/conn_handler/connection_handler_per_thread.cc:325
#9 0x00000000018cad34 in pfs_spawn_thread (arg=0x3c568b0) at /cdh/mysqldebug/percona-server-5.7.29-32/storage/perfschema/pfs.cc:2198
#10 0x00007ffff7bc6e65 in start_thread () from /lib64/libpthread.so.0
#11 0x00007ffff5fa088d in clone () from /lib64/libc.so.6
看完上述内容,你们掌握如何理解 ERROR 中的 Unknown storage engine MyISAM 的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!