Перенос директории с данными MySQL (на примере RedHat)

По умолчанию MySQL хранит файлы базы данных на том же диске, где он установлен, и часто требует перенос этих файлов на другой диск большей вместимости.

Допустим, у нас имеется RedHat с установленным MySQL
1) Проверим настройки MySQL, вызовем команду:

cat /etc/my.cnf

Получим примерно следующие данные:

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet = 500M
default-storage-engine=innodb
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

В файле конфигурации параметр datadir указывает на место хранения файлов базы данных.
В нашем случае он указывает на /var/lib/mysql

2) Для проведения переноса данных, первым делом, нужно остановить MySQL.

service mysqld stop

3) Определимся с целевой директорией, куда будет осуществлен перенос.
Допустим, мы хотим перенести директорию mysql в директорию /600g

У меня фантазии не хватило - я назвал диск по его размеру.
Пример из жизни: на одном сервере диск в 600 гигабайт я назвал /600g, 
на другом диск в 3 терабайта - назвал /3t

Создадим директорию:

mkdir /600g

4) Теперь скопируем саму папку с содержимым с помощью команды:

cp -R -p /var/lib/mysql /600g

Где cp — стандартная команда для копирования.
Стоит обратить внимание на ее параметры:
-R — говорит о том, что нужно копировать директорию рекурсивно (включая поддиректории и файлы в поддиректориях)
-p — копирование с сохранением всех прав доступа и разрешений
/var/lib/mysql — здесь указывается переносимая директория
/600g — место, куда будет перенесена директория

После переноса директории mysql в /600g, мы получим следующий путь:

/600g/mysql

5) Осталось изменить конфигурацию:

nano /etc/my.cnf

Замените строки, указав на новый путь размещения директории:

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

на следующие:

datadir=/600g/mysql
socket=/600g/mysql/mysql.sock

6) К сожалению, это не все.
Нужно еще заменить пути в файле демона: /etc/init.d/mysqld

7) Запускаем MySQL

service mysqld start

8) После переноса появиться еще одна проблема, и пока не знаю как ее исправить.
Если у вас на этом же сервере есть клиент MySQL и вы могли его раньше запускать следующим образом:

mysql -uroot -p

То сейчас нужно еще будет явно указывать расположение файла сокета:

mysql -uroot -p --socket=/600g/mysql/mysql.sock

Скорее всего, где то в настройках еще нужно переписать путь.
Как в следующий раз появиться возможность произвести подобный перенос, разберусь с этой проблемной. А экспериментировать с боевым сервером не комильфо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.