Як перемістити каталог даних 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

Перезавантажте профілі програми

sudo /etc/init.d/apparmor reload

Потім запустіть mysql:

start mysql

Це хороша відповідь, але вам може знадобитися ще один крок, щоб клієнти могли підключитися до mysql. Додайте нову групу з одним рядком під нею ... [client] 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/uk/…
Ендрю Енслі

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/

це має бути коментар, це не повна відповідь
Postadelmaga

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/

і мій datadir був Бази даних .

Мені довелося встановити дозволи на 771 для кожного з медіа, користувачів та каталогів даних:

sudo chmod 771 *DIR*

Якщо це не працює, інший спосіб ви можете змусити mysql працювати - це змінити користувача в /etc/mysql/my.cnf на root; хоча сумнівів у цьому немає з точки зору безпеки.


2

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


Наприклад:

Припустимо, я хочу все перенести /var/www. Скажімо, цей dir - це середовище мого розробника, і він встановлений в іншій перегородці

  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.