Объём базы данных увеличивается, и со временем она исчерпывает пространство файловой системы. Кроме того, если ввод и вывод находится на одном разделе с остальной частью операционной системы, возможные конфликты доступа к устройствам ввода/вывода. RAID, сетевые блочные хранилища и другие устройства предоставляют избыточность данных и другие полезные функции. Если вы хотите добавить больше места и оптимизировать производительность, а также воспользоваться другими функциями хранения, этот мануал поможет вам переместить каталог данных MySQL.
Требования
- Сервер Ubuntu 18.04, настроенный по этому мануалу.
- Сервер MySQL (чтобы установить MySQL, следуйте мануалу Установка MySQL в Ubuntu 18.04).
Здесь вы узнаете, как переместить данные в блочное хранилище, смонтированное в mnt/volume-nyc1-01. Это поможет вам переместить каталог данных в новое место независимо от того, какое хранилище вы используете.
1: Перемещение каталога данных MySQL
Чтобы подготовиться к перемещению каталога данных MySQL, нужно уточнить его текущее расположение. Для этого откройте интерактивную сессию MySQL и укажите учётные данные администратора.
mysql -u root -p
В командной строке MySQL запросите каталог данных:
select @@datadir;
+-----------------+
| @@datadir |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)
Этот вывод подтверждает, что в данном случае MySQL использует каталог данных по умолчанию, /var/lib/mysql/. Этот каталог и нужно переместить. Чтобы закрыть командную строку MySQL, введите exit.
Чтобы обеспечить целостность данных, отключите MySQL, прежде чем вносить изменения в каталог данных:
sudo systemctl stop mysql
Утилита systemctl не отображает результаты всех команд управления. Чтобы убедиться в том, что сервер MySQL отключен, введите:
sudo systemctl status mysql
Последняя строка вывода должна сообщать:
. . .
Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.
Теперь, когда сервер MySQL не работает, скопируйте текущий каталог данных в новое место с помощью rsync. Флаг –a сохраняет привилегии и другие свойства каталога. Флаг –v предоставляет подробный вывод.
Примечание: Убедитесь, что в названии каталога нет конечной косой черты (который система может добавить, если вы используете автодополнение). Если такой слеш есть, rsync будет сбрасывать содержимое каталога в точку монтирования, а не в каталог.
sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01
После выполнения rsync переименуйте текущую папку, добавив расширение .bak. Оставьте расширение до тех пор, пока не убедитесь, что данные перемещены успешно. Это поможет не спутать файлы.
sudo mv /var/lib/mysql /var/lib/mysql.bak
2: Настройка нового каталога данных
MySQL предлагает несколько способов отмены значений конфигурации. По умолчанию datadir настроен в /var/lib/mysql в файле /etc/mysql/mysql.conf.d/mysqld.cnf. Откройте этот файл:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Найдите строку datadir= и укажите в ней путь к новому каталогу данных. В данном случае эта строка будет иметь такой вид:
. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .
3: Настройка AppArmor
Теперь нужно настроить AppArmor, чтобы предоставить MySQL право на изменение нового каталога. Для этого нужно создать алиас между стандартным и новым каталогом. Для этого отредактируйте файл alias:
sudo nano /etc/apparmor.d/tunables/alias
В конец файла добавьте правило:
. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .
Перезапустите AppArmor:
sudo systemctl restart apparmor
Примечание: Если вы пропустите настройку AppArmor, вы получите следующую ошибку:
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 будет заканчиваться так:
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, но при этом возникнет новая ошибка. В этот раз причиной ошибки является сценарий 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
. . .
Чтобы пройти проверку и запустить сервер, нужно создать простую структуру каталогов.
sudo mkdir /var/lib/mysql/mysql -p
Попробуйте снова запустить MySQL:
sudo systemctl start mysql
sudo systemctl status mysql
Чтобы убедиться, что новый каталог данных работает, запустите командную строку MySQL:
mysql -u root -p
Снова запросите каталог данных:
+----------------------------+
| @@datadir |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)
Теперь нужно убедиться в том, что база данных полностью функциональна. После проверки целостности данных вы можете удалить резервную копию каталога данных:
sudo rm -Rf /var/lib/mysql.bak
Перезапустите MySQL, чтобы убедиться, что всё работает должным образом:
sudo systemctl restart mysql
sudo systemctl status mysql
Заключение
Теперь вы умеете перемещать каталог данных MySQL и обновлять настройки сервера и модуля AppArmor. В данном мануале мы использовали блочное хранилище, однако эти инструкции подходят для настройки любого устройства независимо от технологии, на которой оно основано.
Больше информации о каталоге данных MySQL можно найти в документации.