这让我有点抓狂:我在一台服务器上做了一个分区表的 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
为了踢球,我尝试对 root:root 和我自己进行 chowning。这并没有解决问题。
源 MySQL 服务器是 5.1.22-rc-log 版本。目标服务器是 5.1.29-rc-community。两者都在最近的 CentOS 安装上运行。
编辑: 更多研究表明 Errcode 13 实际上是权限错误。但我怎样才能得到它rwxrwxrwx
?
编辑: 比尔卡尔文的绝妙建议没有成功。我以 root 用户身份工作,并设置了所有权限标志。
编辑: 在不为各个分区指定数据目录的情况下创建表是可行的——但我需要将这些分区放在比这个 MySQL 实例默认放置表的磁盘更大的磁盘上。而且我不能只在表级别指定 DATA/INDEX DIRECTORY - 这在我使用的 MySQL 版本(5.1.29-rc-community)中是不合法的。
编辑:感谢 MySQL 邮件列表和内部 IT 人员,终于找到了答案。见下文。