ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как переместить каталог данных MySQL на новое место в CentOS и Ubuntu

По умолчанию база данных MySQL будет создана в каталоге /var/lib/mysql.

Это может быть хорошо, если вы работаете в небольшой базе данных, которая не занимает много места. Но на производстве, для увеличения базы данных, вы можете не иметь достаточно места под корневой раздел.

В этом случае, вы можете захотеть перенести базу данных MySQL из корневого раздела в другой раздел.

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

  1. Переместить файлы базы данных MySQL из /var/lib/mysql на другой раздел
  2. Изменить файл my.cnf на новый путь каталога
  3. Обновление параметров безопасности, чтобы отразить изменение каталога: На 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/

 

Несколько моментов, для рассмотрения следующих вопросов:

Кроме того, если вы скопировали каталог (вместо того, чтобы переместить), убедитесь, что вы измените владельца надлежащим образом. Если нет, то вы можете получить следующее сообщение об ошибке:

 

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

 

В приведенной выше команде:

Примечание: Начало изменения контекста из каталога верхнего уровня /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

Как переместить каталог данных MySQL на новое место в CentOS и Ubuntu

Exit mobile version