2012-01-31 194 views
54

我在一个已经重新安装在RHEL 5上的服务器上。我能够安装Apache和PHP就好了。但我在安装MySQL时遇到了严重的麻烦。我尝试了以下方法:致命错误:无法打开和锁定权限表:表'mysql.host'不存在

yum install mysql-server mysql 

并没有得到任何错误或冲突。然后我试图启动mysql用下面的命令:

chkconfig --levels 235 mysqld on 
service mysqld start 

并获得Timeout error occurred trying to start MySQL Daemon.

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

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

我不知道从哪里去这里。

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

+0

所以我在寻找MySQL网站,看到此错误消息弹出他们的疑难解答在Windows系统上安装MySQL:http://dev.mysql.com/doc/refman/5.0/en/windows-troubleshooting.html 好吧,这可能是一个基于Unix系统相同的问题好吧,所以我想我需要弄清楚默认的位置是什么,以及它的实际安装位​​置。 “ ”这些消息通常发生在MySQL基本或数据目录安装在默认位置以外的不同位置时“ – 2012-01-31 16:50:35

+0

对于osx和mysql 5.7,请参考http://stackoverflow.com/a/37668663/334999 – Shuo 2016-06-07 00:13:46

回答

58
  1. 使用yum remove mysql*

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

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

  4. 使用ps -e检查流程,以确保mysql的卸载MySQL是不是还在运行。

  5. 重新启动服务器reboot

  6. 运行yum install mysql-server。这似乎也安装mysql客户端作为依赖。

  7. 给mysql的所有权和组priveleges有:

    chown -R mysql /var/lib/mysql

    chgrp -R mysql /var/lib/mysql

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

+5

我认为改变团队和所有权是至关重要的部分。看起来,当mysql启动时它会自动创建mysql.sock文件,但如果它没有系统权限,它不能这样做。 – 2012-02-02 21:21:54

+1

我不知道SELinux权限是否也可能涉及?销毁整个事物可能会让relabeling守护进程使用正确的标签标记新文件。 – sarnold 2012-02-21 23:55:36

+1

我已经重现了这个错误,单独的'chgrp'语句足以解决它。 – 2014-03-11 19:54:48

10

我的问题的根源似乎是selinux,它在操作系统安装时自动打开(执行) 。

我想我的MySQL在/数据。

验证后,我的。CNF有:

datadir=/data/mysql 

(和离开插座位于/ var/lib中/ MySQL的) 我执行的命令来关闭selinux的用于mysqld的 (另一种方法是完全关闭它):

setsebool -P mysqld_disable_trans=1 

我跑以下命令:

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

我开始MySQL守护程序和所有的工作之后的罚款。

0

在我的情况MySQL数据文件夹的路径有一个特殊的字符“C”,它让我得到...

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

我已删除了所有特殊字符和一切正常。

2

至于我自己,我不得不这样做:

yum remove mysql* 

rm -rf /var/lib/mysql/ 
cp /etc/my.cnf ~/my.cnf.bkup 

yum install -y mysql-server mysql-client 

mysql_install_db 

chown -R mysql:mysql /var/lib/mysql 
chown -R mysql:mysql /var/log/mysql 

service mysql start 

然后我就能够重新访问自己的数据库,并再次对其进行配置后,我核爆他们首次面世。

+1

这是为我做的。 mysql_install_db是不够的,但这解决了我。谢谢。 – swinefish 2016-11-29 08:02:15

0

在CentOS EL 6上,也许在早期版本中,有一种方法可以进入这个相同的混乱。

以最小的安装安装CentOS EL6。例如,我使用的kickstart安装以下:

%packages 
@core 
acpid 
bison 
cmake 
dhcp-common 
flex 
gcc 
gcc-c++ 
git 
libaio-devel 
make 
man 
ncurses-devel 
perl 
ntp 
ntpdate 
pciutils 
tar 
tcpdump 
wget 
%end 

你会发现,上面的列表中的某一个依赖是mysql-libs。我发现我的系统在/etc默认my.cnf,这包括:

[mysqld] 
dataddir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
user=mysql 
# Disabling symbolic-links is recommended to prevent assorted security risks 
symbolic-links=0 

[mysqld_safe] 
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 

当您从您的Generic Linux (Architecture Independent), Compressed TAR Archive默认数据目录建立是/usr/local/mysql/data这与/etc/my.cnf已经存在,它定义datadir=/var/lib/mysql冲突。在同一个文件中定义的pid-file也没有mysql123用户/组写入/var/run/mysqld的权限。

一个快速补救措施是mv /etc/my.cnf /etc/my.cnf.old应该让你的通用源程序工作。

当然,使用源代码RPM的体验是不同的。

49

chownchgrp“由荷兰国际集团@Bad Programmer/var/lib/mysql答案之后,您可能还需要执行以下命令:

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

然后重新启动mysqld

+0

这可能是一个极端愚蠢的问题,但是定义“做”?我问,因为'#'表示这是一个配置文件中的注释行,而不是输入终端的命令。那是错的吗? – Michael 2015-05-15 00:34:04

+2

''#''表示以root身份运行该命令(#是传统的root用户shell提示符,而$是非特权用户)。 – bk0 2015-05-15 22:51:20

+0

./bin/mysqld:太多参数(第一个额外的是'--user = mysql')。 – deathangel908 2015-12-26 12:43:50

0

我在尝试启动服务器时遇到了同样的问题,并遵循“已检查”的解决方案。 但仍有问题。问题在于我的/etc/my.cnf文件没有指向我的 指定的datadir,这是我在执行mysql_install_db时定义的--datadir定义的。一旦我更新了这个,服务器启动正确。

3

如果你移动你的datadir,你不仅需要赋予新的datadir权限,但你需要确保所有父目录都有权限。

我搬到我的datadir到硬盘驱动器,安装在Ubuntu为:

/media/*user*/Data/ 

和我DATADIR是数据库

我不得不权限设置为771到每个媒体,用户和Data目录:

sudo chmod 771 *DIR* 

如果这也不行,另一种方式则可以让MySQL工作是改变用户/etc/mysql/my.cnf为root;尽管从安全的角度来看,无疑存在一些问题。

+1

感谢分享,'chmod 771'完成了任务! – flocki 2015-11-28 23:55:27

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

CentOS中为我工作7

+2

如果适用,我发现这是一个好得多的解决方案,比完全卸载并重新安装数据库服务器,就像其他答案提示的那样。 – Jestep 2015-08-04 14:51:59

+0

解决了我的问题,实际上这个命令应该在mysql目录下运行:./scripts/mysql_install_db --user = mysql -ldata =/var/lib/mysql – CobraBJ 2015-11-24 03:04:34

-3

我在Ubuntu 14.04.2 LTS情况是相似的其他人与my.cnf中,但对我的事业是〜/ .my.cnf这是剩从以前的安装。删除该文件并清除/重新安装MySQL服务器后,它工作正常。

10

在windows上启动之前初始化mysql。

mysqld --initialize 
+1

'[ERROR] --initialize specified但data目录有文件在里面。正在中止。# – 2016-03-23 15:35:36

+0

@giannischristofakis如果这是一个全新的安装 - 没有实际的数据库与宝贵的数据,只需删除数据目录的内容,并重新发出命令。 (2年后) – froggythefrog 2017-08-06 23:13:03

5

当下载MySQL的压缩版本,如果直接运行的mysqld,你会得到这样的错误: 2016-02-18T07:23:48.318481Z 0 [错误]致命错误:无法打开和锁定特权表:表 'mysql.user' 不存在 2016-02-18T07:23:48.319482Z 0 [错误]中止

您有以下命令首先运行: 的mysqld --initialize

制作确保您的数据文件夹在此命令之前为空。

2

就在这个命令,足足可以做在CentOS 6.6

mysql_install_db的

34

魔术我对Arch Linux的这个问题为好。问题是pacman在不同于MySQL期望的位置安装了该软件包。我能够解决这个问题:

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

希望这可以帮助别人!

+0

谢谢!真的有用!它也适用于manjaro和mariadb。 – 2016-12-11 19:31:11

+0

我甚至不知道这个命令,它确实与mariadb和当前的Debian系统一起工作 – normic 2017-03-07 01:45:15

3

我只是与MySQL 5.7遇到了同样的问题上OSX:

rm -rf {datadir} 
mysqld --initialize --datadir {datadir} 
mysqld --datadir {datadir} 
0

如果您有用于愉快地运行MySQL服务器,但现在给这个错误,然后卸载和MySQL的重新安装是过度杀伤。

在我的情况下,服务器死了,并采取了几个磁盘块。这影响了一些文件,包括/var/lib/mysql/mysql/host.frm和/var/lib/mysql/mysql/proc.frm

幸运的是,我可以从另一台服务器复制这些文件,过去那个表错误。

0

我在Docker for Mac上默认的overlayfs(overlay2)上遇到了类似的错误。 在使用mysql创建映像后,在映像上启动mysql时发生错误。

2017-11-15T06:44:22.141481Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table storage engine for 'user' doesn't have this option 

切换到“aufs”解决了这个问题。 (在Docker for Mac上,可以通过选择“首选项...”菜单并选择“守护程序”选项卡并选择“高级”选项卡来编辑“daemon.json”。)

/etc/docker/daemon.json:

{ 
    "storage-driver" : "aufs", 
    "debug" : true, 
    "experimental" : true 
} 

编号:

https://github.com/moby/moby/issues/35503

https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028

相关问题