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

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


Введение

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

Предпосылки

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

  • Сервер Ubuntu 16.04 с пользователем без полномочий root с привилегиями sudo. Вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководстве Initial Server Setup with Ubuntu 16.04.
  • Сервер MySQL. Если вы еще не установили MySQL, вам может помочь руководство How To Install MySQL on Ubuntu 16.04.

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

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

Шаг 1 — Перемещение каталога данных MySQL

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

  1. mysql -u root -p

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

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

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

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

  1. sudo systemctl stop mysql

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

  1. sudo systemctl status mysql

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

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

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

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

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

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

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

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

Шаг 2 — Указание на новое местоположение данных

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

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

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

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

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

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

Шаг 3 — Настройка правил контроля доступа AppArmor

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

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

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

. . .
[label /etc/apparmor.d/tunables/alias]
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .

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

  1. sudo systemctl restart apparmor

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

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

Вывод как systemctl, так и journalctl завершается следующим образом:

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

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

Шаг 4 — Перезапуск MySQL

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

. . .
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

. . .

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

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

Теперь мы готовы запустить MySQL.

  1. sudo systemctl start mysql
  2. sudo systemctl status mysql

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

  1. mysql -u root -p

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

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

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

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

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

  1. sudo systemctl restart mysql
  2. sudo systemctl status mysql

Заключение

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

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

  • Каталог данных Mysql
  • Настройка нескольких каталогов данных