Как мне переместить каталог данных MySQL?


57

Я пытаюсь переместить каталог данных моей базы данных MySQL на второй дисковый массив, который у меня есть в качестве точки монтирования /array2/.

Проблема у меня в том, что я перепробовал все, и после того, как я изменил расположение datadir в my.cnf, mysql больше не запускается.

Все, что я получаю, это:

start: Job failed to start

Ответы:


62

Забыли про приложение броня.

Для тех, кто заинтересован, я сделал следующее, чтобы переместить папку.

Остановите сервер MySQL:

stop mysql

Создайте новый каталог:

mkdir /array2/mysql

Скопируйте ТОЛЬКО папки базы данных:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

Сделайте резервную копию my.cnfфайла:

cp /etc/mysql/my.cnf /root/my.cnf.backup

Отредактируйте my.cnfфайл:

nano /etc/mysql/my.cnf

Измените все упоминания старого datadir и сокета на новое местоположение

Мой стал:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

Обновить каталог разрешений:

chown -R mysql:mysql /array2/mysql

Переименуйте старый каталог:

mv /var/lib/mysql /var/lib/mysql-old

Создайте символическую ссылку, на всякий случай:

ln -s /array2/mysql /var/lib/mysql 

Сообщите AppArmor о новом датадире:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

Перезагрузите профили apparmor

sudo /etc/init.d/apparmor reload

Затем запустите mysql:

start mysql

Это хороший ответ, но вам может потребоваться еще один шаг, чтобы разрешить клиентам подключаться к mysql. Добавьте новую группу с одной строкой под ней ... [клиенты] socket = / array2 / mysql / mysql.sock, где часть socket = указывает на новое местоположение вашего файла mysql.sock.
Ночная сова

1
Если вы не хотите, чтобы слияние происходило /etc/apparmor.d/usr.sbin.mysqldкаждый раз, когда mysql получает обновление, вы можете добавить /array2/mysql/** rwk,к нему /etc/apparmor.d/local/usr.sbin.mysqld. Mysql по-прежнему будет иметь доступ к старому каталогу данных, но это, вероятно, не проблема.
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf, Почему только папки базы данных?
int_ua

Для тех, кто перемещает свой datadir в ZFS (как я это сделал), обязательно добавьте: innodb_use_native_aio=0в [mysqld]разделе вашего my.cnfфайла, поскольку ZFS в linux не поддерживает AIO. dev.mysql.com/doc/refman/5.5/en/…
Эндрю Энсли

23

Я обнаружил, что AppArmor был виновником изучения syslogи смог успешно изменить расположение mysqlданных, следуя этому процессу.

Обратите внимание, что в редактируемых ниже файлах +были добавлены строки, начинающиеся с, а строки, начинающиеся с -. Вы не должны фактически печатать / вставлять +знаки при добавлении строк в эти файлы.

Я клонировал mysqlкаталог на новое место:

sudo rsync -av /var/lib/mysql /new_dir

Затем я отредактировал datadirстроку в /etc/mysql/my.cnf:

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

Затем я отредактировал /etc/apparmor.d/usr.sbin.mysqld:

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

Затем я перезапустил mysql.


13

Быть в курсе

Если у вас есть таблицы InnoDB вы должны скопировать в ibdata*и ib_logfile*файлы или вы не сможете использовать таблицы. Ты получишь:

«Таблица» databaseName.tableName «не существует»

ошибки.

Выполните эту команду копирования , чтобы скопировать в ibdata*и ib_logfile*файлы.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

это должен быть комментарий, это не полный ответ
Постадельмага

4

Я просто попробовал другой способ, который некоторые могут найти полезным:

скопировать с разрешениями нетронутыми:

rsync -avzh /var/lib/mysql /path/to/new/place

резервное копирование (на случай, если что-то пойдет не так):

mv /var/lib/mysql /var/lib/_mysql

создайте новый пустой каталог вместо старого:

mkdir /var/lib/mysql

привязать монтируем новое местоположение к старому:

mount -B /path/to/new/place /var/lib/mysql

Надеюсь, что это кому-то поможет, потому что символические ссылки не работают для меня, и это был самый простой способ


3

Если вы перемещаете свой datadir, вам нужно не только дать новые разрешения datadir, но и убедиться, что все родительские каталоги имеют разрешение.

Я перенес свой datadir на жесткий диск, смонтированный в Ubuntu как:

/media/*user*/Data/

и мой датадир был Базы данных .

Мне пришлось установить разрешения на 771 для каждого из носителей, пользователей и каталогов данных:

sudo chmod 771 *DIR*

Если это не работает, другой способ заставить MySQL работать - изменить пользователя в /etc/mysql/my.cnf на root; хотя, несомненно, есть некоторые проблемы с этим с точки зрения безопасности.


2

Я предпочитаю использовать опцию mount with bind, чтобы избежать дальнейших изменений в конфигурации Apparmor и Mysql.


Например:

Предположим, я хочу переместить все в /var/www. Допустим, этот каталог - моя среда разработки, и он смонтирован в другом разделе.

  1. Сначала нам нужно остановить MySQL :

    sudo systemctl stop mysql.service
    
  2. Перемещаем файлы (сохраняя разрешение)

    sudo rsync -av /var/lib/mysql /var/www
    

    Это создаст каталог /var/www/mysql/со всем содержимым.

  3. Мы удаляем все в старом каталоге:

    sudo rm -r /var/lib/mysql/*
    
  4. Мы монтируем новый каталог с bindопцией в старый.
    отредактируйте /etc/fstabи добавьте эту строку:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    Это будет монтировать /var/www/mysqlв нашем пустом каталоге /var/lib/mysql
    . bindОпция здесь делает волшебство, она будет заполняться /var/lib/mysqlсодержимым, /var/www/mysqlпоэтому для mysql и apparmor это будет похоже на то, что ничего не изменилось.

  5. Теперь мы делаем крепление:

    sudo mount -a
    

    и перезапустите MySQL.


0

Вы понимаете, если вы будете следовать командам дословно из принятого ответа, это потерпит неудачу?

cp -R / var / lib / mysql / array2 / mysql

Скопирует / var / lib / mysql в / array2 / mysql / mysql.

Когда вы устанавливаете свой файл конфигурации, вам лучше поместить в / array2 / mysql / mysql каталог, иначе ваш mysqld не запустится.

Лучшими командами копирования будут:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql

Просто мои 2 цента стоит.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.