Мне пришлось сделать символическую ссылку в одной из баз данных на другое место в MySQL (Debian 6.0). Так /var/lib/mysql/dbname
указывает на /home/user/dbname
, но MySQL дает
Ошибка MySQL: 1017 (Не удается найти файл: './dbname/tbl201206.frm' (номер ошибки: 13))
Я прочитал несколько руководств по созданию символических ссылок на каталоги данных или файлы таблиц, но может ли mysqld читать и такие ссылки?
Код ошибки (errno: 13)
означает отказано в разрешении. Убедитесь, что mysql
у пользователя есть разрешение на чтение и запись /home/user/dbname
и все файлы под ним.
Вы можете сделать это с помощью sudo su mysql
а затем некоторая команда, которая обращается к файлу, например file /home/user/dbname/tbl201206.frm
.
Чтобы исправить это, вы, вероятно, захотите сделать chown -R mysql:mysql /home/user/dbname
. Вам также может понадобиться chmod +x /home/user
.
Если вы используете Ubuntu (и, возможно, другие последние версии Linux), может случиться так, что MySQL не получит доступ к местоположению вашего файла, даже если права доступа к файлу верны. Это вызвано AppArmor, модуль безопасности Linux, который реализует контроль обязательного доступа на основе имени. Чтобы проверить, используете ли вы AppArmor, попробуйте команду:
$ sudo apparmor_status
Если это работает и включает mysqld, вам, вероятно, потребуется изменить вашу конфигурацию. Это было описано в полезный пост от andol на AskUbuntu, но это решило проблему для меня только на первый взгляд (я воспроизвожу сообщение андола ниже для удобства и на случай изменения другой страницы).
После перемещения файла базы данных и размещения символической ссылки, файл больше не увеличивался, и вместо этого был записан основной файл InnoDB (хотя я использую innodb_file_per_table
иметь отдельные файлы БД). Теперь я предполагаю, что изменений, предложенных в сообщении andol (и во многих других местах в Интернете), на самом деле недостаточно. В конце концов я переместил весь каталог данных MySQL и отредактировал файл AppArmor /etc/apparmor.d/tunables/alias
вместо этого (и никакого другого файла), чтобы сделать ход (документация находится в файле). Это работало правильно на Ubuntu 12.4 (точно).
Вот что написал andol - как я сказал выше, у меня это не сработало.
Предположим, что ваш новый datadir будет / дома / данные / MySQL.
Если вы откроете файл /etc/apparmor.d/usr.sbin.mysqld вы найдете среди правил эти две строчки.
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
В нашем примере, приведенном выше, они должны быть заменены или (возможно, предпочтительнее) дополнены этими двумя строками.
/home/data/mysql/ r,
/home/data/mysql/** rwk,
Прежде чем мы сможем запустить наш сервер MySQL с его новым каталогом данных, нам также нужно будет явно перезагрузить наш новый профиль apparmor.
$ sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld