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

Posted

技术标签:

【中文标题】无法打开和锁定特权表:表 \'mysql.user\' 不存在【英文标题】:Can't open and lock privilege tables: Table 'mysql.user' doesn't exist无法打开和锁定特权表:表 'mysql.user' 不存在 【发布时间】:2016-04-03 16:03:14 【问题描述】:

我使用二进制 zip 安装了 mysql 社区服务器 5.7.10。我在c:\mysql 中提取了zip,并在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 

我们将不胜感激。

【问题讨论】:

我认为SO post 可能会有所帮助.. 【参考方案1】:

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

【讨论】:

【参考方案2】:

我的问题是由不正确的数据库还原引起的。 当我对 db 进行调用时,它还拾取了系统 mysql 表,因为我在 -p 之后添加了一个空格,如下所述:mysqldump is dumping undesired system tables

启动 docker 实例会起作用,然后我会恢复(并损坏)数据库,它仍然会继续运行,但重新启动后会退出并显示错误代码 1。

解决方案是在没有系统表的情况下正确转储和恢复。

【讨论】:

【参考方案3】:

mysql_install_db 脚本也需要datadir 参数:

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

在 Maria DB 上,您使用安装脚本 mysql_install_db 进行安装和初始化。就我而言,我使用环境变量作为数据路径。 mysqld 不仅需要知道数据在哪里(通过命令行指定),安装脚本也需要。

【讨论】:

您很可能在此处使用--user=mysql 将目录权限设置为运行MariaDB 的mysql 用户。【参考方案4】:

我遇到了同样的问题。出于某种原因,--initialize 不起作用。 在使用不同的参数、配置和命令进行了大约 5 个小时的反复试验后,我发现问题是由文件系统引起的。

我想在大型 USB 硬盘驱动器上运行数据库。大于 2 TB 的驱动器是 GPT 分区的!这是一个带有解决方案的错误报告:

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

简而言之:将以下行添加到您的 my.ini 中:

innodb_flush_method=normal

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

【讨论】:

【参考方案5】:

如上所述,我在 mysql-5.7.18 上遇到了类似的问题,我就是这样做的 1. 从“MYSQL_HOME\bin\mysqld.exe --initialize-insecure”执行此命令 2.然后启动“MYSQL_HOME\bin\mysqld.exe” 3. 使用用户名“root”将工作台连接到这个 localhost:3306 4. 然后执行这个查询 "SET PASSWORD FOR 'root'@'localhost' = 'root';"

密码也更新成功了。

【讨论】:

【参考方案6】:

您必须通过运行以下命令来初始化数据目录

mysqld --initialize [随机root密码]

mysqld --initialize-insecure [root 密码为空]

【讨论】:

但是,这不是 MySQL 5.6 及以下版本的选项。那么在这些版本上,我们将如何处理错误Can't open and lock privilege tables: Table 'mysql.user' doesn't exist究竟是什么导致了这个问题,如何在不安装的情况下修复它? 找到相关话题:dba.stackexchange.com/q/115701/9405和superuser.com/q/660078/78897 运行mysqld --initialize打开终端或命令提示并移动到xampp/mysql/bin/文件夹然后运行这个命令。 1.在初始化之前确保数据目录是空的。 2.随机密码打印到data/HOST_NAME.err mysqld没有--initialize--initialize-insecure选项怎么办?我收到一个错误/usr/local/mysql/bin/mysqld: unknown option '--initialize-insecure'【参考方案7】:

mysqld --initialize 初始化数据目录然后mysqld &

如果您已经在没有 mysqld --initialize 的情况下启动了 mysqld&,您可能需要删除数据目录中的所有文件

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

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

【讨论】:

以上是关于无法打开和锁定特权表:表 'mysql.user' 不存在的主要内容,如果未能解决你的问题,请参考以下文章

SQL 导出到 Excel 结果到文档锁定,无法编辑工作表

如何修复mysql.user表?

目录表的特权不会被撤销

如何锁定SQL开发人员以允许SELECT查询

mysql.user表重置密码后出现表损坏问题

mysql权限机制2