好的,我有一点问题。
我的密码已过期,我的用户表已损坏。我可以通过
登录mysql -u root -p
但是在我执行的每个操作中,我都会收到以下错误:
mysql.user的列数是错误的。预计45,发现46.该表可能已损坏。
我已经读过您可以使用以下命令修复mysql.user表:
mysql_upgrade -u root -p
但是当我这样做时,我得到了以下错误:
mysql_upgrade:收到错误:1862:您的密码已过期。登录你 必须使用支持过期密码的客户端进行更改。而 连接到MySQL服务器 升级过程遇到错误,不会继续。 那么,我该如何解决这个问题?
我有所有表格的备份,所以如果我必须重置所有数据库,我就不会有问题。
(为什么奇怪的格式?Stackoverflow认为它是所有代码并希望我把它放在代码块中,否则我无法保存它)
编辑:
我知道我的密码。这根本不是问题。
我的问题是密码已过期,我无法做任何事情因为我的mysql.user已损坏!
答案 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_name
或mysqlcheck --repair --all-databases
以修复所有数据库
来源在这里https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html
您可以先尝试修复数据库,然后尝试禁用密码生存期。
答案 1 :(得分:1)
从 2018 年恢复旧备份时遇到同样的问题,如您在评论中所说的那样重新安装 MySQL 没有解决问题。
我是怎么做的:
停止 MySQL 服务
运行mysqld_safe --skip-grant-tables --skip-networking &
(如果出现错误,您可能需要手动创建和 chown 目录 /run/mysqld)
--skip-grant-tables 将允许无密码登录,也将禁用对密码过期的任何检查
现在运行 mysql_upgrade --force
和 mysqlcheck --repair --all-databases
您现在可以终止正在运行的 mysqld_safe(ps aux | grep mysql
以找到要终止的 PID),然后使用 service mysql start
正常启动服务器。
就我而言,它不起作用,我仍然有“预期 45,发现 46”错误。在这种情况下,请继续:
再次停止服务器并按照上述第 2 点在安全模式下重新启动它
现在您应该能够转储内容,但我们必须将 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');"
从列表中删除您不需要的任何其他数据库,然后运行转储:
mysqldump --databases db1 db2 ... db50 > mysqldump.sql
杀死 mysqld,将数据目录移开并创建一个空目录 (mv /var/lib/mysql /var/lib/mysql-old && mkdir /var/lib/mysql && chown mysql:mysql /var/lib/mysql
)
service mysql start
和一个新的 datadir 将被填充。
运行 mysql_secure_installation
设置新的 root 密码
导入转储文件:
cat mysqldump.sql | mysql -u root -p
在那之后,服务器就可以正常运行了。