Это сводит меня с ума: я сделал 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)) */;
Ошибка:
ERROR 1 (HY000): Can't create/write to file '/opt/data/data2/idx_foo/my_precious_table#P#p0#SP#foo0.MYI' (Errcode: 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 и себя. Это не устранило проблему.
Исходный сервер MySQL - это версия 5.1.22-rc-log. Целевой сервер - 5.1.29-rc-community. Оба работают на последних установках CentOS.
Редактировать: Еще немного исследований показывает, что код ошибки 13 на самом деле является ошибкой прав доступа. Но как я могу получить это на rwxrwxrwx?
Редактировать: Превосходное предложение Билла Карвина не оправдалось. Я работаю как пользователь root, и у меня установлены все флаги привилегий.
Редактировать: Создание таблицы БЕЗ указания каталогов данных для отдельных разделов работает, но мне нужно разместить эти разделы на диске большего размера, чем тот, на котором этот экземпляр MySQL помещает таблицы по умолчанию. И я не могу просто указать DATA / INDEX DIRECTORY на уровне таблицы - это недопустимо в версии MySQL, которую я использую (5.1.29-rc-community).
Редактировать: Наконец-то нашел ответ благодаря списку рассылки MySQL и внутреннему ИТ-персоналу. См. ниже.
да. Проверял не раз.





http://bugs.mysql.com/bug.php?id=19557
You will also receive an error message of the MySQL user ID running the query does not have "DATA FILE" privileges that allows the user ID to write to the file system.
Другими словами, это может быть проблема разрешений в отношении привилегий SQL, а не разрешений файлов операционной системы.
Спасибо. Я работаю как root, и быстрая проверка таблицы USER показывает, что у меня все права (включая File_priv) установлены в значение true. Кроме того, привилегия FILE (ее нет под названием DATA FILE) позволяет использовать операторы LOAD DATA INFILE и SELECT ... INTO OUTFILE - отдельная проблема от создания таблицы.
Хорошо, доки, хорошо бы исключить такую возможность. Но я не уверен, что еще предложить.
Оказалось, что это проблема SElinux - все мои разрешения файловой системы были в порядке, но была установлена политика более высокого уровня против доступа MySQL к этому разделу диска.
Урок: если у вас есть проблема с разрешениями, но права собственности и разрешения файловой системы, очевидно, правильны, обратитесь к SElinux.
Я быстро прихожу к мнению, что первое, что нужно сделать в любой системе Linux, - это setenforce 0.
На Ubuntu посмотрите настройки Apparmor для mysql
vi /etc/apparmor.d/usr.sbin.mysql
Это должно решить проблемы с разрешениями. Для быстрого теста вы даже можете попробовать
/etc/init.d/apparmor stop
Но не забудьте перезапустить службу.
Мне потребовалось некоторое время, чтобы понять. И после прочтения «SELinux» стало ясно, что я забыл об этом новом виде защиты в Ubuntu.
Вы уверены, что путь правильный?