致命错误:无法打开和锁定权限表格:表 'mysql.host' 不存在。

81

我在一台刚安装了RHEL 5的服务器上。我成功地安装了Apache和PHP,但是我的MySQL安装遇到了严重的问题。我尝试了以下方法:

yum install mysql-server mysql 

我没有收到任何错误或冲突信息。然后,我尝试使用以下命令启动mysql:

chkconfig --levels 235 mysqld on
service mysqld start

并且出现了 尝试启动MySQL守护进程时发生超时错误。

我检查了日志,看到了这个错误:

[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

我不确定接下来该怎么做。

供参考,我正在使用RHEL 5,并安装了最新版本的PHP 5和Apache。


所以我正在搜索mysql网站,看到他们在安装mysql在Windows系统上的故障排除中弹出了这个错误消息:http://dev.mysql.com/doc/refman/5.0/en/windows-troubleshooting.html好的,这可能也是基于Unix系统的同样问题,所以我猜我需要找出默认位置应该是什么,以及它实际被安装在哪里。“当MySQL基本目录或数据目录安装在与默认位置不同的位置时,通常会出现这些消息。” - Bad Programmer
对于OS X和MySQL 5.7,请参考https://dev59.com/_mox5IYBdhLWcg3wnllI#37668663。 - Shuo
18个回答

95

根据@Bad Programmer的答案使用chownchgrp更改/var/lib/mysql之后,您可能还需要执行以下命令:

sudo mysql_install_db --user=mysql --ldata=/var/lib/mysql

然后重新启动你的 mysqld


这可能是一个非常愚蠢的问题,但是“do”是什么意思?我问这个问题是因为#符号让我想到这是一行被注释掉的配置文件代码,而不是要在终端中输入的命令。这样理解对吗? - Michael
3
“#”符号表示以root用户身份运行命令(“#”是传统的root用户Shell提示字符,而“$”则是非特权用户的提示字符)。 - bk0
@bk0,除了重新安装之外,我们如何解决这个问题?到底是什么导致了这个错误,该如何修复它? - Pacerier
1
在对mysql进行全新安装后(或者在删除/var/lib/mysql后),你需要通过mysql_install_db手动创建系统表。mysql守护进程在启动时不会为你自动执行这个操作。 - bk0
1
对于其他人而言,复制粘贴这部分似乎会失败。我认为其中有一个特殊字符或其他什么东西,所以我不得不手动复制。 - Ivorius
显示剩余3条评论

70
  1. 使用 yum remove mysql* 卸载 MySQL

  2. 递归删除 /usr/bin/mysql/var/lib/mysql 目录

  3. 删除文件 /etc/my.cnf.rmp

  4. 使用 ps -e 命令检查进程,确保 MySQL 已经停止运行。

  5. 重启服务器,使用 reboot 命令。

  6. 运行 yum install mysql-server 命令,这也会作为依赖项安装 MySQL 客户端。

  7. 使用以下命令赋予 MySQL 所有权和组权限:

    chown -R mysql /var/lib/mysql

    chgrp -R mysql /var/lib/mysql

  8. 使用 service mysqld start 命令启动 MySQL 守护进程。


5
我认为更改组和所有权是关键部分。似乎当mysql启动时,它会自动创建mysql.sock文件,但如果没有系统权限,它就无法这样做。 - Bad Programmer
1
我想知道SELinux权限是否也有所涉及?摧毁整个东西可能会让重新标记守护程序使用正确的标签标记新文件。 - sarnold
1
我已经重现了这个错误,仅仅使用chgrp语句就足以解决它。 - Travis Jensen
这个答案应该在第7步和第8步之间编辑,包括@bk0的回答。这就是我如何解决我的mysql(在CentOS 7上使用MariaDB)的方法。 - L. Holanda
收到了相同的错误信息,但更改权限并未解决问题。有什么想法吗?http://askubuntu.com/questions/623797/error-updating-mysql-package - Michael
我的问题是我已经有了一个先前的/etc/my.cnf,并且在安装后放置了它,因此"datadir"的引用不正确。使用正确的--ldata /my/custom/path/to/lib/mysql选项运行mysql_install_db解决了我的问题。 - Bee Kay

58

我在 Arch Linux 上也遇到了这个问题。问题是 pacman 把软件包安装在 MySQL 期望的不同位置。我通过以下方式解决了这个问题:

sudo mysql_install_db --user=mysql --basedir=/usr/ --ldata=/var/lib/mysql/

希望这能对某人有所帮助!


1
我甚至不知道这个命令,它确实可以在Mariadb和当前的Debian系统上工作。 - normic

12

我的问题根源似乎是selinux,在操作系统安装时自动开启并强制执行。

我希望我的mysql在 /data 目录下。

确认 my.cnf 文件中有以下内容后:

datadir=/data/mysql

(同时将套接字留在 /var/lib/mysql 中) 我执行了关闭 mysqld selinux 的命令 (另一种方法是完全关闭它):


我执行了关闭 mysqld selinux 的命令 (另一种方法是完全关闭它):

setsebool -P mysqld_disable_trans=1

我运行了以下命令:

> chown -R mysql .
> chgrp -R mysql .
> mysql_install_db --user=mysql

我启动了mysql守护进程,之后一切正常。


11
mysql_install_db –-user=mysql --ldata=/var/lib/mysql

在CentOS 7上对我起了作用。


2
如果可以的话,我认为这是比其他答案建议的完全卸载和重新安装数据库服务器更好的解决方案。 - Jestep
解决了我的问题,实际上这个命令应该在mysql目录下运行:./scripts/mysql_install_db --user=mysql --ldata=/var/lib/mysql - CobraBJ

10

在Windows上启动之前,需要先初始化MySQL。

mysqld --initialize

2
[ERROR] --initialize specified but the data directory has files in it. Aborting. - giannis christofakis
1
如果这是全新安装——没有实际包含有价值数据的数据库,只需删除数据目录中的内容并重新发出命令。(两年后。) - froggythefrog
1
如果不是全新安装怎么办? @giannischristofakis - mal

7
下载 MySQL 压缩版本后,如果直接运行 mysqld,会出现以下错误信息: 2016-02-18T07:23:48.318481Z 0 [ERROR] 致命错误:无法打开和锁定权限表:表 'mysql.user' 不存在 2016-02-18T07:23:48.319482Z 0 [ERROR] 强制退出 需先运行以下命令: mysqld --initialize 在执行该命令前,请确保数据文件夹为空。

4

只需要执行这个命令就可以在CentOS 6.6上完成魔法

mysql_install_db


4
我刚在OSX上遇到了mysql 5.7的相同问题:
rm -rf {datadir}
mysqld --initialize --datadir {datadir}
mysqld --datadir {datadir}

3
如果您移动数据目录,不仅需要为新的数据目录设置权限,还需要确保所有父目录都有相应的权限。 我将我的数据目录移动到挂载在Ubuntu中的硬盘上:
/media/*user*/Data/

我的数据目录是Databases

我需要将媒体、用户和数据文件夹的权限设置为771:

sudo chmod 771 *DIR*

如果这种方法不起作用,你可以通过在 /etc/mysql/my.cnf 中将用户更改为 root 的方式来使 mysql 工作;尽管从安全角度考虑,这样做可能会存在一些问题。

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