安装typecho后出现数据库错误Database Query Error的解决办法汇总
很多同学在安装或者迁移数据库之后,会出现各种数据库异常,现在汇总一下常见的数据库错误,并附上排查方法,供大家参考。
数据库连接错误
最常见的错误就是出现Error establishing a database connection
错误,如图:
遇到错误,首先第一个需要做的事情,就是打开typecho的调试模式。在index.php最开始加入如下代码:
#file: index.php
define('__TYPECHO_DEBUG__',true);//add by https://www.typechodev.com
然后再次访问,出现如下错误:
exception 'Typecho_Db_Adapter_Exception' in /var/www.typechodev.com/var/Typecho/Db/Adapter/Mysql.php:57
Stack trace:
#0 /var/www.typechodev.com/var/Typecho/Db.php(312): Typecho_Db_Adapter_Mysql->connect(Object(Typecho_Config))
#1 /var/www.typechodev.com/var/Typecho/Db.php(349): Typecho_Db->query(Object(Typecho_Db_Query), 1)
#2 /var/www.typechodev.com/var/Widget/Options.php(345): Typecho_Db->fetchAll(Object(Typecho_Db_Query), Array)
#3 /var/www.typechodev.com/var/Typecho/Widget.php(222): Widget_Options->execute()
#4 /var/www.typechodev.com/var/Widget/Init.php(27): Typecho_Widget::widget('Widget_Options')
#5 /var/www.typechodev.com/var/Typecho/Widget.php(222): Widget_Init->execute()
#6 /var/www.typechodev.com/index.php(17): Typecho_Widget::widget('Widget_Init')
#7 {main}
可以看到,问题出在connect函数,即连接问题。
出现数据库连接问题,一般是这几种情况:
- 数据库服务没有起来
- 数据库配置没有配置正确
检查数据库服务状态
直接执行service mysql status
可以看到mysql服务的运行状态,如果看到下面的结果,说明数据库没有起来,请手动重启数据库。
$ service mysql status
mysql stop/waiting
检查config.inc.php配置
如果数据库没有挂掉,请检查config.inc.php
中数据库配置是否正确,
$db = new Typecho_Db('Mysql', 'typecho_');
$db->addServer(array (
'host' => 'localhost',
'user' => 'root',
'password' => '******',
'charset' => 'utf8',
'port' => '3306',
'database' => 'typecho',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
请仔细确认其中host、user、password、database的配置。
其他情况
曾经出现过某些同学,不小心将/etc/hosts
中localhost
解析到127.0.0.1
的那行删掉了,而config.inc.php
中host
的配置是localhost
,导致php链接数据库的时候,无法解析localhost
,导致连接失败。大家也可以看看
数据库查询错误
数据库查询错误,表现在页面出现500,错误信息为:Database Query Error,如图。
出现这种错误,基本上可以判断是查询的问题,即请检查查询语句是否正确。
最简单的办法,就是打开typecho的调试模式,会非常详细显示错误情况。
1. 在index.php中加入define('__TYPECHO_DEBUG__',true);
,打开typecho调试模式
#file: index.php
define('__TYPECHO_DEBUG__',true);//add by https://www.typechodev.com
2.然后再次访问出错的页面,可以看到如下详细的错误信息
Table 'typecho.te_options' doesn't exist
exception 'Typecho_Db_Query_Exception' with message 'Table 'typecho.te_options' doesn't exist' in /var/www.typechodev.com/var/Typecho/Db/Adapter/Mysql.php:77
Stack trace:
#0 /var/www.typechodev.com/var/Typecho/Db.php(319): Typecho_Db_Adapter_Mysql->query(Object(Typecho_Db_Query), Resource id #2, 1, 'SELECT')
#1 /var/www.typechodev.com/var/Typecho/Db.php(349): Typecho_Db->query(Object(Typecho_Db_Query), 1)
#2 /var/www.typechodev.com/var/Widget/Options.php(345): Typecho_Db->fetchAll(Object(Typecho_Db_Query), Array)
#3 /var/www.typechodev.com/var/Typecho/Widget.php(222): Widget_Options->execute()
#4 /var/www.typechodev.com/var/Widget/Init.php(27): Typecho_Widget::widget('Widget_Options')
#5 /var/www.typechodev.com/var/Typecho/Widget.php(222): Widget_Init->execute()
#6 /var/www.typechodev.com/index.php(17): Typecho_Widget::widget('Widget_Init')
#7 {main}
看到这里,就知道应该去确认config.inc.php
中配置是否正确。
还可以通过观察mysql的log,确认问题所在
1.查看mysql的查询日志,检查sql语句
如果你不知道如何查看mysql的log,请参考《如何打开mysql的查询log》
#tailf /var/log/mysql/mysql.log
170309 0:03:54 119 Connect root@localhost on
119 Init DB typecho
119 Query SET NAMES 'utf8'
119 Query SELECT * FROM te_options WHERE (`user` = 0 )
119 Quit
仔细检查sql语句,发现表名te_options
不正确,表前缀没有对上,数据库中表名是typecho_options
。
2.检查typecho的配置文件,确认问题
打开typecho安装目录下的配置文件config.inc.php
,检查配置:
#vim config.inc.php
$db = new Typecho_Db('Mysql', 'te_');
$db->addServer(array (
'host' => 'localhost',
'user' => 'root',
'password' => '********',
'charset' => 'utf8',
'port' => '3306',
'database' => 'typecho',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
修改配置,te_
改成typecho_
,问题解决。原来,在网站迁移过程中,数据库表名的前缀改变导致此问题。
版权声明:未经书面授权禁止转载、摘编、复制或建立镜像。对既成事实本站将保留所有的权利。
评论已关闭