电源故障时服务器关闭
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.
答案 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)
getenforce
如果它以Enforcing
回复,则表示您已启动并运行SELinux。暂时使用setenforce 0
停用它,看看MariaDB现在是否启动!相当常见,特别是在RHEL / CentOS / Fedora上。
还有更多关于此问题,以及this official article。
UNIX环境中有许多东西可能会阻止文件访问,而不仅仅是用户访问权限。
另外还有其他意想不到的因素,比如......
datadir
被设置为一个地方,其中mysql没有权限(参见/etc/my.cnf
)只是提一下我头顶的东西(随意编辑/添加到这个答案顺便说一下)。
对于永久解决方案,您可以尝试恢复适当的安全上下文,...
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)
yum whatprovides /usr/sbin/semanage
,您将获得policycoreutils-python-2.5-22.el7.x86_64
安装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的所有上下文,并附有简短说明
因此,如果文件上的安全上下文错误,则会遭到拒绝(错误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 |根
我不知道这是做什么的......但它对我有用。
祝你好运。