Mysql无法启动 - ibdata1腐败? - 操作系统错误号13 - 权限问题

时间:2010-10-11 15:32:05

标签: mysql file permissions innodb

电源故障时服务器关闭 Mysql现在不会启动。
磁盘未满。 系统日志低于

Oct 11 15:03:31 joe mysqld_safe[24757]: started
Oct 11 15:03:31 joe mysqld[24760]: 101011 15:03:31  InnoDB: Operating system error number 13 in a file operation.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: The error means mysqld does not have the access rights to
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: the directory.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: File name ./ibdata1
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: File operation call: 'create'.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: Cannot continue operation.

14 个答案:

答案 0 :(得分:93)

如果您使用的是ubuntu或apparmor,则应在apparmor中允许此更改。

修改/etc/apparmor.d/usr.sbin.mysqld并使用新的/var/lib/mysql更改DATADIR

它应该有用。

答案 1 :(得分:16)

文件没有损坏。您可以使用'perror'找出这些错误的来源。即。

toaster:~ morgo$ perror 13
OS error code  13:  Permission denied

InnoDB有腐败检测(页面校验和),很高兴地告诉你这是不是问题。

目录权限已更改,或者my.cnf文件已被清除,并且它正在尝试在其他位置重新创建数据文件。

答案 2 :(得分:15)

错误:

101130 14:42:51 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
101130 18:07:58 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
101130 18:07:58  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.

解决方案SeLinux SeLinux安全性:

[root@localhost ~]# service mysqld restart
Deteniendo mysqld:                                         [  OK  ]
Iniciando mysqld:                                          [  FALLÓ  ]
[root@localhost ~]#  restorecon -R /var/lib/mysql/
[root@localhost ~]# service mysqld restart
Deteniendo mysqld:                                         [  OK  ]
Iniciando mysqld:                                          [  OK  ]
[root@localhost ~]#

答案 3 :(得分:13)

对我来说,恢复安全上下文(selinux)就可以了。

restorecon -R /var/lib/mysql/

答案 4 :(得分:9)

请检查一下:

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

答案 5 :(得分:5)

我在CentOS盒子上遇到了完全相同的问题。移动mysql数据目录后,我无法启动服务,即使我已经复制了具有相同所有者和权限的文件。

我遇到了SELinux安全上下文的问题。如果您运行CentOS库存,它很有可能被启用,不会让你想用MySQL做你想做的事情。解决这个问题:

首先使用

比较旧目录和新目录
ls -Z /var/lib/mysql 

ls -Z /new/mysql/dir

如果您发现任何差异,可能是您的问题。 要修改它:

chcon -R --type=mysql_db_t /new/mysql/dir

-R开关用于递归。如果您只需要更改一个文件,则可以省略它。 如果您的上下文与我的不同(可能是不同的发行版),请使用第一个输出所指示的那个(它应该是SELinux内容的第3个字段)

ls -Z /var/lib/mysql 

答案 6 :(得分:4)

简而言之,(特别是在RHEL / CentOS / Fedora上)尝试

getenforce

如果它以Enforcing回复,则表示您已启动并运行SELinux。暂时使用setenforce 0停用它,看看MariaDB现在是否启动!相当常见,特别是在RHEL / CentOS / Fedora上。

还有更多关于此问题,以及this official article

一般

UNIX环境中有许多东西可能会阻止文件访问,而不仅仅是用户访问权限。

  • 像SELinux(见上文)或AppArmor(如Dan所提到)的安全模块可以禁止它
  • 可以为所需的文件/目录
  • 专门设置访问控制列表(ACL)
  • 任何父文件夹可能由另一个用户拥有,并且没有为其他用户设置x(=“dir access”)

另外还有其他意想不到的因素,比如......

  • mysql datadir被设置为一个地方,其中mysql没有权限(参见/etc/my.cnf
  • Mysql可能(奇怪地)以不同的用户身份运行,或者该文件可能只是由其他人拥有

只是提一下我头顶的东西(随意编辑/添加到这个答案顺便说一下)。

在这种情况下,SELinux是“问题”

对于永久解决方案,您可以尝试恢复适当的安全上下文,...

restorecon -R /var/lib/mysql/

...或者只是停用SELinux(但在此之前稍微考虑一下这一点),编辑配置(通常在/etc/selinux/config中)并按照以下文章中的建议设置SELINUX=disabled

显然,这些只适用于MySQL。

答案 7 :(得分:3)

我遇到了同样的问题并通过以下步骤进行修复

工作目录/ var / lib / mysql

早期/ var / lib / mysql由某个未知用户拥有

将其更改为mysql

mysql]# chown -R mysql:mysql *

mysql]# service mariadb start

Redirecting to /bin/systemctl start mariadb.service

像魅力一样工作

答案 8 :(得分:2)

当我弹出这个时,我在/etc/mysql/my.cnf配置文件中找到了答案。 datadir行未指向/var/lib/mysql目录(数据库所在的目录)。一旦我把这条路径放入,服务器重新启动没问题。

答案 9 :(得分:1)

我在CentOS盒子上遇到了完全相同的问题。在移动mysql数据目录后,我无法启动服务,即使我已经复制了具有相同所有者和权限的文件。

我遇到了SELinux安全上下文的问题。如果你运行你的CentOS股票,它很有可能被启用,并且不会让你用MySQL做你想做的事情。解决这个问题:

首先使用

比较旧目录和新目录
ls -Z /var/lib/mysql 

ls -Z /new/mysql/dir

如果您发现任何差异,可能是您的问题。 要修改它:

chcon -R --type=mysql_db_t /new/mysql/dir

-R开关用于递归。如果您只需要更改一个文件,则可以省略它。

答案 10 :(得分:1)

如果您使用SEL Linux

高级管理

yum whatprovides /usr/sbin/semanage,您将获得policycoreutils-python-2.5-22.el7.x86_64

请参见mysqld安全上下文

安装yum install policycoreutils-python后,您可以查看mysqld具有哪些不同的安全上下文。

semanage fcontext -l | grep mysqld
/etc/mysql(/.*)?                       all files    system_u:object_r:mysqld_etc_t:s0
/etc/my\.cnf\.d(/.*)?                  all files    system_u:object_r:mysqld_etc_t:s0
/var/log/mysql.*                       regular file system_u:object_r:mysqld_log_t:s0
/var/lib/mysql(-files|-keyring)?(/.*)? all files    system_u:object_r:mysqld_db_t:s0
/var/run/mysqld(/.*)?                  all files    system_u:object_r:mysqld_var_run_t:s0
/var/log/mariadb(/.*)?                 all file     system_u:object_r:mysqld_log_t:s0
/var/run/mariadb(/.*)?                 all files    system_u:object_r:mysqld_var_run_t:s0
/usr/sbin/mysqld(-max)?                regular file system_u:object_r:mysqld_exec_t:s0
/var/run/mysqld/mysqlmanager.*         regular file system_u:object_r:mysqlmanagerd_var_run_t:s0
/usr/lib/systemd/system/mysqld.*       regular file system_u:object_r:mysqld_unit_file_t:s0
/usr/lib/systemd/system/mariadb.*      regular file system_u:object_r:mysqld_unit_file_t:s0
/etc/my\.cnf                           regular file system_u:object_r:mysqld_etc_t:s0
/root/\.my\.cnf                        regular file system_u:object_r:mysqld_home_t:s0
/usr/sbin/ndbd                         regular file system_u:object_r:mysqld_exec_t:s0
/usr/libexec/mysqld                    regular file system_u:object_r:mysqld_exec_t:s0
/usr/bin/mysqld_safe                   regular file system_u:object_r:mysqld_safe_exec_t:s0
/usr/bin/mysql_upgrade                 regular file system_u:object_r:mysqld_exec_t:s0
/etc/rc\.d/init\.d/mysqld              regular file system_u:object_r:mysqld_initrc_exec_t:s0
/var/lib/mysql/mysql\.sock             socket       system_u:object_r:mysqld_var_run_t:s0
/usr/libexec/mysqld_safe-scl-helper    regular file system_u:object_r:mysqld_safe_exec_t:s0
/home/[^/]+/\.my\.cnf                  regular file unconfined_u:object_r:mysqld_home_t:s0

在这里,您会看到mysqld的所有上下文,并附有简短说明

  1. mysqld_etc_t-配置文件
  2. mysqld_db_t-数据数据库文件
  3. mysqld_log_t-日志文件
  4. mysqld_exec_t-执行文件

因此,如果文件上的安全上下文错误,则会遭到拒绝(错误13)

解决方案

chcon -R -u system_u -t mysqld_db_t  /var/lib/mysql

但是也请检查“普通”权限。我遇到centos这个问题。您必须systemctl restart mysql进行更改。

答案 11 :(得分:0)

在我的情况下是Selinux的问题。而且 chcon -R --type=mysql_db_t /new/mysql/dir出现错误:
chcon: failed to change context of /new/mysql/dir to root:object_r:mysql_db_t: Invalid argument
所以我使用命令:chcon -R root:object_r:mysqld_db_t /new/mysql/dir

答案 12 :(得分:0)

如果您在Synology NAS上遇到此问题,可以按照Synology支持团队的建议进行修复:

  

亲爱的用户,

     

这已被确认为已知问题,我们将尝试在进一步的MariaDB版本中解决此问题。很抱歉给您带来不便。

     

以下是解决方法:

     
      
  • 请尝试使用“root”帐户和密码(与管理员相同)远程登录到您的DS
  •   
  • 运行命令“echo 1> / var / services / mysql / VERSION”
  •   
  • 从DSM打开MariaDB软件包将再次触发更新
  •   
  • 输入数据库密码,然后单击“更新将解决此问题”
  •   

更多信息:Synology forum

答案 13 :(得分:-9)

我遇到了同样的问题。 做了很多研究并找到了这个解决方案。 您需要在ibdata1上运行此命令 sudo shadowprotect -u root |根

我不知道这是做什么的......但它对我有用。

祝你好运。