Я использую CentOS с cPanel. На моем сервере все базы данных MySQL сохраняются в /var/lib/mysql
. Сейчас /var
заполнен на 100%, и MySQL перестал работать. Как переместить базы данных в новый каталог, например /home/mysql
особенно учитывая, что этим сервером управляет cPanel?
Я не могу подтвердить это из cpanel, так как у меня нет доступа, но это пример консоли, подключенной с помощью ssh и sudo к root. Есть аргументы в пользу использования записи привязки в / etc / fstab вместо символической ссылки, но у меня это работает.
Моя обычная процедура - остановить mysql, переместить содержимое каталога, связать оригинал и перезапустить mysqld.
[tomh@workstation001 ~]$ sudo su -
[root@workstation001 ~]#
[root@workstation001 ~]# service mysqld stop
Stopping mysqld (via systemctl):
[ OK ]
[root@workstation001 ~]# mv /var/lib/mysql/ /opt/
[root@workstation001 ~]# ln -s /opt/mysql /var/lib/
[root@workstation001 ~]# ls -la /var/lib/mysql
lrwxrwxrwx 1 root root 10 Feb 26 23:02 /var/lib/mysql -> /opt/mysql
[root@workstation001 ~]# service mysqld start
Starting mysqld (via systemctl): [ OK ]
[root@workstation001 ~]# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.18-log MySQL Community Server (GPL)
mysql> show databases;
...
| Database |
+-----------------------+
| information_schema |
| mysql |
| performance_schema |
| test
Я только что заметил похожий вопрос, который похож на дубликат, в котором упоминаются некоторые проблемы, связанные с выполнением этого выше при включенном selinux; http://crashmag.net/change-the-default-mysql-data-directory-with-selinux-enabled
Итак, если у вас есть selinux, вам нужно сделать несколько дополнительных шагов.
если вы хотите изменить mysql
каталог данных, вы должны отредактировать файл конфигурации mysql и изменить datadir
стоимость.
datadir = /home/user/data
Ваш новый каталог данных ДОЛЖЕН принадлежать mysql
и имеет надлежащий контекст безопасности.
chown -R mysql.mysql /home/user/data
chcon -R -t mysqld_db_t /home/user/data
перезапустить сервер mysql
/etc/init.d/mysqld restart
я нашел этот пошаговое руководство работает для меня.
Вы должны установить:
yum install policycoreutils-python
Руководство:
Просмотрите контекст SELinux расположения базы данных по умолчанию для mysql:
~]# ls -lZ /var/lib/mysql
drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
Это показывает mysqld_db_t
который является элементом контекста по умолчанию для расположения файлов базы данных. Этот контекст необходимо вручную применить к новому расположению базы данных, которое будет использоваться в этом примере, чтобы оно работало правильно.
Остановите демон mysqld:
~]# systemctl stop mariadb.service
Создайте новый каталог для нового местоположения баз данных. В этом примере используется / mysql /:
~]# mkdir -p /mysql
Скопируйте файлы базы данных из старого места в новое:
~]# cp -R /var/lib/mysql/* /mysql/
Измените владельца этого местоположения, чтобы разрешить доступ пользователю и группе mysql. Это устанавливает традиционные разрешения Unix, которые SELinux будет по-прежнему соблюдать:
~]# chown -R mysql:mysql /mysql
Выполните следующую команду, чтобы увидеть начальный контекст нового каталога:
~]# ls -lZ /mysql
drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
Контекст usr_t этого вновь созданного каталога в настоящее время не подходит для SELinux в качестве местоположения файлов базы данных MariaDB. После изменения контекста MariaDB сможет правильно работать в этой области.
Откройте основной файл конфигурации MariaDB /etc/my.cnf
в текстовом редакторе и измените datadir
вариант, чтобы он относился к новому местоположению. В этом примере необходимо ввести значение /mysql
:
[mysqld]
datadir=/mysql
Сохраните этот файл и выйдите.
Начало mysqld
. Служба должна не запуститься, и сообщение об отказе будет зарегистрировано в /var/log/messages
файл:
~]# systemctl start mariadb.service
Job for mariadb.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
Однако, если демон аудита запущен и вместе с ним setroubleshoot
сервис, отказ будет зарегистрирован в /var/log/audit/audit.log
файл вместо этого:
SELinux is preventing `/usr/libexec/mysqld` "write" access on /mysql. For complete SELinux messages. run `sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71`
Причина этого отрицания в том, что mysql неправильно помечен для файлов данных MariaDB. SELinux не позволяет MariaDB иметь доступ к контенту, помеченному как usr_t
. Выполните следующие шаги, чтобы решить эту проблему:
Выполните следующую команду, чтобы добавить сопоставление контекста для mysql. Обратите внимание, что semanageutility
по умолчанию не устанавливается. Если он отсутствует в вашей системе, установите policycoreutils-python
пакет.
~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
Это отображение записывается в /etc/selinux/targeted/contexts/files/file_contexts.local
файл:
~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
/mysql(/.*)? system_u:object_r:mysqld_db_t:s0
Теперь используйте restorecon
утилита для применения этого отображения контекста к работающей системе:
~]# restorecon -R -v /mysql
Теперь, когда mysql location помечен правильным контекстом для MariaDB, mysqld запускается:
~]# systemctl start mariadb.service
Подтвердите, что контекст изменился для mysql:
~]$ ls -lZ /mysql
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
Местоположение было изменено и помечено, и mysqld
успешно начался. На этом этапе все запущенные службы должны быть протестированы, чтобы подтвердить нормальную работу.
Остановка установки / экземпляра по умолчанию
service mysqld stop
Очистить текущую конфигурацию
rm /etc/my.cnf
Деинсталлируйте установку / экземпляр по умолчанию
yum remove mysql mysql-server -y
Очистить текущий датадир
test -d /var/lib/mysql/ && rm -rf /var/lib/mysql/
Очистить «Новый» датадир
test -d /mysql/mysql/ && rm -rf /mysql/mysql/
Установите его снова
yum install mysql mysql-server -y
Проверить статус услуги
service mysqld status
Запустите его - просто чтобы создать первую / стандартную структуру
service mysqld start
Проверить статус услуги
service mysqld status
Прервать текущую установку сервера MySQL
service mysqld stop
Убедитесь, что у вас больше не запущен экземпляр / служба
ps axu | grep mysql
Переместите каталог данных mysql в раздел '/ mysql' и создайте символическую ссылку
test -d /var/lib/mysql/ && mv /var/lib/mysql/ /mysql/ && ln -s /mysql/mysql /var/lib/
Проверить символическую ссылку и реальный путь
ls -lrth /var/lib/ | grep mysql
Установить разрешение на новый датадир
chown -R mysql:mysql /mysql/mysql
Начни это
service mysqld start
Попробуйте подключиться (имейте в виду, что установка MySQL по умолчанию не устанавливает pwd для пользователя root, и тогда вам следует подключиться с помощью «пустого пароля»
mysql -u root -p --host 127.0.0.1
После подключения к MySQL создайте новую базу данных, чтобы проверить, работает ли она и где MySQL будет создавать структуру папок / файлов.
create database DBTesteNew;
exit
Проверьте, находится ли новая база данных в 'новом каталоге данных'
ls /mysql/mysql
Убедитесь, что mysqld настроен на запуск во время загрузки
chkconfig mysqld on
начать сначала
reboot