Mysql密码已过期,我的mysql.user表已损坏

时间:2017-06-07 22:32:20

标签: mysql ubuntu

好的,我有一点问题。

我的密码已过期,我的用户表已损坏。我可以通过

登录
mysql -u root -p 

但是在我执行的每个操作中,我都会收到以下错误:

  

mysql.user的列数是错误的。预计45,发现46.该表可能已损坏。

我已经读过您可以使用以下命令修复mysql.user表:

mysql_upgrade -u root -p 

但是当我这样做时,我得到了以下错误:

  

mysql_upgrade:收到错误:1862:您的密码已过期。登录你   必须使用支持过期密码的客户端进行更改。而   连接到MySQL服务器   升级过程遇到错误,不会继续。   那么,我该如何解决这个问题?

我有所有表格的备份,所以如果我必须重置所有数据库,我就不会有问题。

(为什么奇怪的格式?Stackoverflow认为它是所有代码并希望我把它放在代码块中,否则我无法保存它)

编辑:

我知道我的密码。这根本不是问题。

我的问题是密码已过期,我无法做任何事情因为我的mysql.user已损坏!

2 个答案:

答案 0 :(得分:1)

尝试禁用密码过期选项:编辑my.cnf并输入

[mysqld]
default_password_lifetime=0

并尝试重新启动mysql服务器,然后再次尝试登录。 来源是https://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html

要修复数据库,请运行mysqlcheck --repair --databases db_namemysqlcheck --repair --all-databases以修复所有数据库 来源在这里https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html 您可以先尝试修复数据库,然后尝试禁用密码生存期。

答案 1 :(得分:1)

从 2018 年恢复旧备份时遇到同样的问题,如您在评论中所说的那样重新安装 MySQL 没有解决问题。

我是怎么做的:

  1. 停止 MySQL 服务

  2. 运行mysqld_safe --skip-grant-tables --skip-networking &

    (如果出现错误,您可能需要手动创建和 chown 目录 /run/mysqld)

    --skip-grant-tables 将允许无密码登录,也将禁用对密码过期的任何检查

  3. 现在运行 mysql_upgrade --forcemysqlcheck --repair --all-databases

  4. 您现在可以终止正在运行的 mysqld_safe(ps aux | grep mysql 以找到要终止的 PID),然后使用 service mysql start 正常启动服务器。

    就我而言,它不起作用,我仍然有“预期 45,发现 46”错误。在这种情况下,请继续:

  5. 再次停止服务器并按照上述第 2 点在安全模式下重新启动它

  6. 现在您应该能够转储内容,但我们必须将 mysql 架构排除在转储之外。

    由于 mysqldump 没有 --exclude-database 选项,我们需要获取要转储的数据库列表。要获取现有数据库的列表(系统架构除外),请运行:

    mysql -Nse "SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','information_schema','performance_schema','sys');"

  7. 从列表中删除您不需要的任何其他数据库,然后运行转储:

    mysqldump --databases db1 db2 ... db50 > mysqldump.sql

  8. 杀死 mysqld,将数据目录移开并创建一个空目录 (mv /var/lib/mysql /var/lib/mysql-old && mkdir /var/lib/mysql && chown mysql:mysql /var/lib/mysql)

  9. service mysql start 和一个新的 datadir 将被填充。

  10. 运行 mysql_secure_installation 设置新的 root 密码

  11. 导入转储文件: cat mysqldump.sql | mysql -u root -p

在那之后,服务器就可以正常运行了。