PQ
PQ.Hosting

Валюта

Где MySQL хранит файлы баз данных и как их найти

Автор
PQ
19 марта 2026
3 мин чтения
78 просмотров
Где MySQL хранит файлы баз данных и как их найти

Место где 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/*/

 

Поделиться статьей

Похожие статьи