【问题标题】:Column count of mysql.proc is wrong. Expected 20, found 16. The table is probably corruptedmysql.proc 的列数错误。预期 20,发现 16。表可能已损坏
【发布时间】:2020-07-22 17:46:24
【问题描述】:

我正在使用 000webhost.com 并且在那里使用 phpMyAdmin。如标题所示,当我运行 PHP 脚本时,我从 MySQL 收到此错误:

mysql.proc 的列数错误。预计 20 个,找到 16 个。

表可能已损坏。

有什么解决办法吗?

<?php
$username="usrname";
$password="passwd";
$database="a1xxxxx_mydb";
$host="mysqlxx.000webhost.com";
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
if (isset($_GET["userLatitude"]) && isset($_GET["userLongitude"])) {

 $userLatitude=$_GET['userLatitude']; 
 $userLongitude=$_GET['userLongitude']; 
 $result = mysql_query("SELECT locationName, ( 6371 * acos( cos( radians(floatval(     $userLatitude) )) * cos( radians( locationLatitude ) ) * cos( radians( locationLongitude ) - radians( floatval($userLatitude)) ) + sin( radians(floatval($userLongitude)) ) * sin( radians( locationLatitude) ) ) ) AS distance 
         FROM Location HAVING distance < 2 ORDER BY distance LIMIT 0 ,20") or die(mysql_error()); 
echo $result;

 // check for empty result
if (mysql_num_rows($result) > 0) {
   // looping through all results
   // products node
  $response["Location"] = array();

  while ($row = mysql_fetch_array($result)) {
    // temp user array
    $product = array();
    $product["locationName"] = $row["locationName"];
    $product["locationInfo"] = $row["locationInfo"];
    $product["locationLatitude"] = $row["locationLatitude"];
    $product["locationLongitude"] = $row["locationLongitude"];
    $product["locationPic"] = $row["locationPic"];
    $product["city"] = $row["city"];

    // push single product into final response array
    array_push($response["Location"], $product);
 }
 // success
 $response["success"] = 1;

   // echoing JSON response
   echo json_encode($response);
 } else {
// no products found
$response["success"] = 0;
$response["message"] = "No products found";

// echo no users JSON
echo json_encode($response);
 }
 }
  else {
    // required field is missing
   $response["success"] = 0;
   $response["message"] = "Required field(s) is missing";

  // echoing JSON response
  echo json_encode($response);
 }
mysql_close();
?>

【问题讨论】:

  • 提供更多细节将是一个好的开始。你在运行存储过程吗? UDF?显示一些你试图运行的代码怎么样?我们很好,但我们不是通灵者,无法读懂你的想法或远程查看你的屏幕。
  • 哦,你是对的,我正在尽可能快地输入代码。我只是无法连接到 000webhost.com。我会发布它。谢谢你:)
  • 我正在使用网站为我提供的 phpMyAdmin ...
  • 您的脚本易受 SQL 注入攻击。

标签: php mysql


【解决方案1】:

我也有这个错误。我通过运行修复它

mysql_upgrade -u root -p

另外,通过运行重启mysql服务

service mysqld restart

【讨论】:

  • 您可能需要 --force 标志。
  • 只是一个小笔记。我不得不使用 sudo 运行,即sudo mysql_upgrade -uxxx -pxxx。否则我们有这个错误:Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MariaDB Servers datadir, errno: 13
  • 如果您使用的是最新版本的 mariadb.... 命令是相同的但使用 maria... maria-upgrade -u root -p
  • 100th upvote ;) 因为这对我也有用,我需要的额外步骤是我必须修复 mysql 数据库的global_priv 表,然后它允许我升级 mysql。
  • 在我从 MySQL 备份的数据导入 MariaDB 后,从 MySQL 5.2 迁移到 MariaDB 10.3 时,这也对我有用。
【解决方案2】:

当我在 MacOS Mohave 中将 XAMPP 从 xampp-osx-7.2.10 更新到 7.3.9 时,我遇到了同样的问题。所以解决方案是:

在“Macintosh HD ▸ Applications ▸ XAMPP ▸ xamppfiles ▸ bin”中找到文件 mysql_upgrade 并双击它。

【讨论】:

  • 我试图通过双击运行它,但我得到“无法执行二进制文件”..
  • 它对我有用。双击后重启mysql
  • 从命令运行说 mysql_upgrade 已弃用。双击二进制文件完美。
  • 在 Linux 中也一样,它可以工作
【解决方案3】:

当升级失败时会发生此错误。例如,如果您从 5.0 升级到 5.1 但不运行 mysql_upgrade 脚本,就会发生这种情况;或者,在极少数情况下,如果您直接从 5.0 升级到 5.5,则可能会发生这种情况。 (很多人这样做,但官方不支持这样的更新) 您说您正在使用托管服务 - 好吧,我认为您应该创建一张票并告诉他们问题。如果您没有 SUPER 特权,您将无能为力。 但如果你有这个权利,只需运行 mysql_upgrade: http://dev.mysql.com/doc/refman/5.1/en/mysql-upgrade.html

【讨论】:

  • 运行 mysql_upgrade -u root -p 为我修复了我的数据库。谢谢。
【解决方案4】:

在 Ubuntu 18.04 上安装 XAMPP 7.4.8 后,MySQL Workbench 8.0.21 出现类似错误。使用 phpMyAdmin 没有问题。

Error Code: 1558 Column count of mysql.proc is wrong. Expected 21, found 20. Created with MariaDB 100108, now running 100413. Please use mysql_upgrade to fix this error

解决方案:

sudo /opt/lampp/lampp start
/opt/lampp/bin/mysql_upgrade

问题解决了

致谢:XAMPP 中似乎存在错误 - https://community.apachefriends.org/f/viewtopic.php?f=17&t=78386&sid=3d3824dd0b6aa2e33c3adc73c744b4b4

【讨论】:

    【解决方案5】:

    当我在 Debian 8 (jessie) 中将 mysql 服务器从 5.5 更新到 5.7 时,我遇到了同样的问题。就我而言,当我执行以下命令时它运行良好:

    mysql_upgrade --force -uroot -p
    

    【讨论】:

    • 如何在 localhost 中运行?
    【解决方案6】:

    我在 Ubuntu 20.04 上使用 xampp,我的返回相同消息错误的问题已通过此解决方案解决:

    1. 进入xampp目录:cd /opt/lampp/
    2. 进入bin目录:cd bin
    3. 执行脚本:sudo ./mysql_upgrade

    致谢:https://askubuntu.com/questions/1171409/how-to-run-mysql-upgrade-when-using-xampp

    【讨论】:

      【解决方案7】:

      尽管您对升级的必要性可能是正确的,但这并不是发生此错误的唯一原因。

      当使用返回 1 行的查询调用以下语句时

       my $rv = $sth_indexq->fetchall_arrayref;
      

      报如下错误:

      DBD::mysql::st execute failed: Column count of mysql.proc is wrong. Expected 20, found 16. Created with MySQL 50520, now running 50528. Please use mysql_upgrade to fix this error. at 
      ...
      

      但是,错误的真正原因是使用了 fetchall_arrayref 而不是 fetchrow_arrayref。以下工作没有错误:

      my $rv = $sth_indexq->fetchrow_arrayref;
      

      $rv 中的数据只有 1 级深度,而不是 2

      mysql_upgrade 解决方案可以很好地解决这个问题,但简单的解决方案是了解您的数据并使用正确的检索代码。

      J.怀特

      【讨论】:

      • 总是用代码格式化,如果你写了一些代码,使用 ctrl+k。
      • “知道你的数据”:是的,但 mysql.proc 不是我们的数据(我花了好几个小时才注意到这一点......)
      【解决方案8】:

      我使用的是 Windows 10 系统,对我有用的解决方案是 mysql_upgrade -u root -p

      但您需要确保安装目录的 mysql/bin 文件夹中存在的 mysql_upgrade 脚本的路径需要添加到环境变量路径中才能使该命令起作用

      【讨论】:

        【解决方案9】:

        点击浏览器下方的命令

        /opt/lampp/bin/mysql_upgrade
        
        

        【讨论】:

          【解决方案10】:

          适用于 Linux

          如果您使用的是 LAMPP,那么您可以像这样修复它 -

          sudo /opt/lampp/lampp start
          /opt/lampp/bin/mysql_upgrade
          

          如果你单独安装了mysql,那么你可以这样-

          mysql_upgrade -u root -p 
          service mysqld restart
          

          对于任何其他操作系统,您只需进入lampp安装的bin目录并尝试找到mysql_upgrade文件并执行它。

          【讨论】:

            【解决方案11】:

            这发生在例如。升级而不是迁移;

            它读取version check failed的部分是相关部分:

            Version check failed. Got the following error when calling the 'mysql' command line client
            ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
            FATAL ERROR: Upgrade failed
            

            显然这是关于客户端版本不兼容的问题,但mysql 数据库也不同。

            这将是 mysql.proc 表的当前定义...它表明自 MariaDB 10.3.3 以来枚举列 type 已更改,并且已添加该列 aggregate

            还有一个问题是:

            在 MariaDB 10.4 及更高版本中,此表使用 Aria 存储引擎。

            将服务器降级到 5.x 并删除 InnoDB 日志文件,然后恢复表 proc 帮助; (对于 MariaDB 5.x):https://github.com/google/mysql/blob/master/scripts/mysql_system_tables.sql

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-01-26
              • 2022-09-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多