У меня есть веб-сервер, на котором по умолчанию mysql размещает все файлы базы данных в /var/lib/mysql
. Раздел, где /var
установлен, имеет только 2 ГБ пространства, поэтому после запуска в пространстве проблем я решил переместить каталог данных mysql.
Мой наивный подход заключался в том, чтобы скопировать /var/lib/mysql
каталог полностью в /web/dbs/mysql
, и изменить /etc/mysql/my.cnf
так что он читает
datadir = /web/dbs/mysql
Однако после перезапуска я получаю следующие ошибки в журнале ошибок mysql, и сервер не запускается.
130130 9:59:23 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
130130 9:59:23 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
130130 9:59:23 InnoDB: Initializing buffer pool, size = 8.0M
130130 9:59:23 InnoDB: Completed initialization of buffer pool
130130 9:59:23 InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.
Все файлы и каталоги принадлежат mysql:mysql
. Для тестирования даже изменил права доступа на /web/dbs/mysql
являются rwxrwxrwx
на данный момент.
И да, /web/dbs/mysql/mysql/plugin.frm
существует.
В чем может быть проблема? Я что-то упускаю? Доступен ли более подробный журнал вывода?
ОБНОВИТЬ:
Дополнительная информация:
Я повторил все с помощью следующих команд:
stop mysql
rm -r /web/dbs/mysql
cp -p -r /var/lib/mysql/ /web/dbs/
datadir = /web/dbs/mysql
Привилегии:
drwxr-xr-x 4 mysql mysql 34 2013-01-30 15:55 /web/dbs
drwx------ 19 mysql mysql 4096 2013-01-30 15:44 /web/dbs/mysql
drwx------ 2 mysql mysql 4096 2012-10-11 11:25 /web/dbs/mysql/mysql
-rw-rw---- 1 mysql mysql 8586 2012-08-14 19:15 /web/dbs/mysql/mysql/plugin.frm
Когда я сбрасываю datadir на datadir = /var/lib/mysql
, сервер запускается без проблем.
Пробовал следующее:
root:/# su - mysql
mysql:~$ /usr/sbin/mysqld --verbose
130130 16:01:05 [Warning] Can't create test file /web/dbs/mysql/s15800994.lower-test
130130 16:01:05 [Warning] Can't create test file /web/dbs/mysql/s15800994.lower-test
mysql:~$ touch /web/dbs/mysql/s15800994.lower-test
mysql:~$ ls -l /web/dbs/mysql/s15800994.lower-test
-rw-r--r-- 1 mysql mysql 0 2013-01-30 16:01 /web/dbs/mysql/s15800994.lower-test
Таким образом, каталог данных настроен правильно. Пользователь mysql имеет доступ на запись, но процесс mysql не может создавать файлы.
Что могло быть не так?
Добавление решения, к которому мы пришли в комментариях, как полный ответ для полноты ...
Тестирование с помощью su / sudo показало, что, хотя mysqld жаловался на ошибки разрешений, пользователь mysql действительно мог успешно писать в папку, что дало понять, что это не проблема разрешения файловой системы. (Полезный первый шаг, если вы столкнулись с подобной проблемой)
Некоторые дистрибутивы Linux (если не все?) Теперь поставляются с AppArmor, который ограничивает файлы / папки, к которым разрешен доступ исполняемым файлам.
Решением в этом случае было просто добавить новый путь к /etc/apparmor.d/usr.sbin.mysqld
файл политики.
В случае, если AppArmor не выполняет поиск selinux, потому что в большинстве Linux на основе rpm вы увидите selinux. Просто отключи это.
#setenforce 0
#getenforce
Команда Getenforce даст вам разрешение.