尝试升级到1.22时MediaWiki数据库连接错误

时间:2014-02-04 10:59:50

标签: mysql mediawiki

我在共享主机服务器上安装了MediaWiki。它的版本是1.19.1,我正在尝试更新到1.22.2。该文档表明,对于此,一步更新应该没问题。

我已经多次成功完成过去的更新,并且按照之前的说明进行操作。我在其中设置了一个包含1.22.2的新目录,将LocalSettings.php/images/文件从工作的实时目录复制到新目录。 LocalSettings.php包含$wgDBuser$wgDBpassword$wgDBadminuser$wgDBadminpassword全部定义的条目。

我有命令行访问服务器,并试图通过

在WikiNew中运行更新过程
php maintenance/update.php

但它回应:

DB connection error: Unknown MySQL server host 'localhost:/tmp/mysql5.sock' (34) (localhost:/tmp/mysql5.sock)

如果我在WikiLive中也这样做,那就有效。当然它没有做任何实际的更新,因为我正在更新1.19.1到1.19.1,但是通常的消息类型出现但有迹象表明不需要更改,并且它会清除缓存。 LiviWiki,1.19,仍然有效。

因此连接字符串的相同数据存在于LocalSettings.php的两个副本中,maintenance/update.php的两个副本都访问相同的MySQL数据库,但是一个接受连接字符串而另一个不接受。

1.19和1.22之间有什么变化吗?我在1.20,1.21和1.22的发行说明中查找了“配置更改”,但没有看到任何更改的说明。

请帮忙!

谢谢。

2 个答案:

答案 0 :(得分:2)

对于记录,答案是从

更改数据库主机
  

$ wgDBserver =“localhost:/tmp/mysql5.sock”

  

$ wgDBserver =“localhost”

原始字符串应该有效,但MediaWiki 1.19.2中有一个错误,如下所述:

https://bugzilla.wikimedia.org/show_bug.cgi?id=58153

“1.22.0中的新mysqli适配器无法正确实现非标准MySQL 端口“。

答案 1 :(得分:0)

我遇到了类似的问题,区别在于我使用的MySQL服务器的连接字符串的格式为host:port:socket,如localhost:3306:/var/lib/mysock

我正在尝试安装mediawiki-1.22.6并且初始数据库检查失败。仅使用localhost对我来说不起作用,因为我使用的MySQL安装需要端口号和套接字。

我最终对mediawiki-1.22.6 php脚本进行了以下更改,以便允许解析host:port:socket形式的连接字符串。

警告:这些更改特定于我的网站和环境,如果未在localhost:/var/lib/mysock中指定端口号,则解析功能更改可能无法与其他字符串一起正常工作

以下是我为完成安装所做的具体更改。

在Includes的相对目录中的文件IP.php中有一个函数public static function splitHostAndPort( $both ),它接受​​连接字符串并解析它,将其分解为函数{{real_connect()调用的必要部分。 1}}位于相关文件夹中的DatabaseMysqli.php文件中包含/ db。

函数protected function mysqlConnect( $realServer )中的

我将函数修改为以下内容:

splitHostAndPort()

接下来我修改了public static function splitHostAndPort( $both ) { if ( substr( $both, 0, 1 ) === '[' ) { if ( preg_match( '/^\[(' . RE_IPV6_ADD . ')\](?::(?P<port>\d+))?$/', $both, $m ) ) { if ( isset( $m['port'] ) ) { return array( $m[1], intval( $m['port'] ) ); } else { return array( $m[1], false ); } } else { // Square bracket found but no IPv6 return false; } } $numColons = substr_count( $both, ':' ); if ( $numColons >= 2 ) { // Is it a bare IPv6 address? if ( preg_match( '/^' . RE_IPV6_ADD . '$/', $both ) ) { return array( $both, false ); } else { // Not valid IPv6, but too many colons for anything else // may be of the form localhost:port:socket // return false; } } if ( $numColons >= 1 ) { // Host:port:socket? $bits = explode( ':', $both ); if ( preg_match( '/^\d+/', $bits[1] ) ) { if ($numColons > 1) { return array( $bits[0], intval( $bits[1] ), $bits[2] ); } else { return array( $bits[0], intval( $bits[1] ) ); } } else { // Not a valid port return false; } } // Plain hostname return array( $both, false ); } 函数,以便检查端口和套接字是否都指定如下:

mysqlConnect()

然后将调用修改为// Other than mysql_connect, mysqli_real_connect expects an explicit port // parameter. So we need to parse the port out of $realServer $socketname = $port = null; $hostAndPort = IP::splitHostAndPort( $realServer ); if ( $hostAndPort ) { $realServer = $hostAndPort[0]; if ( $hostAndPort[1] ) { $port = $hostAndPort[1]; } if ( $hostAndPort[2] ) { $socketname = $hostAndPort[2]; } } 以指定套接字

real_connect()