Последние новости:

Поиск по сайту:

Человек чувствует свой долг лишь в том случае, если он свободен (А. Бергсон).

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

10.01.2017
Как переместить каталог данных 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/

 

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

  • Вы также можете переместить каталог MySQL в каталог /data/var/lib, а также создать символическую ссылку из /var/lib, указывающей на /data/var/lib. Но, в данном конкретном случае, я предпочитаю, простой перенос каталога без символической ссылки, чтобы избежать путаницы.
  • Если возможно, попробуйте использовать команду move, чтобы переместить каталог (вместо копии). При выполнении копии, контекст SELinux будут потерян, и вы должны вручную установить ее позже (как описано ниже). Но, когда вы перемещаете, соответствующий SELinux контекст для MySQL хранятся, и вам не придется беспокоиться об изменении его.

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

MySQL error: 1017Can’t find file: (errno: 13).

 

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, вы получите эту ошибку при запуске базы данных:

“(errno: 13)” (permission denied).

Изменение файла 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:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

 

# 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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
владимир

описано всё верно. но не стартует. даже при chmod 777 на новый каталог пишет, что у него нет прав на фалы. первый раз такая херня за 20 лет карьеры. и ты хоть убейся.

Читайте также

Статьи партнеров:

1
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить

Спасибо! Ваша заявка принята

close

Спасибо! Ваша заявка принята

close