Перемещение базы данных MySQL InnoDB в отдельный диск

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

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

1) в My.cnf я настроил

[mysqld] innodb_file_per_table

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

2) Я проверил, в порядке ли символические ссылки с SHOW VARIABLES LIKE "have_symlink";

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

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

Но мне нужны иностранные ключи ...)

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

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
 user@comp# perror 13
 OS error code  13:  Permission denied

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

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

Все разрешения файлов -rw-rw---- mysql mysql

Я использую сервер Ubuntu 10.04 с MySQL 5.1.41 (по умолчанию от APT).

Кто-нибудь из вас сделал это успешно?


person Norling    schedule 15.11.2010    source источник
comment
Самый простой способ - взять mysqldump, а затем удалить конфигурацию изменения схемы и импортировать ее, если ваша БД не очень большая.   -  person vinothkr    schedule 15.11.2010
comment
Я хочу оставить остальные базы данных на системном диске (для drupal и подобных вещей) и переместить только эту конкретную из каталога данных. Извините, если это не ясно из вопроса.   -  person Norling    schedule 15.11.2010
comment
Возможно, это больше подходит для serverfault.com — проголосовать за перенос...   -  person richsage    schedule 15.11.2010
comment
@Norling Jr.: зачем создавать другую базу данных и монтировать этот каталог базы данных на нужный диск?   -  person ajreal    schedule 15.11.2010
comment
@ajreal: Что ты имеешь в виду? Использование отдельного экземпляра MySQL с его каталогом данных, установленным на новый диск? Было бы не очень аккуратно... При использовании одного экземпляра MySQL все создаваемые базы данных создаются относительно каталога данных. Я пытаюсь убрать одного из них оттуда...   -  person Norling    schedule 15.11.2010
comment
@Norling Jr - вам не нужно создавать отдельный экземпляр, предположим, что это путь к вашей базе данных/database, ваша существующая база данных /database/existing_database и ваша новая база данных /database/new_database, просто смонтируйте /database/new_database на новый диск   -  person ajreal    schedule 15.11.2010


Ответы (4)


Я не уверен, что ваше решение - лучшая идея. Смотрите мой пост здесь:

http://www.mysqlperformanceblog.com/2010/12/25/spreading-ibd-files-across-multiple-disks-the-optimization-that-isnt/.

Здесь также есть этот другой поток:

innodb; Несколько каталогов данных

person Morgan Tocker    schedule 25.12.2010

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

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

Добавьте линии:

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

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

person Norling    schedule 15.11.2010
comment
Та же проблема в Ubuntu 12.04 после перемещения базы данных и замены ее символической ссылкой. Редактирование профиля AppArmor, как вы предлагаете, работает. Спасибо! - person Mihai Capotă; 20.07.2012
comment
Спасибо. Это было и моим решением. - person Yada; 02.02.2013
comment
Спасибо! Не забудьте перезапустить службу apparmor после изменения этого - person Bart van den Burg; 01.02.2014
comment
в Ubuntu 12.10 мне нужно перезапустить как apparmor, так и службу mysql, чтобы новая политика вступила в силу. - person Steve Zhan; 10.03.2014

Норлинг-младший спас мой день с наконечником Apparmor, но поскольку у меня были некоторые проблемы настроить его, я пишу более подробный ответ. Я использую Ubuntu 12.04.

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

sudo su -

После того, как MySQL Docs вы впервые перемещаете Уже создано база данных dir на другой путь:

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

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

sudo -u mysql ls /new/path/yourdatabase

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

chmod a+x  /new  /new/path/

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

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

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

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

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, но и проверит ее на предмет отсутствия синтаксической ошибки (очень важная вещь). Если вы не запустите парсер, новая конфигурация не будет применена.

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

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

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

person neves    schedule 01.08.2012
comment
это было невероятно полезно, СПАСИБО! - person Daniel Schaffer; 21.12.2012

Должна быть возможность использовать локальные монтирования (привязки) с соответствующими разрешениями и параметрами монтирования (включая контексты 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/

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

person Thomas    schedule 13.03.2013
comment
Я могу подтвердить, что это работает. Вам нужно выделить целый раздел только для подкаталога mysql, но как только вы это сделаете и смонтируете его правильно, он отлично работает. - person GaryO; 05.02.2015