Место где MySQL держит все данные называется datadir. По умолчанию это /var/lib/mysql. Но это значение можно переопределить, оно могло быть изменено при установке, или несколько конфигов конфликтуют между собой. Прежде чем что-то трогать — убедиться где данные лежат на самом деле.
Три способа узнать реальный datadir
Самый быстрый — спросить у работающего сервера через SQL:
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
Это значение которое реально используется прямо сейчас — не то что написано в конфиге, а то что применилось после последнего запуска.
Найти через конфигурационный файл:
sudo grep -R 'datadir' /etc/mysql/
/etc/mysql/mysql.conf.d/mysqld.cnf:datadir = /var/lib/mysql
Узнать через бинарник — полезно когда конфигов несколько и непонятно какой главный:
mysqld --verbose --help | grep ^datadir
Что находится внутри datadir
Войти в директорию нужно от root — файлы принадлежат пользователю mysql и без привилегий будет ошибка:
sudo su
cd /var/lib/mysql
ls -l

Содержимое директории: каждая база данных — отдельная папка с именем базы. ibdata1 — системное табличное пространство InnoDB. ib_logfile0 и ib_logfile1 — журналы транзакций. binlog.* — бинарные логи при включённой репликации. auto.cnf — UUID сервера. mysql.ibd — системная база в MySQL 8.0+.
Открыть и изменить конфиг

Открыть конфигурационный файл:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
В блоке [mysqld] найти строку datadir и прописать новый путь.
Перенести данные на другой диск
На VPS системный раздел заканчивается — данные нужно переместить на дополнительный том. Порядок строгий: сначала остановить сервер, потом копировать.
Остановить MySQL:
sudo systemctl stop mysql
Создать новую директорию:
sudo mkdir -p /mnt/data/mysql
Скопировать данные с сохранением прав и атрибутов:
sudo rsync -av /var/lib/mysql/ /mnt/data/mysql/
Убедиться что всё скопировалось:
sudo ls -la /mnt/data/mysql/ | head -10
Установить правильного владельца:
sudo chown -R mysql:mysql /mnt/data/mysql
Выставить права на директорию:
sudo chmod 750 /mnt/data/mysql
Открыть конфиг и изменить datadir:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
datadir = /mnt/data/mysql
Обновить AppArmor
Это шаг который забывают — и MySQL не стартует после переноса с непонятной ошибкой. AppArmor контролирует к каким путям имеет доступ mysqld. О старом пути он знает, о новом — нет.
Открыть профиль:
sudo nano /etc/apparmor.d/usr.sbin.mysqld
Найти блок с /var/lib/mysql и добавить рядом строки для нового пути:
/mnt/data/mysql/ r,
/mnt/data/mysql/** rwk,
Перезагрузить AppArmor:
sudo systemctl restart apparmor
Теперь запустить MySQL:
sudo systemctl start mysql
Проверить что сервер читает новый путь:
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
Посмотреть сколько места занимают базы
По файловой системе — быстро:
sudo du -sh /var/lib/mysql/*/
Через SQL — точнее, учитывает индексы отдельно:
mysql -u root -p -e "SELECT table_schema AS 'Database', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'MB' FROM information_schema.tables GROUP BY table_schema ORDER BY 2 DESC;"
Шпаргалка
| Задача | Команда |
|---|---|
| Реальный datadir (из SQL) | mysql -e "SHOW VARIABLES LIKE 'datadir';" |
| datadir из конфига | sudo grep -R 'datadir' /etc/mysql/ |
| datadir из бинарника | mysqld --verbose --help | grep ^datadir |
| Открыть конфиг | sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf |
| Остановить MySQL | sudo systemctl stop mysql |
| Запустить MySQL | sudo systemctl start mysql |
| Скопировать datadir | sudo rsync -av /var/lib/mysql/ /новый/путь/ |
| Установить владельца | sudo chown -R mysql:mysql /путь/ |
| Размер баз | sudo du -sh /var/lib/mysql/*/ |