По умолчанию база данных MySQL будет создана в каталоге /var/lib/mysql.
Это может быть хорошо, если вы работаете в небольшой базе данных, которая не занимает много места. Но на производстве, для увеличения базы данных, вы можете не иметь достаточно места под корневой раздел.
В этом случае, вы можете захотеть перенести базу данных MySQL из корневого раздела в другой раздел.
Чтобы изменить каталог MySQL, вы должны выполнить следующие три шага:
Это руководство объясняет подробности о том, как выполнить вышеуказанные три шага, чтобы переместить данные MySQL в другую папку.
Перед тем, как сделать что-нибудь, остановите базу данных MySQL и сделайте полную резервную копию базы данных.
По умолчанию в MySQL база данных будет в каталоге /var/lib/mysql. Скопируйте этот каталог MySQL в другое место в качестве резервного копирования.
service mysqld stop cp -r /var/lib/mysql /backup/mysql
Или, если вы предпочитаете, вы можете использовать mysqldump чтобы сделать резервную копию БД 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/
Несколько моментов, для рассмотрения следующих вопросов:
Кроме того, если вы скопировали каталог (вместо того, чтобы переместить), убедитесь, что вы измените владельца надлежащим образом. Если нет, то вы можете получить следующее сообщение об ошибке:
chown -R mysql:mysql /data
В файле /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), как описано далее.
Используйте команду 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
С помощью команды chcon, вы можете изменить тип контекста SELinux в новом каталоге, как показано ниже.
chcon -R -t mysqld_db_t /data
В приведенной выше команде:
Примечание: Начало изменения контекста из каталога верхнего уровня /data (а не из каталога MySQL), который будет включать в себя каталог MySQL и все подкаталоги и файлы.
С помощью команды 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
После перемещения каталога данных 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 -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
описано всё верно. но не стартует. даже при chmod 777 на новый каталог пишет, что у него нет прав на фалы. первый раз такая херня за 20 лет карьеры. и ты хоть убейся.