安装typecho后出现数据库错误Database Query Error的解决办法汇总

很多同学在安装或者迁移数据库之后,会出现各种数据库异常,现在汇总一下常见的数据库错误,并附上排查方法,供大家参考。

数据库连接错误

最常见的错误就是出现Error establishing a database connection错误,如图:

安装typecho后出现数据库错误Database Query Error的解决办法汇总

遇到错误,首先第一个需要做的事情,就是打开typecho调试模式。在index.php最开始加入如下代码:

#file: index.php
define('__TYPECHO_DEBUG__',true);//add by http://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函数,即连接问题。

出现数据库连接问题,一般是这几种情况:

  1. 数据库服务没有起来
  2. 数据库配置没有配置正确

检查数据库服务状态

直接执行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/hostslocalhost解析到127.0.0.1的那行删掉了,而config.inc.phphost配置localhost,导致php链接数据库的时候,无法解析localhost,导致连接失败。大家也可以看看

数据库查询错误

数据库查询错误,表现在页面出现500,错误信息为:Database Query Error,如图。
安装typecho后出现数据库错误Database Query Error的解决办法汇总

出现这种错误,基本上可以判断是查询的问题,即请检查查询语句是否正确。

最简单的办法,就是打开typecho调试模式,会非常详细显示错误情况。

1. 在index.php中加入define('__TYPECHO_DEBUG__',true);,打开typecho调试模式

#file: index.php
define('__TYPECHO_DEBUG__',true);//add by http://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_,问题解决。原来,在网站迁移过程中,数据库表名的前缀改变导致此问题。


版权声明:未经书面授权禁止转载、摘编、复制或建立镜像。对既成事实本站将保留所有的权利。