Как мне переместить каталог данных MySQL?
Я пытаюсь переместить каталог данных моей базы данных MySQL на второй дисковый массив, который у меня есть в качестве точки монтирования /array2/
,
Проблема у меня в том, что я перепробовал все, и после того, как я изменил расположение datadir в my.cnf, mysql больше не запускается.
Все, что я получаю, это:
start: Job failed to start
7 ответов
Забыли про приложение броня.
Для тех, кто заинтересован, я сделал следующее, чтобы переместить папку.
Остановите сервер 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
Я обнаружил, что 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
,
Быть в курсе
Если у вас есть таблицы InnoDB, вы ДОЛЖНЫ скопировать поверх ibdata*
а также ib_logfile*
файлы или вы не сможете использовать таблицы. Ты получишь:
"Таблица" databaseName.tableName "не существует"
ошибки.
Запустите эту команду копирования, чтобы скопировать поверх ibdata*
а также ib_logfile*
файлы.
sudo cp -p /var/lib/mysql/ib* /array2/mysql/
Я предпочитаю использовать опцию mount with bind, чтобы избежать дальнейших изменений в конфигурации Apparmor и Mysql.
Например:
Предположим, я хочу переместить все в /var/www
, Допустим, этот каталог - моя среда разработки, и он смонтирован в другом разделе.
Сначала нам нужно остановить MySQL:
sudo systemctl stop mysql.service
Перемещаем файлы (сохраняя разрешение)
sudo rsync -av /var/lib/mysql /var/www
Это создаст каталог
/var/www/mysql/
со всем содержанием.Мы удаляем все в старом каталоге:
sudo rm -r /var/lib/mysql/*
Мы монтируем новый каталог с
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 все будет так, как будто ничего не изменилось.Теперь мы делаем крепление:
sudo mount -a
и перезапустите MySQL.
Я просто попробовал другой способ, который некоторые могут найти полезным:
скопировать с разрешениями нетронутыми:
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
Надеюсь, что это кому-то поможет, потому что символические ссылки не работают для меня, и это был самый простой способ
Если вы перемещаете свой datadir, вам нужно не только дать новые разрешения datadir, но и убедиться, что все родительские каталоги имеют разрешение.
Я перенес свой datadir на жесткий диск, смонтированный в Ubuntu как:
/media/*user*/Data/
и мой датадир был Базы данных.
Мне пришлось установить разрешения на 771 для каждого из носителей, пользователей и каталогов данных:
sudo chmod 771 *DIR*
Если это не работает, другой способ заставить MySQL работать - изменить пользователя в /etc/mysql/my.cnf на root; хотя, несомненно, есть некоторые проблемы с этим с точки зрения безопасности.
Вы понимаете, если вы будете следовать командам дословно из принятого ответа, это потерпит неудачу?
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 цента стоит.