【问题标题】:MySQL permissions issue - should be non-issueMySQL权限问题 - 应该是非问题
【发布时间】:2008-12-01 21:44:54
【问题描述】:

这让我有点抓狂:我在一台服务器上做了一个分区表的 mysqldump,将生成的 SQL 转储移动到另一台服务器,并尝试运行插入。它失败了,但我很难弄清楚为什么。 Google 和 MySQL 论坛和文档没有太大帮助。

失败的查询如下所示(为简洁明了而被截断,更改名称以保护无辜者):

CREATE TABLE `my_precious_table` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `somedata` varchar(20) NOT NULL,
 `aTimeStamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 PRIMARY KEY (`id`,`aTimeStamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='/opt/data/data2/data_foo/' INDEX DIRECTORY='/opt/data/data2/idx_foo/' 
/*!50100 PARTITION BY RANGE (year(aTimeStamp)) SUBPARTITION BY HASH ( TO_DAYS(aTimeStamp)) 
(PARTITION p0 VALUES LESS THAN (2007) (SUBPARTITION foo0 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM), 
PARTITION p1 VALUES LESS THAN (2008) (SUBPARTITION foo1 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM), 
PARTITION p2 VALUES LESS THAN (2009) (SUBPARTITION foo2 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM), 
PARTITION p3 VALUES LESS THAN MAXVALUE (SUBPARTITION foo3 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM)) */;

错误是:

错误 1 ​​(HY000):无法创建/写入文件 '/opt/data/data2/idx_foo/my_precious_table#P#p0#SP#foo0.MYI'(错误代码:13)

“无法创建/写入文件”对我来说似乎是权限问题,但目标文件夹的权限如下所示:

drwxrwxrwx 2 mysql mysql 4096 Dec  1 16:24 data_foo
drwxrwxrwx 2 mysql mysql 4096 Dec  1 16:25 idx_foo

为了好玩,我尝试对 root:root 和我自己进行 chowning。这并没有解决问题。

源 MySQL 服务器是 5.1.22-rc-log 版本。目标服务器是 5.1.29-rc-community。两者都在最近的 CentOS 安装上运行。

编辑:更多研究表明 Errcode 13 实际上是权限错误。但是我怎样才能在rwxrwxrwx 上获得呢?

编辑:Bill Karwin 的出色建议没有成功。我以 root 用户身份工作,并设置了所有权限标志。

编辑:在不为各个分区指定数据目录的情况下创建表是可行的——但我需要将这些分区放在比此 MySQL 实例默认放置表的磁盘更大的磁盘上。而且我不能只在表级别指定 DATA/INDEX DIRECTORY - 这在我使用的 MySQL 版本(5.1.29-rc-community)中是不合法的。

编辑:终于找到了答案,感谢 MySQL 邮件列表和内部 IT 人员。见下文。

【问题讨论】:

  • 你确定路径正确吗?
  • 是的。我已经检查了不止一次。

标签: unix mysql mysqldump mysql-management


【解决方案1】:

在 Ubuntu 上查看 mysql 的 apparmor 设置

vi /etc/apparmor.d/usr.sbin.mysql

这应该可以解决权限问题。为了快速测试,您甚至可以尝试

/etc/init.d/apparmor stop

但别忘了重启服务。

我花了一些时间才弄清楚。在阅读了“SELinux”之后,很明显我已经忘记了 Ubuntu 上的这种新保护。

【讨论】:

    【解决方案2】:

    http://bugs.mysql.com/bug.php?id=19557

    您还会收到一条错误消息 运行查询的 MySQL 用户 ID 没有“数据文件”权限 允许用户 ID 写入 文件系统。

    换句话说,这可能是与 SQL 权限相关的权限问题,而不是操作系统文件权限问题。

    【讨论】:

    • 谢谢。我以 root 身份运行,快速检查 USER 表显示我已将所有权限(包括 File_priv)设置为 true。此外,FILE 权限(没有称为 DATA FILE)允许您使用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 语句 - 将问题与表创建分开。
    • Okey dokey,最好排除这种可能性。但我不确定还有什么建议。
    【解决方案3】:

    原来是 SElinux 问题 - 我的所有文件系统权限都很好,但是针对 MySQL 访问该磁盘分区设置了更高级别的策略。

    课程:当您遇到权限问题但所有权和文件系统权限显然正确时,请查看 SElinux。

    【讨论】:

    • 我很快就认为在任何 Linux 系统上应该做的第一件事是setenforce 0。
    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 2010-12-10
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多