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

51

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

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

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

start: Job failed to start
    
задан Jonny Flowers 15.05.2012 в 18:32
источник

7 ответов

61

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

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

Остановите сервер 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 узнает о новом datadir:

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

Обновить профили apparmor

sudo /etc/init.d/apparmor reload

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

start mysql
    
ответ дан Jonny Flowers 21.09.2015 в 11:20
источник
20

Я обнаружил, что 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 .

    
ответ дан Brian Moore 17.08.2012 в 18:29
13

Знайте.

Если у вас есть таблицы InnoDB, вы ДОЛЖНЫ скопировать файлы ibdata* и ib_logfile* или вы не сможете использовать эти таблицы. Вы получите:

  

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

ошибки.

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

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
    
ответ дан dave 02.05.2013 в 11:59
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

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

    
ответ дан snapfractalpop 21.08.2015 в 00:19
3

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

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

/media/*user*/Data/

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

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

sudo chmod 771 *DIR*

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

    
ответ дан Kohjah Breese 09.10.2014 в 14:36
1

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

Например:

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

  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.

ответ дан Postadelmaga 02.12.2016 в 05:36
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 цента стоит.

    
ответ дан Ellison Chan 29.10.2017 в 18:16