MySQL权限问题 - 应该是非问题

时间:2008-12-01 21:44:55

标签: unix mysql mysqldump mysql-management

这让我有点疯狂:我在一台服务器上执行了一个分区表的mysqldump,将生成的SQL转储移动到另一台服务器,并尝试运行插入。它失败了,但我很难搞清楚原因。谷歌和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

对于踢球,我尝试过chowning root:root和我自己。这并没有解决问题。

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

编辑:更多的研究表明,Errcode 13实际上是一个权限错误。但是我怎样才能在rwxrwxrwx上得到它?

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

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

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

3 个答案:

答案 0 :(得分:4)

Ubuntu 上查看mysql的 apparmor 设置

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

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

/etc/init.d/apparmor stop

但不要忘记重启服务。

我花了一些时间才弄明白。阅读“SELinux”之后很明显我忘记了Ubuntu上的这种新型保护。

答案 1 :(得分:3)

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

  

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

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

答案 2 :(得分:2)

事实证明这是一个SElinux问题 - 我的所有文件系统权限都很好,但是有一个更高级别的策略设置来防止MySQL访问该磁盘分区。

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