在 mysql 中重新创建一个 `mysql.user` 表

Posted

技术标签:

【中文标题】在 mysql 中重新创建一个 `mysql.user` 表【英文标题】:Recreate a `mysql.user` table in mysql 【发布时间】:2017-11-19 15:47:47 【问题描述】:

我发现我的mysql.user 表乱了,使用drop table if exists mysql.user 删除它,如何手动创建这个特殊表并将我的新帐户添加到其中。

【问题讨论】:

您能否至少向我们展示一下您的用户表的结构? 删除mysql.user 等系统表是个坏主意。我建议你重新安装数据库。 @Arrabidas92 我认为在我检查 MySQL 文档并发现它非常复杂(有很多列)之前重新创建这个表会很容易。我的 mysql.user 表已经消失了。我意识到这是个坏主意。 【参考方案1】:

NB我从未尝试过这个,所以我不知道它是否会起作用。你已经被警告了!!

在您做任何事情之前,请关闭 MySQL 服务并备份数据文件夹(将其复制到其他位置)。

接下来,要么尝试创建一个新的数据目录并运行mysql_install_db(来自 MySQL 安装目录,scripts/mysql_install_db --datadir=<new data directory>),要么使用虚拟机并执行相同的操作。无论您做什么,NOT 安装到原始文件夹中。 使用相同版本的 MySQL 来执行此操作

无论您使用哪种方法,从<mysql data folder>/data(它们应称为user.MYDuser MYIuser.frm)获取生成的文件并将它们复制到损坏的文件夹中。确保用户权限与文件夹的其余部分相同(所有者和组应为读/写)。

重启你的 MySQL 服务,看看你是否可以进入系统(不需要登录信息,但你必须以root 登录 MySQL。如果可以,重新创建相关用户以访问应用程序。如果没有,您仍然有数据文件夹的备份。

如果它不起作用,并假设您有最近的备份,请使用 mysql_install_db 完全重新创建数据文件夹(确保您仍然拥有开始之前创建的文件夹的副本) ,创建用户,然后从您上次的良好备份中一一还原您的个人数据库。不要恢复 mysql 数据库和表 - 它们将在您恢复其他数据库时构建。

首先在虚拟机上尝试所有这些 - 它会帮助您发现任何问题

祝你好运

【讨论】:

很好的答案 - 在关闭之前我唯一会做的事情(如果 OP 还没有)是使用 pt-show-grants 转储当前用户和密码和权限,这样他就可以在之后恢复它们复制 mysql.user 表。但是一旦你关闭了 mysqld,内存中的授权就会丢失。【参考方案2】:

感谢@DaveyBoy 的answer。我在 ubuntu 16.04、mysql 5.7.20 上进行如下操作,得到 mysql.user 表:

sudo mysqld --initialize --datadir=~/data_tmp

sudo cp ~/data_tmp/mysql/user.frm /var/lib/mysql/mysqlsudo cp ~/data_tmp/mysql/user.MYD /var/lib/mysql/mysqlsudo cp ~/data_tmp/mysql/user.MYI /var/lib/mysql/mysql

sudo chown mysql:mysql /var/lib/mysql/mysql/user.frmsudo chown mysql:mysql /var/lib/mysql/mysql/user.MYDsudo chown mysql:mysql /var/lib/mysql/mysql/user.MYI

mysql cli select * from mysql.user 中,表 mysql.user 现在应该出现了。

【讨论】:

以上是关于在 mysql 中重新创建一个 `mysql.user` 表的主要内容,如果未能解决你的问题,请参考以下文章

重新登录到 phpmyadmin 后,存储过程在 mysql 中消失了

链接到在线数据库后是不是需要在 MS Access 中重新创建关系?

我应该重新使用游标对象还是使用 mysql.connector 创建一个新对象?

解决MySQL向表中增加数据插入中文乱码问题

忘记linux下的mysql密码,需要重新创建密码123456

在 Python 中无需重新启动应用程序即可检索 MySQL 数据库的新行