По умолчанию база данных MySQL будет создана в каталоге /var/lib/mysql.
Это может быть хорошо, если вы работаете в небольшой базе данных, которая не занимает много места. Но на производстве, для увеличения базы данных, вы можете не иметь достаточно места под корневой раздел.
В этом случае, вы можете захотеть перенести базу данных MySQL из корневого раздела в другой раздел.
Чтобы изменить каталог MySQL, вы должны выполнить следующие три шага:
- Переместить файлы базы данных MySQL из /var/lib/mysql на другой раздел
- Изменить файл my.cnf на новый путь каталога
- Обновление параметров безопасности, чтобы отразить изменение каталога: На CentOS или RedHat, изменить настройки SELinux. В Ubuntu или Debian, изменить настройки AppArmor.
Это руководство объясняет подробности о том, как выполнить вышеуказанные три шага, чтобы переместить данные MySQL в другую папку.
Сделайте резервную копию текущей MySQL
Перед тем, как сделать что-нибудь, остановите базу данных MySQL и сделайте полную резервную копию базы данных.
По умолчанию в MySQL база данных будет в каталоге /var/lib/mysql. Скопируйте этот каталог MySQL в другое место в качестве резервного копирования.
service mysqld stop cp -r /var/lib/mysql /backup/mysql
Или, если вы предпочитаете, вы можете использовать mysqldump чтобы сделать резервную копию БД MySQL.
Перемещение MySQL каталога данных в другой раздел
В этом примере, мой корневой раздел /dev/sda1, который не имеет много места для каталога /var/lib/mysql по умолчанию. Но, у меня есть раздел /data на диске /dev/sdb1, который имеет много места.
Таким образом, я перемещу базу данных MySQL из раздела /в раздел /data.
Создайте следующий каталог и переместите данные из каталога /var/lib в /data/var/lib, как показано ниже.
mkdir -p /data/var/lib cd /var/lib mv mysql /data/var/lib/
Несколько моментов, для рассмотрения следующих вопросов:
- Вы также можете переместить каталог MySQL в каталог /data/var/lib, а также создать символическую ссылку из /var/lib, указывающей на /data/var/lib. Но, в данном конкретном случае, я предпочитаю, простой перенос каталога без символической ссылки, чтобы избежать путаницы.
- Если возможно, попробуйте использовать команду move, чтобы переместить каталог (вместо копии). При выполнении копии, контекст SELinux будут потерян, и вы должны вручную установить ее позже (как описано ниже). Но, когда вы перемещаете, соответствующий SELinux контекст для MySQL хранятся, и вам не придется беспокоиться об изменении его.
Кроме того, если вы скопировали каталог (вместо того, чтобы переместить), убедитесь, что вы измените владельца надлежащим образом. Если нет, то вы можете получить следующее сообщение об ошибке:
chown -R mysql:mysql /data
Измените файл my.cnf и запустите MySQL
В файле /etc/my.cnf, вам необходимо изменить параметр datadir и параметр socket, указать на новый каталог, как показано ниже.
# vi /etc/my.cnf datadir=/data/var/lib/mysql socket=/data/var/lib/mysql/mysql.sock
И, наконец, перезапустите базу данных MySQL.
# service mysqld start Starting mysqld: [ OK ]
Если у вас параметр tmpdir уже определен в файле my.cnf, измените каталог для него тоже:
tmpdir=/data/var/lib/mysql
После изменения параметров datadir и socket в файле my.cnf, если MySQL не запускается, или не удается с сообщением об ошибке разрешения отказано, то вам необходимо установить SELinux (или AppArmor), как описано далее.
Контекст SELinux для MySQL
Используйте команду ls -Z для просмотра контекста SELinux. Перед тем как перейти в каталог, следующий контекст SELinux был на моей базе данных MySQL. В этом примере, “bd-andreyex” является база данных MySQL в каталоге /var/lib/mysql.
Как вы видите здесь, mysqld_db_t является SELinux тип контекста.
# ls -Z /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 bd-andreyex -rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1 -rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0 ..
После перемещения каталога в новое место, вы должны увидеть точную SELinux в качестве предварительного шага.
ls -Z /data/var/lib/mysql
Примечание: Если вы сделали копию каталога (вместо переноса), вы заметите, что он изменился. В этом случае, изменение контекста SELinux, как описано ниже.
Когда контекст SELinux неправильно, вы увидите следующее сообщение об ошибке (или что-то похожее на это) в журнале log(или /var/log/messages)
# cat /var/log/audit/audit.log: type=AVC msg=audit(1447281394.928:20831): avc: denied { read } for pid=21346 comm="mysqld" name="mysql" dev=sda1 ino=5506027 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:var_lib_t:s0
Кроме того, вы увидите следующее в файле mysqld.log, когда базу данных MySQL не удастся запустить.
# cat /var/log/mysqld.log: mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql [Warning] Can't create test file /var/lib/mysql/devdb..lower-test /usr/libexec/mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13) [ERROR] Aborting [Note] /usr/libexec/mysqld: Shutdown complete
Установка SELinux для MySQL на CentOS / RedHat (Вариант 1)
С помощью команды chcon, вы можете изменить тип контекста SELinux в новом каталоге, как показано ниже.
chcon -R -t mysqld_db_t /data
В приведенной выше команде:
- chcon это команда для изменения контекста SELinux
- Опция -R будет рекурсивно изменить контекст для данного каталога и в вспомогательном каталоге.
- Опция -t используется для указания типа контекста SELinux, который должен быть установлен. В этом примере, мы устанавливаем его тип mysqld_db_t.
- /data является каталог, на котором будет выполняться эта команда.
Примечание: Начало изменения контекста из каталога верхнего уровня /data (а не из каталога MySQL), который будет включать в себя каталог MySQL и все подкаталоги и файлы.
Установка SELinux для MySQL на CentOS / RedHat (Вариант 2)
С помощью команды restorecon, вы можете восстановить контекст SELinux к нужному типу. Но, в этом случае, вы должны сообщить SELinux, что является правильным контекстом путем добавления типа mysqld_db_t к карте контекста SELinux.
Чтобы добавить тип SELinux в контексте карты, используйте команду semanage. Установите пакет policycoreutils-python, который содержит команду semanage.
yum -y install policycoreutils-python
Затем выполните следующую команду, чтобы установить SELinux контекст карты на новый каталог.
semanage fcontext -a -t mysqld_db_t "/data(/.*)?"
В приведенной выше команде, мы добавляем mysqld_db_t к контекстной карте для каталога /data и всех подкаталогов и файлов в нем.
И, наконец, используйте команду restorecon, которая восстановит соответствующий контекст SELinux в новый каталог /data.
restorecon -Rv /data
Убедитесь в том, что новый каталог /data переместился и подпапки mysql имеют корректный контекст SELinux.
# ls -Z /data/var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 bd-andreyex -rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ibdata1 -rw-rw----. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 ib_logfile0 ..
Примечание: Вы можете также использовать опцию -e вместе fcontext. Это сделает метку контекста для /data и его подкаталогов в качестве контекста /var/lib/mysql.
semanage fcontext -a -e /var/lib/mysql /data
AppArmor для установки MySQL на Ubuntu / Debian
После перемещения каталога данных MySQL на новое место, если вы не выполните следующие действия, на Ubuntu, вы получите эту ошибку при запуске базы данных:
Изменение файла usr.sbin.mysqld, как показано ниже, и добавьте следующие две строки. Не забудьте запятую в конце строки, которая требуется.
# vi /etc/apparmor.d/usr.sbin.mysqld /data/var/lib/mysql/ r, /data/var/lib/mysql/** rwk,
Затем выполните следующую команду для повторной обработки нового конфигурационного файла AppArmor для MySQL, и перезапустите AppArmor.
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld sudo /etc/init.d/apparmor reload
Примечание: В качестве альтернативы, вы можете также добавить псевдоним в файле псевдонима AppArmor, как показано ниже. Опять же, не забудьте запятую в конце этого псевдонима.
# vi /etc/apparmor.d/tunables/alias alias /var/lib/mysql/ -> /newpath/,
Параметр сокета клиента MySQL
После указанного изменения, вы могли бы получать это сообщение об ошибке при подключении от клиента mysql:
# mysql -u root -pMyPassword ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Если это произойдет, передайте параметр -socket клиенту MySQL, и укажите его в файле mysql.sock, который находится в новом каталоге.
mysql -u root -pMyPassword --socket=/data/var/lib/mysql/mysql.sock
Если вы заходите в клиент MySQL локально, вы можете также использовать опцию -h и передать 127.0.0.1, как показано ниже. Это также позволит избежать появления сообщения об ошибке mysql.sock.
mysql -u root -pMyPassword -h127.0.0.1