Если у вас закончился свободный объём на системном диске Ubuntu, а сервер MySQL продолжает накапливать данные — пора действовать. Папку, где MySQL хранит информацию, можно перенести на другой, более вместительный диск.
Каталог 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
Обратите внимание на раздел, где размещена база данных. При необходимости удалите временные файлы, старые логи или перенесите данные на другой диск.
Читайте в блоге:
- Миграция баз данных PostgreSQL при обновлении на Ubuntu 24.04
- Настройка заданий cron и systemd-таймеров для автоматизации рутинных задач на Ubuntu 24.04
- Основы работы с nftables на Ubuntu 24.04