Обновлено: 20.07.2020
Опубликовано: 12.07.2018
Тематические термины: MySQL, MariaDB, Linux.
В статье пойдет речь о просмотре и смене пути расположения файлов баз данных MySQL. Приведенные примеры выполнены на CentOS 7 — также они будут работать на Ubuntu и многих других дистрибутивах Linux, FreeBSD и Windows.
Просмотр путей
Командная строка
Оболочка MySQL
phpMyAdmin
Смена расположения баз
Смотрите также
Посмотреть текущий путь
Увидеть, где хранятся базы можно несколькими способами.
Способ 1. Командная строка Linux.
В командной строке вводим:
systemctl status mysql || systemctl status mariadb
* для Windows используем оснастку Службы. Для FreeBSD используем команду service mysql-server stop.
Пример ответа:
mariadb.service — MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Ср 2018-07-11 15:38:16 MSK; 23h ago
Process: 1067 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
Process: 992 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
Main PID: 1066 (mysqld_safe)
CGroup: /system.slice/mariadb.service
??1066 /bin/sh /usr/bin/mysqld_safe —basedir=/usr
??1248 /usr/libexec/mysqld —basedir=/usr —datadir=/var/lib/mysql —plugin-dir=/usr/lib64/mysql/plugin —log-error=/var/log/mariadb/mariadb.log —pid-file=/var/run/mariadb/mariadb.pid —socket…
* в выделенном фрагменте /var/lib/mysql — путь до файлов базы данных.
Способ 2. Командная оболочка MySQL.
Данный способ является более универсальным — он подойдет для любого дистрибутива Linux, FreeBSD, Windows. Также, метод универсален с точки зрения метода установки MySQL — чистая установка или в составе готовой сборки (Open Server, Xampp, Denwer …).
Заходим под пользователем root в командную оболочку СУБД:
mysql -uroot -p
Вводим:
> SHOW VARIABLES WHERE Variable_Name LIKE «datadir»;
или
> select @@datadir;
Пример ответа:
+—————+——————+
| Variable_name | Value |
+—————+——————+
| datadir | /var/lib/mysql/ |
+—————+——————+
Способ 3. Через phpMyAdmin.
Если у нас нет доступа к серверу по SSH или удаленному рабочему столу, запрос можно сделать в phpMyAdmin:
Смена пути
Останавливаем сервер баз данных:
systemctl stop mysql || systemctl stop mariadb
Создаем новый каталог, например:
mkdir /home/mysql
Переносим содержимое старого каталога в новый:
mv /var/lib/mysql/* /home/mysql/
Задаем права и владельца для нового каталога:
chown mysql:mysql /home/mysql
chmod 755 /home/mysql
Открываем конфигурационный файл my.cnf:
vi /etc/my.cnf.d/server.cnf
* в разных версиях mysql и mariadb могут использоваться разные пути:
- /etc/my.cnf.
- /etc/my.cnf.d/server.cnf.
- /etc/my.cnf.d/mariadb-server.cnf.
- В Windows это my.ini.
и задаем новый путь:
[mysqld]
datadir = /home/mysql
Запускаем сервер:
systemctl start mysql || systemctl start mariadb
Смотрите также
Установка MariaDB на CentOS 7
Как восстановить базу MySQL
Создание и удаление баз в MySQL/MariaDB
Экспорт баз данных MariaDB/MySQL в phpMyAdmin
Была ли полезна вам эта инструкция?
Да Нет
I could successfully alter the data directory of MySQL or MariaDB, and resolve all related issues on Fedora 30. I think the following steps will work on other distributions.
Note: Users of Debian-based
distributions like Ubuntu
should search how to disable and edit AppArmor
and then follow the following steps.
Disabling SELinux
First of all, let me mention that RedHat-based Linux Distributions (RHELs) like Fedora, CentOS, etc. use SELinux that enforces mandatory access control policies. So it’s better to disable
it during the following steps and later enable it with some tweaks.
Open the SELinux configuration file
nano /etc/selinux/config
Locate the line that contains SELINUX=enforcing
and change its value to SELINUX=disabled
, save the file and reboot your system.
Changing the datadir of MySQL
Stop the MySQL services
systemctl stop mysqld.service
Make a new directory for MySQl’s data directory. Due to some reasons which are out of the scope of this solution, it’s highly recommended to not create a data directory under the /home
directory, but maybe some of you like me prefer it (it costs more steps).
mkdir /home/eloy/applications/mysql-datadir/
Set ownership and permissions of the new directory to the default MySQL’s data directory(/var/lib/mysql
):
chown --reference=/var/lib/mysql /home/eloy/applications/mysql-datadir/
chmod --reference=/var/lib/mysql /home/eloy/applications/mysql-datadir/
Copy all files from the default directory to the new one
cp -rp /var/lib/mysql/* /home/eloy/applications/mysql-datadir/
Edit the /etc/my.cnf
file, add add the following line under [mysqld]
section:
[mysqld]
datadir=/home/eloy/applications/mysql-datadir/
Now you can start your MySQL service via the following command
systemctl start mysqld.service
But if the data directory is created under /home
, MySQL won’t start and you would see the following errors and warnings after journalctl -xe
:
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [Warning] Could not increase number of max_open_files to more than 16384 (request: 32190)
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [Warning] Can't create test file /home/eloy/applications/mysql-datadir/eloy-fedora-laptop.lower->
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: [113B blob data]
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [ERROR] Aborting
Resolving /home
issues
Make sure that all the parent directories of the new datadir
upwards have x
(execute) permissions for all (user, group, and other). I prefer to not use a recursive script so:
chmod +x /home/eloy/applications/mysql-datadir
chmod +x /home/eloy/applications
chmod +x /home/eloy/
chmod +x /home
As it is mentioned creating datadir under /home
directory is tricky because by default MySQL does not allow it. Create a file under /etc/systemd/system/mariadb.service.d and put the following lines in:
#open an editor to create a file
nano /etc/systemd/system/mariadb.service.d/centreon.conf
copy the following lines to the new centreon.conf
file and save it
[Service]
ProtectHome=false
#ProtectSystem=off
Apply the changes by running the following command
systemctl daemon-reload
Now you can run the MySQL service:
systemctl start mysqld.service
Enabling SELinux
Again edit the /etc/selinux/config
file, and change the line of SELINUX=disabled
to SELINUX=enforcing
. Save the file and reboot your system.
To query the current status of SELinux use the following commands, it should print enforcing
as an output.
getenforce
the SELinux context
uses mysqld_db_t
and if it is not set correctly mysqld
process will be aborted, so you need to update it:
semanage fcontext -a -t mysqld_db_t "/home/eloy/applications/mysql-datadir(/.*)?"
restorecon -Rv /home/eloy/applications/mysql-datadir
Now you can run MySQL.
Cheers
База данных MySQL 8 при установке на Ubuntu по умолчанию пишется в папку /var/lib/mysql. Со временем база растёт и поднимается вопрос переноса её на другой раздел диска. Перенесём базу данных в /u01/mysql/mysql.
Требования
- ОС Ubuntu 18.04 LTS. Или Ubuntu 16.04.
- Работаем из-под root.
- Сервер MySQL 8
Подготовка
Проверим где находится текущая БД MySQL.
mysql -u root -p
select @@datadir;
Видим, что файлы базы находятся в /var/lib/mysql/. Чтобы закрыть командную строку MySQL, введите exit.
exit
Останавливаем сервер MySQL:
systemctl stop mysql
Проверяем статус, мы должны убедиться, что сервер MySQL остановлен:
systemctl status mysql
Видим — Status: «Server shutdown complete».
Перемещаем каталог данных MySQL
Создадим папку /u01/mysql, в неё будем переносить папку с данными MySQL.
С помощью rsync переносим MySQL в другую папку:
rsync -av /var/lib/mysql /u01/mysql
Флаг –a сохраняет привилегии и другие свойства каталога. Флаг –v предоставляет подробный вывод. Теперь внимание, папка /var/lib/mysql теперь находится по адресу /u01/mysql/mysql (ну так мне было нужно).
Переименуем старую папку /var/lib/mysql, сохраним её на случай сбоя:
mv /var/lib/mysql /var/lib/mysql.bak
По умолчанию путь настроен в файле /etc/mysql/mysql.conf.d/mysqld.cnf, редактируем.
vim /etc/mysql/mysql.conf.d/mysqld.cnf
Найдите строку datadir= и укажите в ней путь к новому каталогу данных /u01/mysql/mysql.
AppArmor
Настроим AppArmor, чтобы предоставить MySQL право на изменение нового каталога. Редактируем файл /etc/apparmor.d/tunables/alias:
vim /etc/apparmor.d/tunables/alias
Добавим правило:
alias /var/lib/mysql/ -> /u01/mysql/mysql/,
Перезапустим AppArmor:
systemctl restart apparmor
Если этого не сделать, то получим ошибку:
Перезапуск MySQL
MySQL при запуске проверяет наличие директории /var/lib/mysql/mysql (ЗАЧЕМ?). Чтобы он не ругался, создадим пустую папку:
mkdir /var/lib/mysql/mysql -p
Запускаем MySQL:
systemctl start mysql
systemctl status mysql
Проверяем текущий путь:
mysql -u root -p
select @@datadir;
Путь теперь /u01/mysql/mysql/.
Удаление ненужных файлов
rm -R /var/lib/mysql.bak
3 июля, 2018 12:09 пп
1 783 views
| Комментариев нет
mySQL, Ubuntu
Объём базы данных увеличивается, и со временем она исчерпывает пространство файловой системы. Кроме того, если ввод и вывод находится на одном разделе с остальной частью операционной системы, возможные конфликты доступа к устройствам ввода/вывода. 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 можно найти в документации.
Tags: AppArmor, MySQL, Ubuntu 18.04