Подтвердить что ты не робот

Перемещение базы данных MySQL InnoDB для разделения диска

В моей установке MySQL у меня есть одна база данных InnoDB, которая, как я знаю, будет очень большой, поэтому я решил переместить ее на свой собственный диск. Я надеялся сделать это, переместив файлы на другой диск, а затем создав символическую ссылку, но я столкнулся с ошибками!

Это то, что я сделал:

1) В my.cnf я установил

[туздЫ]  innodb_file_per_table

(Это работает, у меня есть один .ibd per.frm в папке базы данных.)

2) Я проверил, соответствуют ли симлинки с помощью SHOW VARIABLES LIKE "have_symlink";

(Я знаю, что в документации говорится:

Символы полностью поддерживаются только для Таблицы MyISAM. Для файлов, используемых таблицы для других систем хранения, вы могут возникнуть странные проблемы, если вы попытаетесь используйте символические ссылки.

Но мне нужны внешние ключи...)

3) Я переместил папку базы данных и создал символическую ссылку.

4) Перезагруженный mysql и попытался:

 mysql> USE db_name
 Database changed
 mysql> SHOW TABLES;
 ERROR 1018 (HY000): Can't read dir of './db_name/' (errno: 13)
 mysql> exit
 [email protected]# perror 13
 OS error code  13:  Permission denied
Символьная ссылка

(как ожидалось) lrwxrwxrwx mysql mysql db_name -> /path-to/db_name/

Разрешения папки базы данных drwx------ mysql mysql

все права доступа к файлам: -rw-rw---- mysql mysql

Я использую Ubuntu 10.04 Server с MySQL 5.1.41 (по умолчанию от apt).

Успешно ли вы сделали это?

4b9b3361

Ответ 2

Оказывается, это работает, но мой старый враг appArmor заблокировал MySQL от чтения перемещенного каталога.

sudo nano /etc/apparmor.d/usr.sbin.mysqld

добавить строки:

/new-db-path/ r,
/new-db-path/** rwk,

Спасибо за помощь!

Ответ 3

Norling Jr. сохранил мой день с подсказкой AppArmor, но поскольку у меня возникли проблемы с его настройкой, я пишу более подробный ответ. Я использую Ubuntu 12.04.

Начните становиться root, чтобы сохранить необходимость вводить все это sudos:

sudo su -

Следуя MySQL docs, сначала переместите уже созданный каталог базы данных на другой путь:

mv /var/lib/mysql/yourdatabase /new/path/

Здесь была моя первая ловушка. Проверьте, имеет ли пользователь mysql доступ к этому новому пути:

sudo -u mysql ls /new/path/yourdatabase

Если вам отказали в доступе, вы должны, вероятно, предоставить разрешение на выполнение для каждого родительского каталога:

chmod a+x  /new  /new/path/

Тест для повторного доступа к файлу. Если он все еще не работает, попробуйте задать вопрос в Stack Overflow: -)

Свяжите новое местоположение dir и дайте ему правильные разрешения:

 ln -s /new/path/yourdatabase /var/lib/mysql/
 chown mysql:mysql /var/lib/mysql/yourdatabase

Отредактируйте локальный файл конфигурации AppArmor. Вы не изменяете файл /etc/apparmor.d/usr.sbin.mysqld. Отредактируйте локальный conf, чтобы вы не потеряли его после обновления системы:

emacs /etc/apparmor.d/local/usr.sbin.mysqld

добавить конфигурацию Norling Jr.:

/new/path/yourdatabase/ r,
/new/path/yourdatabase/** rwk,

Не пропустите последнюю запятую. Сохраните файл и перезагрузите конфигурацию AppArmor:

apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

Это не просто перезагрузит конфигурацию AppArmor MySql, но и проверит ее, если нет синтаксической ошибки (очень важная вещь). Если вы не запускаете парсер, новый conf не будет применяться.

Наконец, просто откройте клиент mysql и введите SHOW DATABASES. Если ваша база данных появляется, все, наверное, хорошо. Введите "USE yourdatabase" для другой проверки.

Более надежный тест также перезагрузит службу mysql: "service mysql restart" и попытайтесь получить доступ к вашей базе данных.

Теперь я буду помнить, в следующий раз мне нужно это сделать. Google и SO вместе - лучший ноутбук в мире: -)

Ответ 4

Должно быть возможно использование локальных монтировок (привязок) с соответствующими разрешениями и монтирования опций (включая контексты selinux или apparmor):

/dev/sdc on /var/lib/mysql/my-db/
/dev/sdd on /var/lib/mysql/her-db/
fs.example.com:/path/to/wherever on /var/lib/mysql/my-other-db/

Хотя я не тестировал это решение, используйте его на свой страх и риск.