Как изменить расположение базы данных mysql

Как посмотреть и поменять путь расположения до баз MySQL / MariaDB.

Обновлено Обновлено: 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:

Пример создания запроса на получение пути к базе MySQL в 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 ;-)

Profile picture for user Олег

MySQL 8

База данных 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;

mysql

Видим, что файлы базы находятся в /var/lib/mysql/. Чтобы закрыть командную строку MySQL, введите exit.

exit

Останавливаем сервер MySQL:

systemctl stop mysql

Проверяем статус, мы должны убедиться, что сервер MySQL остановлен:

systemctl status mysql

mysql

Видим — Status: «Server shutdown complete».

Перемещаем каталог данных MySQL

Создадим папку /u01/mysql, в неё будем переносить папку с данными MySQL.

mysql

С помощью rsync переносим MySQL в другую папку:

rsync -av /var/lib/mysql /u01/mysql

Флаг –a сохраняет привилегии и другие свойства каталога. Флаг –v предоставляет подробный вывод. Теперь внимание, папка /var/lib/mysql теперь находится по адресу /u01/mysql/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.

mysql

AppArmor

Настроим AppArmor, чтобы предоставить MySQL право на изменение нового каталога. Редактируем файл /etc/apparmor.d/tunables/alias:

vim /etc/apparmor.d/tunables/alias

Добавим правило:

alias /var/lib/mysql/ -> /u01/mysql/mysql/,

mysql

Перезапустим AppArmor:

systemctl restart apparmor

Если этого не сделать, то получим ошибку:

mysql

Перезапуск MySQL

MySQL при запуске проверяет наличие директории /var/lib/mysql/mysql (ЗАЧЕМ?). Чтобы он не ругался, создадим пустую папку:

mkdir /var/lib/mysql/mysql -p

Запускаем MySQL:

systemctl start mysql
systemctl status mysql

mysql

Проверяем текущий путь:

mysql -u root -p
select @@datadir;

mysql

Путь теперь /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

Понравилась статья? Поделить с друзьями:
  • Как изменить расположение wincmd ini
  • Как изменить расположение tlauncher
  • Как изменить расположение roaming
  • Как изменить расположение placeholder css
  • Как изменить расположение itunes media