【问题标题】:MediaWiki DB connection error while attempting to upgrade to 1.22尝试升级到 1.22 时出现 MediaWiki DB 连接错误
【发布时间】:2014-02-04 10:59:49
【问题描述】:

我在共享主机服务器上安装了 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 的发行说明中查找了“配置更改”,但没有看到任何更改说明。

请帮忙!

谢谢。

【问题讨论】:

    标签: mysql mediawiki


    【解决方案1】:

    为了记录,答案是将数据库主机从

    $wgDBserver = "localhost:/tmp/mysql5.sock"

    只是

    $wgDBserver = "本地主机"

    原始字符串应该可以工作,但在 MediaWiki 1.19.2 中有一个错误,如下所述:

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

    "1.22.0新的mysqli适配器没有正确实现非标准的MySQL 端口。”

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,不同之处在于我使用的 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 ),它接受连接字符串并将其解析为在文件中的函数 protected function mysqlConnect( $realServer ) 中调用 real_connect() 所需的部分相关文件夹中的DatabaseMysqli.php 包括/db。

      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()的调用以也指定一个套接字

      if ( $mysqli->real_connect( $realServer, $this->mUser,
          $this->mPassword, $this->mDBname, $port, $socketname, $connFlags ) )
      

      【讨论】:

        猜你喜欢
        • 2020-04-26
        • 1970-01-01
        • 2018-01-20
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-14
        相关资源
        最近更新 更多