前言
今天在折腾回typecho
的Handsome
主题时发现了Database Query Error
错误。事情经过是我在迁移回Handsome
时,重新打开插件但遇到数据库出错了,因为这个报错并不详细,我第一反应觉得是我的主题用了emjoy
,以为数据库字符集是utf8
编码,去检查了字符集后正常utf8mb4
,PHP版本也正常,事情一度陷入了尴尬的境界....
解决思路
因为这个报错并不明显,所以我们需要更为详细的debug
报错,首先先备份一份当前的数据库文件,以防万一.
我使用的是Navicat
这款软件,右击转储 -> 结构和数据
接下来打开typecho
的根目录,双击打开config.inc.php
文件
在define('__TYPECHO_ADMIN_DIR__', '/admin/');
的后面添加下面这段代码
define('__TYPECHO_DEBUG__', true);
再次重复刚才的报错操作,这次就会详细列出报错信息,以下是我的报错信息:
SQLSTATE[HY000]: General error: 3161 Storage engine MyISAM is disabled (Table creation is disallowed).
Typecho\Db\Adapter\SQLException: SQLSTATE[HY000]: General error: 3161 Storage engine MyISAM is disabled (Table creation is disallowed). in /www/wwwroot/7yog/var/Typecho/Db/Adapter/Pdo.php:111
Stack trace:
#0 /www/wwwroot/7yog/var/Typecho/Db.php(391): Typecho\Db\Adapter\Pdo->query()
#1 /www/wwwroot/7yog/usr/plugins/Handsome/cache/driver/sql/mysql.class.php(26): Typecho\Db->query()
#2 /www/wwwroot/7yog/usr/plugins/Handsome/cache/driver/sql/sql.inteface.php(21): HandsomeSQL->install()
#3 /www/wwwroot/7yog/usr/plugins/Handsome/cache/driver/dao/sql.base.php(25): SqlInterface->__construct()
#4 /www/wwwroot/7yog/usr/plugins/Handsome/cache/driver/dao/tag.php(9): SqlBase->__construct()
#5 /www/wwwroot/7yog/usr/plugins/Handsome/cache/driver/controller/tag_util.php(14): HandsomeTag->__construct()
#6 /www/wwwroot/7yog/usr/plugins/Handsome/Plugin.php(82): TagUtil->__construct()
#7 [internal function]: Handsome_Plugin::activate()
#8 /www/wwwroot/7yog/var/Widget/Plugins/Edit.php(65): call_user_func()
#9 /www/wwwroot/7yog/var/Widget/Plugins/Edit.php(313): Widget\Plugins\Edit->activate()
#10 /www/wwwroot/7yog/var/Widget/Action.php(71): Widget\Plugins\Edit->action()
#11 /www/wwwroot/7yog/var/Typecho/Widget.php(155): Widget\Action->execute()
#12 /www/wwwroot/7yog/var/Typecho/Router.php(96): Typecho\Widget::widget()
#13 /www/wwwroot/7yog/index.php(26): Typecho\Router::dispatch()
#14 {main}
等等,这份报错日志中提到了一个关键字MyISAM
,这是一种数据库引擎,而在阿里云RDS for MySQL
当中,这玩意是不被支持的.看到这,事情彷佛明朗了起来
因为我的数据库并不是自建,使用的正是阿里云RDS for MySQL
看下面的报错路径,都指向了主题插件的路径,所以,我们只需要修改插件中,sql文件的引擎为InnoDB
即可
打开/usr/plugins/Handsome/cache/driver/sql/file/mysql
目录,修改这三个文件
将:
) ENGINE=MyISAM DEFAULT CHARSET =%charset%;
修改为:
) ENGINE=InnoDB DEFAULT CHARSET =%charset%;
也就是更换MyISAM
引擎为InnoDB
即可.
刷新报错页面,就...又会发现报了别的错误
正当我绝望之际,喝杯水之后又刷新了两三次,居然又ok了
事后发现这玩意有三个表,你得多刷新几次报错页面才会创建表成功....
于是...就这么结束了...