Проблема с разрешениями MySQL - должна быть не проблема - PullRequest
7 голосов
/ 02 декабря 2008

Это сводит меня с ума: я сделал 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

Из-за пинков я пробовал рут-рут: рут и я. Это не решило проблему.

Исходный сервер 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 и внутреннему ИТ-персоналу. Смотри ниже.

Ответы [ 3 ]

4 голосов
/ 22 августа 2009

Вкл. Ubuntu , посмотрите настройки apparmor для mysql

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

Это должно решить проблемы с разрешениями. Для быстрого теста вы можете даже попробовать

/etc/init.d/apparmor stop

Но не забудьте перезапустить службу.

Мне потребовалось некоторое время, чтобы понять. И после прочтения «SELinux» стало ясно, что я забыл этот новый вид защиты в Ubuntu.

3 голосов
/ 02 декабря 2008

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

Вы также получите сообщение об ошибке идентификатора пользователя MySQL, выполняющего запрос не имеет привилегий "ФАЙЛ ДАННЫХ" что позволяет идентификатору пользователя писать в файловая система.

Другими словами, это может быть проблема с разрешениями в отношении привилегий SQL, а не разрешений файлов операционной системы.

2 голосов
/ 09 декабря 2008

Оказалось, что это проблема SElinux - все разрешения моей файловой системы были в порядке, но для доступа MySQL к этому разделу диска была установлена ​​политика более высокого уровня.

Урок: Если у вас есть проблема с разрешениями, но права доступа и права доступа к файловой системе явно верны, обратитесь к SElinux.

...