Как перенести каталог данных MySQL на другой диск в Ubuntu 24.04

Как перенести каталог данных MySQL на другой диск в Ubuntu 24.04

Если у вас закончился свободный объём на системном диске Ubuntu, а сервер MySQL продолжает накапливать данные — пора действовать. Папку, где MySQL хранит информацию, можно перенести на другой, более вместительный диск.

Аренда VPS/VDS — от ₽219/месяц

Почему выбирают VPS от AdminVPS:

✓ Дешевле физического сервера

✓ Более гибкий и мощный, чем обычный хостинг

✓ Бесплатная защита от DDoS и техподдержка 24/7

✓ Масштабируется под любые задачи

Виртуальный сервер VPS/VDS — ваш личный сервер для сайтов, магазинов, ботов и других проектов.

popup12

Каталог MySQL

Это раздел, где хранится вся ваша информация. По умолчанию она находится в:

/var/lib/mysql

Если места становится мало, сервер может перестать работать. Чтобы избежать проблем, нужен перенос на другой диск, например, в /mnt/newdrive/mysql.

Понадобится:

  • Ubuntu 24.04 (на сервере или локальной машине);
  • установленный MySQL (обычно mysql-server);
  • права администратора (root или sudo);
  • второй диск или раздел с нужным объёмом;

Проверим текущий путь хранения информации

Откройте терминал и введите:

mysql -u root -p

Дальше пароль. После входа выполните:

SHOW VARIABLES LIKE 'datadir';

Вы увидите что-то вроде:

+---------------+-----------------+
| Variable_name | Value|
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+

Это значит, что данные хранятся в /var/lib/mysql.

Выходим из MySQL ― exit;

Остановим MySQL перед копированием

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

sudo systemctl stop mysql

Проверим, действительно ли MySQL завершил работу:

sudo systemctl status mysql

В статусе должно отображаться inactive (dead) или inactive (stopped).

Скопируем каталог на другой диск

Допустим, дополнительный диск уже подключён и доступен по пути /mnt/newdrive. Откройте терминал и создайте на нём файл для хранения информации:

sudo mkdir -p /mnt/newdrive/mysql

Скопируем содержимое текущего каталога MySQL на новый диск:

sudo rsync -av /var/lib/mysql/ /mnt/newdrive/mysql

Что делает эта команда:

  • rsync — утилита для надёжного копирования;
  • -a — сохраняет структуру, права доступа и владельцев;
  • -v — включает вывод копируемых файлов;
  • слеш в конце пути /var/lib/mysql/ означает: копировать содержимое, а не саму папку целиком.

Проверим, что всё скопировалось.

В том же окне переходим в новую директорию:

cd /mnt/newdrive/mysql

Смотрим, что внутри:

ls -lh

На месте должны быть ibdata1 и ibtmp1, а также каталоги с названиями ваших баз данных.

Проверяем владельца и права

Важно проверить доступность файла и содержания:

ls -l /mnt/newdrive/mysql

Пользователю mysql должны быть доступны чтение, запись и доступ. 

Слишком строгие настройки поменяйте командой:

sudo chmod -R 750 /mnt/newdrive/mysql

Это означает:

  • владелец (mysql) может читать, писать и заходить в папку;
  • члены группы могут читать и заходить.

После этих действий MySQL будет работать.

Меняем маршрут или как MySQL узнает о переносе

Открываем в терминале основной конфигурационный файл сервера:

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

Ищем строчку:

datadir = /var/lib/mysql

Заменяем на:

datadir = /mnt/newdrive/mysql

Сохраняем файл и выходим (Ctrl+O → Enter → Ctrl+X).

Обновим путь в AppArmor

В Ubuntu 24.04 работает система безопасности AppArmor. Она ограничивает доступ приложений к файлам: каждое может обращаться только к тем путям, которые указаны в его профиле. MySQL — не исключение.

Если не указать новый путь к базе данных, AppArmor просто заблокирует доступ. В результате MySQL не сможет запуститься.

Перед переносом данных нужно открыть доступ к новому хранилищу.

Проверьте, что на сервере активен профиль:

/etc/apparmor.d/usr.sbin.mysqld

Откройте его:

sudo nano /etc/apparmor.d/usr.sbin.mysqld

В файле должны быть строки, начинающиеся с:

/var/lib/mysql/...

Рядом с ними добавьте аналогичные строки, только с новым путём — тем, куда вы перенесли базу данных. Например, если новая папка — /mnt/newdrive/mysql, добавьте:

/mnt/newdrive/mysql/ r,
/mnt/newdrive/mysql/** rwk,

Эти строки разрешают MySQL читать директорию и работать со всеми файлами внутри (чтение, запись, блокировка).

Подключите абстракцию MySQL (если не подключена).

В этом же файле (/etc/apparmor.d/usr.sbin.mysqld) должна быть строка:

#include <abstractions/mysql>

Если её нет — добавьте вручную в любом месте, например в конце файла.

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

Проверьте наличие файла abstractions/mysql.

AppArmor должен подгружать дополнительные правила из файла:

/etc/apparmor.d/abstractions/mysql

Если файла нет, создайте:

sudo nano /etc/apparmor.d/abstractions/mysql

Добавьте в него минимум:

# Abstraction for MySQL/MariaDB AppArmor profiles

/usr/sbin/mysqld mr,
/usr/libexec/mysqld mr,
/usr/share/mysql/** r,
/etc/mysql/** r,

Эти правила позволяют MySQL обращаться к своим исполняемым файлам, конфигурации и шаблонам.

После всех изменений нужно перезагрузить AppArmor:

sudo systemctl reload apparmor

На всякий случай сделайте резервную копию старого каталога базы данных:

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

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

Создадим символическую ссылку

Некоторые компоненты Ubuntu могут по-прежнему обращаться к старому пути /var/lib/mysql, даже если база уже перенесена. Чтобы не менять настройки во всех сервисах, создадим символическую ссылку — она будет «перенаправлять» обращения к старому пути на новый.

В терминале выполните:

sudo ln -s /mnt/newdrive/mysql /var/lib/mysql

Теперь всё, что будет обращаться к /var/lib/mysql, на самом деле попадёт в /mnt/newdrive/mysql.

Запускаем MySQL

Теперь можно попробовать запустить MySQL. Откройте терминал (или продолжайте в нём работать) и введите:

sudo systemctl start mysql

Затем проверьте, успешно ли сервер запустился:

sudo systemctl status mysql

Если всё настроено правильно, в выводе появится строка active (running) — это значит, что MySQL работает.

Проверим работоспособность

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

mysql -u root -p

После этого система попросит ввести пароль от пользователя root.

Когда вы окажетесь в командной строке MySQL, наберите запрос:

SHOW DATABASES;

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

Если решили удалить старую копию, сначала убедитесь, что система работает стабильно хотя бы несколько дней. Только после этого в терминале удалите её командой:

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

Что бывает не так и в чём причины

Если MySQL не запускается, первым делом проверьте журнал ошибок. В терминале введите:

sudo journalctl -xeu mysql

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

На основе этих сообщений можно понять, что именно мешает запуску и что исправить. 

Ошибка доступа. Проблема в правах (chown) или в AppArmor.

Если в журнале ошибок видны сообщения об отказе в доступе (например, «Permission denied»), это значит, что MySQL не может прочитать или записать файлы в папке с базой данных. В таком случае нужно правильно настроить владельца и доступ.

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

В терминале выполните:

ls -l /var/lib/mysql

В итоге вы должны увидеть, что /var/lib/mysql — это ссылка на новую папку, например:

lrwxrwxrwx 1 root root 20 июл 16 12:00 /var/lib/mysql -> /mnt/newdrive/mysql

Если путь указан неверно, удалите ссылку:

sudo rm /var/lib/mysql

И создайте заново, указав правильный:

sudo ln -s /mnt/newdrive/mysql /var/lib/mysql

После этого перезапустите MySQL:

sudo systemctl restart mysql

AppArmor блокирует запуск.

Скорее всего, доступ в новое хранилище ограничен. Убедитесь, что в профиле /etc/apparmor.d/usr.sbin.mysqld добавлены строки с разрешением на чтение и запись из нужного каталога. После внесения изменений не забудьте перезагрузить AppArmor:

sudo systemctl reload apparmor

Заканчивается место на диске.

Проверьте доступное пространство:

df -h

Обратите внимание на раздел, где размещена база данных. При необходимости удалите временные файлы, старые логи или перенесите данные на другой диск.

Читайте в блоге:

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

Нужен VPS сервер?

Арендуйте мощный VPS сервер для ваших проектов! Быстрая настройка, высокая производительность и надежная поддержка 24/7. Начните прямо сейчас!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях