Перенос MySQL баз на отдельный жесткий диск
27 мая 2012 г.

Перенос MySQL баз

Иногда возникает ситуация когда нужно перенести базы mysql в другое место. Например, на отдельный жесткий диск или просто в другое место (какие-то причины безопасности). Это может быть необходимо, если не хватает места на диске или для увеличения быстродействия, например ssd винт или raid массив.

Способ 1

Если вы хотите выделить под БД полностью весь жеский диск, то нужно просто примонтировать устройство в mysql директорию по умолчанию. Обычно это /var/lib/mysql Останавливаем сервер

/etc/init.d/mysqld stop

Копируем базы в какую-то временную директорию

mkdir /var/lib/mysql_temp
cp -r /var/lib/mysql/* /var/lib/mysql_temp/

удаляем базы со старой директории

rm /var/lib/mysql/* -Rf

Предполагается что у вас уже есть подготовленный жесткий диск. Если же нет, то его нужно предварительно разбить и создать файловую систему. Это можно сделать например при помощи cfdisk. И так примонтируем устройство:

mount /dev/sda3 /var/lib/mysql

нужно не забыть прописать в файле /etc/fstab примонтированный раздел, для того что бы при следующей загрузке системы он автоматически монтировался. Более подробнее смотрите мануалы по fstab и mount. В fstab должна быть запись вида:

/dev/sda3 /var/lib/mysql ext4 defaults 0 0

далее переносим назад наши базы

cp -r /var/lib/mysql_temp/* /var/lib/mysql/

и удаляем резервную копию (с этим лучше пока не спешить, удалить можно когда все успешно перенеслось)

rm /var/lib/mysql_temp/ -Rf

далее нужно правильно выставить права доступа к /var/lib/mysql. Владелец папки должен быть mysql c правом на запись

chown mysql:mysql /var/lib/mysql/ -R
chmod 755 /var/lib/mysql

а так же еще один важный момент, выставляем SELinux права доступа

chcon -R system_u:object_r:mysqld_db_t:s0 /var/lib/mysql/

проверить SELinux права можно командой ls -Z, должно быть что-то вроде этого:

ls -Z /var/lib/mysql/
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql

теперь запускаем mysql демон

/etc/init.d/mysqld start

Способ 2

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

останавливаем сервер

/etc/init.d/mysqld stop

копируем базы в новое место. Например, если мы хотим, что бы базы лежали в /media/sda3/mysql/

mkdir /media/sda3/mysql/
cp -r /var/lib/mysql/* /media/sda3/mysql/

ставим права доступа к /media/sda3/mysql/

chown mysql:mysql /var/lib/mysql/ -R
chmod 755 /var/lib/mysql

а так же SELinux права доступа

chcon -R system_u:object_r:mysqld_db_t:s0 /media/sda3/mysql/

правим конфиг my.cnf. Обычно он находится в /etc/my.cnf либо /etc/mysql/my.cnf

[mysqld]
datadir=/media/sda3/mysql
socket=/media/sda3/mysql/mysql.sock
log-bin=/media/sda3/mysql/mysql-bin
[mysqld_safe]
datadir=/media/sda3/mysql

теперь запускаем mysql демон

/etc/init.d/mysqld start

На этом всё. Если что-то не получается, смотрим лог в /var/log/mysql.log

Последнее обновление 9 мая 2021 г.
Development mysql linux administration database