mysql的列数.进程是错误的.预期20个,实际16个.这个表可能已经损坏了


Column count of mysql.proc is wrong. Expected 20, found 16. The table is probably corrupted

我使用000webhost.com和我使用phpMyAdmin那里。当我运行PHP脚本时,我从MySQL得到这个错误,标题说:

mysql的列数。进程是错误的。预期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();
?>

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

修复了它
mysql_upgrade -u root -p

同时,通过运行

重新启动mysql服务
service mysqld restart

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

找到文件mysql_upgrade"Macintosh高清⁩▸⁨应用⁩▸⁨XAMPP⁩▸⁨xamppfiles⁩▸⁨本⁩",双击它。

在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

问题解决了

Credits: XAMPP中似乎有一个bug - https://community.apachefriends.org/f/viewtopic.php?f=17&t=78386&sid=3d3824dd0b6aa2e33c3adc73c744b4b4

这个错误发生在错误的升级完成时。例如,如果你从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

我在Debian 8 (jessie)中将mysql服务器从5.5升级到5.7时也遇到了同样的问题。在我的例子中,当我执行以下命令时,它工作得很好:

mysql_upgrade --force -uroot -p

我在Ubuntu 20.04上使用xampp,我的问题是返回相同的消息错误,用这个解决方案解决了:

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

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

虽然你关于升级的必要性可能是正确的,但这并不是发生此错误的唯一原因。

当使用返回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。白色

我当时使用的是windows 10系统,我的解决方案是Mysql_upgrade -u root -p

但是你需要确保mysql_upgrade脚本的路径,它存在于你的安装目录的mysql/bin文件夹中,需要在环境变量路径中添加这个命令才能工作

在命令

下面点击浏览器
/opt/lampp/bin/mysql_upgrade

为Linux

如果你使用的是LAMPP,那么你可以像-

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

else如果mysql是单独安装的,那么你可以像这样-

mysql_upgrade -u root -p 
service mysqld restart

对于任何其他操作系统,您可以简单地进入bin目录的lamp安装&;尝试找到mysql_upgrade文件&执行它。

这种情况发生在升级而不是迁移;

读取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。删除InnoDB日志文件,然后恢复表proc;(适用于MariaDB 5.x): https://github.com/google/mysql/blob/master/scripts/mysql_system_tables.sql

对于我来说,这个问题是由在COUNT()前面意外地添加表别名前缀引起的:

MariaDB> SELECT x.COUNT(1) FROM (SELECT 1) AS x;
ERROR 1558 (HY000): Column count of mysql.proc is wrong. Expected 21, found 20. Created with MariaDB 100137, now running 100334. Please use mysql_upgrade to fix this error
MariaDB> SELECT COUNT(1) FROM (SELECT 1) AS x;
+-------------+
| COUNT(test) |
+-------------+
|           1 |
+-------------+
1 row in set (0.001 sec)
如您所见,没有COUNT()之前的前缀,它可以工作。我将表别名添加到所有SELECT字段,因此,意外地也添加到COUNT()之前。这是否会在一个新的数据库上给出一个不同的错误消息,我不知道,但服务器已经运行多年,通过修复查询错误消失了,所以…对我来说,这似乎是一个运行时/语法错误,而不是像这个线程中的其他人那样的升级/重启问题。

您可以在Linux中使用它sudo/opt/lampp/bin/mysql_upgrade