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

Вступление

Базы данных со временем растут, иногда перерастая пространство в файловой системе. Вы также можете столкнуться с конфликтами ввода-вывода, если они расположены в том же разделе, что и остальная часть операционной системы. RAID, сетевое хранилище и другие устройства могут обеспечивать избыточность и другие желательные функции. Независимо от того, добавляете ли вы больше места, оцените способы оптимизации производительности или хотите воспользоваться другими функциями хранения, это руководство поможет вам переместить каталог данных MySQL.

Предпосылки

Для завершения этого руководства вам понадобится:

  • An Ubuntu 16.04 server with a non-root user with sudo privileges. Вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководствеInitial Server Setup with Ubuntu 16.04.

  • A MySQL server. Если вы еще не установили MySQL, вам может помочь руководствоHow To Install MySQL on Ubuntu 16.04.

В этом примере мы перемещаем данные на блочное устройство хранения, установленное в/mnt/volume-nyc1-01. Вы можете узнать, как настроить его, в руководствеHow To Use Block Storage on DigitalOcean.

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

[[step-1 -—- moving-the-mysql-data-directory]] == Шаг 1. Перемещение каталога данных MySQL

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

mysql -u root -p

При появлении запроса укажите пароль root для MySQL. Затем в командной строке MySQL выберите каталог данных:

select @@datadir;
Output+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

Эти выходные данные подтверждают, что MySQL настроен на использование каталога данных по умолчанию,/var/lib/mysql/,, так что это каталог, который нам нужно переместить. Убедившись в этом, введитеexit, чтобы покинуть монитор.

Чтобы обеспечить целостность данных, мы отключим MySQL, прежде чем мы действительно внесем изменения в каталог данных:

sudo systemctl stop mysql

systemctl не отображает результат выполнения всех команд управления службами, поэтому, если вы хотите быть уверены, что у вас все получилось, используйте следующую команду:

sudo systemctl status mysql

Вы можете быть уверены, что он выключен, если в последней строке вывода указано, что сервер остановлен:

Output. . .
Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.

Теперь, когда сервер выключен, мы скопируем существующий каталог базы данных в новое место с помощьюrsync. Использование флага-a сохраняет разрешения и другие свойства каталога, а `-v` предоставляет подробный вывод, чтобы вы могли следить за прогрессом.

[.note] #Note: Убедитесь, что в каталоге нет завершающей косой черты, которая может быть добавлена, если вы используете завершение табуляции. Когда стоит косая черта в конце,rsync будет сбрасывать содержимое каталога в точку монтирования вместо того, чтобы передавать его в содержащий каталогmysql:
#

sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

После завершенияrsync переименуйте текущую папку с расширением .bak и сохраните ее, пока мы не подтвердим, что перемещение было успешным. Переименовывая его, мы избежим путаницы, которая может возникнуть в файлах как в новом, так и в старом месте:

sudo mv /var/lib/mysql /var/lib/mysql.bak

Теперь мы готовы обратить наше внимание на конфигурацию.

[[step-2 -—-cting-to-the-new-data-location]] == Шаг 2 - Указание на новое местоположение данных

MySQL имеет несколько способов переопределить значения конфигурации. По умолчанию дляdatadir установлено значение/var/lib/mysql в файле/etc/mysql/mysql.conf.d/mysqld.cnf. Отредактируйте этот файл, чтобы отразить новый каталог данных:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Найдите линию, которая начинается сdatadir=, и измените путь, который следует за ней, чтобы отразить новое местоположение.

В нашем случае обновленный файл выглядит примерно так:

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .

Кажется, сейчас самое время снова запустить MySQL, но есть еще одна вещь, которую нужно настроить, прежде чем мы сможем сделать это успешно.

[[step-3 -—- configuring-apparmor-access-control-rules]] == Шаг 3. Настройка правил контроля доступа AppArmor

Нам нужно указать AppArmor, чтобы MySQL записывал в новый каталог, создавая псевдоним между каталогом по умолчанию и новым местоположением. Для этого отредактируйте файл AppArmoralias:

sudo nano /etc/apparmor.d/tunables/alias

Внизу файла добавьте следующее правило псевдонима:

/etc/apparmor.d/tunables/alias

. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .

Чтобы изменения вступили в силу, перезапустите AppArmor:

sudo systemctl restart apparmor

[.Примечание]##

Note: Если вы пропустили шаг настройки AppArmor, вы бы столкнулись со следующим сообщением об ошибке:

OutputJob for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.

Выходные данные какsystemctl, так иjournalctl завершаются:

OutputJul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]:
mysql.service: Main process exited, code=exited, status=1/FAILURE

Поскольку сообщения не устанавливают явную связь между AppArmor и каталогом данных, на выяснение этой ошибки может потребоваться некоторое время.

[[step-4 -—- restarting-mysql]] == Шаг 4. Перезапуск MySQL

Следующим шагом будет запуск MySQL, но если вы это сделаете, вы столкнетесь с другой ошибкой. На этот раз вместо проблемы AppArmor ошибка возникает из-за того, что скриптmysql-systemd-start проверяет наличие либо каталога-d, либо символической ссылки-L, которая соответствует двум значениям по умолчанию. пути. Не удается, если они не найдены:

/usr/share/mysql/mysql-systemd-start

. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
 exit 1
fi

if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
 echo "MySQL system database not found. Please run mysql_install_db tool."
 exit 1
fi

. . .

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

sudo mkdir /var/lib/mysql/mysql -p

Now, мы готовы запустить MySQL.

sudo systemctl start mysql
sudo systemctl status mysql

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

mysql -u root -p

Посмотрите на значение для каталога данных еще раз:

Output+----------------------------+
| @@datadir                  |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)

Теперь, когда вы перезапустили MySQL и подтвердили, что он использует новое местоположение, воспользуйтесь возможностью, чтобы убедиться, что ваша база данных полностью работоспособна. После проверки целостности любых существующих данных вы можете удалить каталог резервных данных:

sudo rm -Rf /var/lib/mysql.bak

Перезапустите MySQL в последний раз, чтобы убедиться, что он работает должным образом:

sudo systemctl restart mysql
sudo systemctl status mysql

Заключение

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

Подробнее об управлении каталогами данных MySQL см. В следующих разделах официальной документации MySQL:

Related