无法打开和锁定特权表:表'mysql.user'不存在。

63

我使用二进制压缩包安装了MySQL社区服务器5.7.10。我将zip文件解压到c:\mysql,并在c:\mysql\data中创建了数据文件夹。我创建了名为my.ini的配置文件,并将其放置在c:\mysql(解压后zip文件的根目录)。下面是my.ini文件的内容。

# set basedir to your installation path
basedir=C:\mysql
# set datadir to the location of your data directory
datadir=C:\mysql\data

我正在尝试使用 mysqld --console 启动MySQL,但是该进程因下面的错误而中止。
2015-12-29T18:04:01.141930Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
2015-12-29T18:04:01.141930Z 0 [ERROR] Aborting 

任何有关这方面的帮助都将不胜感激。

1
我认为这个SO帖子可能会有所帮助。 - vmachan
有没有人有一个适用于xampp的解决方案?我在mysql上遇到了一个错误,关于一个丢失的文件叫做servers.MAI。这个模块一直建议这个问题,但是它不起作用,真是个意外。 - undefined
7个回答

87
您需要运行以下命令来初始化数据目录:mysqld --initialize(生成随机根密码)或mysqld --initialize-insecure(使用空白根密码)。请注意保留HTML标记。

7
然而,MySQL 5.6 及以下版本无法使用此选项。那么,对于这些版本出现的错误 Can't open and lock privilege tables: Table 'mysql.user' doesn't exist ,我们该如何处理?具体是什么原因导致了这个问题,又该如何在不安装的情况下解决它呢? - Pacerier
2
找到相关的帖子:http://dba.stackexchange.com/q/115701/9405 和 http://superuser.com/q/660078/78897 - Pacerier
1
要运行 mysqld --initialize,打开终端或命令提示符并移动到 xampp/mysql/bin/ 文件夹,然后运行此命令。 - SAYE
  1. 在初始化之前,请确保数据目录为空。
  2. 随机密码将打印到 data/HOST_NAME.err 文件中。
- naXa stands with Ukraine
3
如果mysqld没有“--initialize”和“--initialize-insecure”选项该怎么办?我收到了一个错误信息“/usr/local/mysql/bin/mysqld: unknown option '--initialize-insecure'”。 - Paul Serikov
使用mysqld --initialize-insecure创建了数据目录和mysql的默认表,而WAMP在安装过程中没有执行此操作,导致MYSQLD无法启动。 - WhiteHorse

24

mysql_install_db 脚本还需要 datadir 参数:

mysql_install_db --user=root --datadir=$db_datapath

在 Maria DB 上,您可以使用安装脚本 mysql_install_db 进行安装和初始化。在我的情况下,我使用一个环境变量作为数据路径。不仅 mysqld 需要知道数据的位置(通过命令行指定),安装脚本也需要知道。


在这里,您最有可能使用 --user=mysql 将目录权限设置为 MariaDB 运行的 mysql 用户。 - danblack
更新的命令,适用于mysql-server 5.7: mysqld --initialize --user=root --datadir=<datadir_location>。默认的<datadir_location>是/var/lib/mysql - undefined

5

使用mysqld --initialize命令来初始化数据目录,然后启动mysqld &。

如果你已经启动了mysqld &,但没有使用mysqld --initialize命令,那么你可能需要删除数据目录中的所有文件。

你也可以修改/etc/my.cnf文件,添加自定义路径到你的数据目录,如下所示:

[mysqld]
...  
datadir=/path/to/directory

2
如上所述,我遇到了与mysql-5.7.18相似的问题,我是这样解决的:

1. 从“MYSQL_HOME\bin\mysqld.exe --initialize-insecure”执行此命令
2. 然后启动“MYSQL_HOME\bin\mysqld.exe”
3. 使用用户名“root”连接工作台到本地主机:3306
4. 然后执行此查询“SET PASSWORD FOR 'root'@'localhost' = 'root';"
密码也已成功更新。

2
我有同样的问题。不知何故,--initialize没有起作用。 经过大约5个小时的尝试和错误,使用不同的参数、配置和命令,我发现问题是由文件系统引起的。
我想在一个大型USB HDD驱动器上运行数据库。大于2TB的驱动器采用GPT分区!这里有一个带有解决方案的错误报告:

https://bugs.mysql.com/bug.php?id=28913

简而言之:将以下行添加到您的my.ini文件中:
innodb_flush_method=normal

我在Windows上使用mysql 5.7时遇到了这个问题。

1
我的问题是由于错误的数据库恢复引起的。 当我导出数据库时,它也会捕获系统mysql表,因为我在-p 后面加了一个空格,如此处所述:mysqldump is dumping undesired system tables 启动docker实例将起作用,然后我会恢复(并损坏)数据库,它仍然会继续运行,但重新启动后会退出并显示错误代码1。 解决方案是正确地导出和恢复而不包括系统表。

谢谢!我遇到了完全相同的问题,这篇文章帮助我解决了它。 - Luke

0

当服务器重新启动时,我遇到了与版本Mysql 5.7.33相同的问题。我通过复制其他服务器用户文件scp /var/lib/mysql/mysql/user.* root@dest:/var/lib/mysql/mysql来解决它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接