Як змінити каталог даних MySQL?


158

Чи можна змінити мій каталог даних MySQL за замовчуванням на інший шлях? Чи зможу я отримати доступ до баз даних зі старого місця розташування?


3
Чи є відповіді на це питання, якщо система в Win8?
Джонатан М

1
Щодо вікон - дивіться тут: dba.stackexchange.com/questions/24403/…
д-р Аарон Дішно,

Для користувачів Mac все, що вам потрібно, це це та крок 1-4 з відповіді @ user1341296.
shellbye

Відповіді:


270
  1. Зупиніть MySQL за допомогою наступної команди:

    sudo /etc/init.d/mysql stop
  2. Скопіюйте існуючий каталог даних (за замовчуванням знаходиться в /var/lib/mysql) за допомогою наступної команди:

    sudo cp -R -p /var/lib/mysql /newpath
  3. відредагуйте файл конфігурації MySQL за допомогою наступної команди:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Шукайте запис datadirта змініть шлях (який повинен бути /var/lib/mysql) до нового каталогу даних.

  5. У терміналі введіть команду:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. Шукайте рядки, що починаються з /var/lib/mysql. Зміна /var/lib/mysqlрядків новим шляхом.

  7. Збережіть і закрийте файл.

  8. Перезавантажте профілі AppArmor командою:

    sudo /etc/init.d/apparmor reload
  9. Перезавантажте MySQL командою:

    sudo /etc/init.d/mysql restart
  10. Тепер увійдіть в MySQL і ви можете отримати доступ до тих же баз даних, що і раніше.


33
Вищезгадане не вдалося вирішити проблему для мене на Ubuntu 12.04 (точно). Я з’ясував, що потрібно відредагувати файл /etc/apparmor.d/tunables/alias, щоб включити рядок "псевдонім / var / lib / mysql / -> / newpath /," З цим на місці мені не потрібно було зміни в будь-якому іншому файлі AppArmor. Він працював відразу після перезавантаження AppArmor з "/etc/init.d/apparmor перезавантаження", а MySQL з "перезапуском mysql".
mak

2
Apparmor не стосується CentOS. Натомість є SELinux. Можна прочитати про те , як відключити або керувати тут blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Ноам

12
у виданні mak (що потрібно) не забудьте коску в кінці рядкаalias /var/lib/mysql/ -> /newpath/,
Майкл

4
Не можу підкреслити, наскільки важливий коментар Мішеля вище: ДОДАТИ НАВЧАЛЬНУ КОММУ та збережіть деякі нейрони. Вибачте за шапки.
alx

2
Не працює для мене. Мені не вдалося отримати роботу для mysql.service. Деталі див. У розділі "systemctl status mysql.service" та "journalctl -xn" для спроби перезапустити mysqld, і помилка в тому, що диск заповнений. У нього 500 ГБ вільного місця ...
Френк Х.

17

Швидке та просте:

# Create new directory for MySQL data
mkdir /new/dir/for/mysql

# Set ownership of new directory to match existing one
chown --reference=/var/lib/mysql /new/dir/for/mysql

# Set permissions on new directory to match existing one
chmod --reference=/var/lib/mysql /new/dir/for/mysql

# Stop MySQL before copying over files
service mysql stop

# Copy all files in default directory, to new one, retaining perms (-p)
cp -rp /var/lib/mysql/* /new/dir/for/mysql/

Відредагуйте /etc/my.cnfфайл та під [mysqld]додаванням цього рядка:

datadir=/new/dir/for/mysql/

Якщо ви використовуєте CageFS (з CloudLinux або без нього) і хочете змінити каталог MySQL, ОБОВ'ЯЗКОВО додати новий каталог до цього файлу:

/etc/cagefs/cagefs.mp

А потім запустіть цю команду:

cagefsctl --remount-all

1
Радий почути: P
sMyles

Велике спасибі, і якщо ви хочете повністю написати цей сценарій, як я це, ви можете використовувати це: sed -i 's | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g' / тощо / my.cnf
berimbolo

Це не спрацювало для мене. Я спробував це і багато різних інших альтернатив. Я приходжу до того ж висновку, що і користувач3338098, коли він каже, що це єдиний спосіб роботи: serverfault.com/questions/503887/…
Volksman

@Volksman все, що посилається, говорить про те, що йому довелося видалити та перевстановити ... швидше за все, у вас обох є якась інша проблема, пов’язана з сервером, оскільки обидва MySQL і MariaDB підтримують конфігурацію datadir, і я нещодавно це зробив (6 місяців тому) на іншому сервер без проблем
sMyles

@sMyles так, його було видалено та встановлено, але після встановлення / var / lib / mysql в іншому місці, тобто мега-розділ на відміну від одного / var раніше був встановлений. Якщо є конкретна проблема з нашими системами, було б чудово розібратися, що це. Це було на звичайній стандартній установці OS Centos 7 з RAID 10 з 8x жорстким диском, але зазвичай такі деталі масиву диска прозорі для програмного забезпечення.
Фолксман

15

вам доведеться скопіювати поточні дані в новий каталог і змінити my.cnfсвій MySQL.

[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/

Ви повинні скопіювати базу даних, коли сервер не працює .


Ну ось що я не можу зробити. Я хочу змінити каталог, але хочу створити нові бази даних у новому каталозі. І хочете отримати доступ до старих баз даних та нових баз даних.
MySQL DBA

1
@ MySQL DBA: якщо ви використовуєте якусь ln -sстатичну символічну рись, чи не вдасться це зробити?
RageZ

Ну, я трохи заплутався у використанні цієї команди. Як я пояснював раніше, я хочу створити нові бази даних у новому каталозі. Чи можливо за допомогою симпосилання.
MySQL DBA

1
ви можете створити новий каталог, скористайтеся символічним посиланням, щоб файл з’явився у новому режимі та змінив свійmy.cnf
RageZ

2
вниз проголосував, тому що він не працює так детально на serverfault.com/a/733998/279553
user3338098

14

Спочатку слід зупинити сервер mysql. напр

# /etc/init.d/mysql stop

Після цього слід скопіювати старий каталог даних (наприклад, / var / lib / mysql), включаючи привілеї до вашого нового каталогу через

# cp -R -p /var/lib/mysql /new/data/dir

тепер ви можете змінити /etc/mysql/my.cnfдані нові та перезапустити сервер

# /etc/init.d/mysql restart

5
вниз проголосував, оскільки він не працює так детально на сервері defaultfault.com/a/733998/279553
user3338098

7

Якщо ви, як я, перебуваєте на debian і хочете перенести mysql dir до свого дому чи доріжкою на / home / ..., рішення:

  • Зупинити mysql на "sudo service mysql stop"
  • змінити змінну "datadir" на новий шлях у "/etc/mysql/mariadb.conf.d/50-server.cnf"
  • Зробіть резервну копію / var / lib / mysql: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • видалити цей dir: "sudo rm -R / var / lib / mysql"
  • Перемістіть дані до нового dir: "cp -R -p / path_to_my_backup / path_new_dir
  • Змінити доступ на "sudo chown -R mysql: mysql / path_new_dir"
  • Змініть змінну "ProtectHome" на "false" на "/etc/systemd/system/mysqld.service"
  • Перезавантажити системою "sudo systemctl daemon-reload"
  • Перезапустити mysql за допомогою "service mysql restart"

Одного разу знайти рішення для мене в документації на mariadb. Сподіваюся, це допоможе хлопцям!


Файлу /etc/systemd/system/mysqld.service немає тут. Будь-яка ідея, де я шукати?
Рон Пігготт

1
Для тих , хто використовує MariaDB служби файл знаходиться в /lib/systemd/system/mariadb@.service
Рон Пиготт

5

Я хотів зберегти базу даних на своїй машині, але також мати дані на зовнішньому жорсткому диску та перемикатися між ними.

Якщо ви перебуваєте на Mac та встановили MySQL за допомогою Homebrew, це повинно працювати для вас. В іншому випадку вам просто потрібно буде замінити відповідні місця для MySQL datadirна вашій машині.

#cd to my data dir location
cd /usr/local/var/

#copy contents of local data directory to the new location
cp -r mysql/ /Volumes/myhd/mydatadir/

#temporarily move the old datadir
mv mysql mysql.local

#symlink to the new location
ln -s /Volumes/myhd/mydatadir mysql

Потім, коли ви хочете переключитися назад, просто зробіть:

mv mysql mysql.remote

mv mysql.local mysql

і ви знову використовуєте свою локальну базу даних. Сподіваюся, що це допомагає.


1
це не точно вирішує питання, як було зазначено - однак саме це я шукав - і це акуратний спосіб поводження з кращим регістром / помилкою, який my.cnf не обробляє простору: bugs.mysql.com /bug.php?id=26033 . Я зв’яжу це вирішення у звіті про помилку.
gabe

вниз проголосував, оскільки він не працює так детально на сервері defaultfault.com/a/733998/279553
user3338098

5

Перша зупинка mysqld

mysql_install_db --user=mysql \
                 --basedir=/opt/mysql/mysql \
                 --datadir=/opt/mysql/mysql/data

Потім змініть datadir у своєму /etc/mysql/my.cnf
запуску mysqld

Примітки:
№1: ймовірно, вам доведеться відрегулювати налаштування SELinux (спробуйте вимкнути SELinux у разі неприємностей), можливо, також може виникнути проблема Apparmor (Ubuntu).

№2: див. Посилання на встановлення MySQL DB


4

Спочатку зупиніть свій mysql

sudo service mysql stop

скопіюйте дані mysql на нове місце.

sudo cp -rp /var/lib/mysql /yourdirectory/

якщо ви використовуєте apparmor, відредагуйте наступний файл і зробіть наступне

sudo vim /etc/apparmor.d/usr.sbin.mysqld

Замініть, де / var / lib / by / yourdirectory /, а потім додайте follwoing, якщо у файл його немає

    /yourdirectory/mysql/ r,
    /yourdirectory/mysql/** rwk,

Збережіть файл за допомогою команди

:wq

Відредагуйте файл my.cnf

sudo vim /etc/mysql/my.cnf

Замініть, де / var / lib / by / yourdirectory /, а потім збережіть за допомогою команди

:wq

нарешті почати mysql

sudo service mysql start

@ детальніше про raid0, оптимізацію ici


вниз проголосував, тому що він не працює так детально на сервері defaultfault.com/a/733998/279553
user3338098

можливо, це не працює для іншого розповсюдження, але якщо ви використовуєте ubuntu, це добре працює для мене, і я змінюю шлях для кожного нового встановленого сервера ubuntu, щоб включити raid0.
наддаме

2
Я знаю, що люди заперечують це, але хочу сказати вам, що це врятувало мені день. Дякую!
Даніель Лурейро

3

Це рішення працює в Windows 7 за допомогою Workbench. Для цього вам знадобляться права адміністратора. Це створює перехід (як ярлик) до місця, де ви дійсно хочете зберігати свої дані

Відкрийте Workbench та виберіть ІНСТАНЦІЯ - запуск / відключення Зупинення сервера

Встановіть майстер з'єднання з https://bitsum.com/junctionmaster.php

Перейдіть до C: \ ProgramData \ MySQL \ MySQL Server 5.6

Клацніть правою кнопкою миші на Дані та виберіть "Перемістити, а потім папку ПОСИЛАННЯ до ..." Прийміть призначення пункту попередження до "Вашого нового каталогу даних тут без лапок". Клацніть Перемістити та посилання

Тепер перейдіть до "Вашого нового каталогу даних тут без лапок"

Клацніть правою кнопкою миші на Дані Перейдіть на вкладку безпеки. Клацніть Редагувати. Клацніть Додати тип сервісної мережі.

Поверніться до Workbench та запустіть сервер

Цей метод працював для мене за допомогою MySQL Workbench 6.2 в Windows 7 Enterprise.


2

Все, як сказав @ user1341296, плюс ...

Краще не змінювати /etc/mysql/my.cnf Замість цього ви хочете створити новий файл /etc/mysql/conf.d/ext.cnf(будь-яке ім'я, але розширення має бути cnf)

І внесіть у нього свої зміни:

[mysqld]
datadir=/vagrant/mq/mysql

Таким чином

  • Вам не потрібно змінювати існуючий файл (простіше для сценаріїв автоматизації)
  • Немає проблем з оновленням версії MySQL (і це конфігурації!).

2

Якщо ви користувач Windows та приїхали сюди, щоб дізнатися, що всі відповіді призначені для користувачів Linux, не розчаровуйтесь! Я не дам тобі витрачати час так, як я.

Трохи фігняних розмов перед рішенням:

MySQL використовує каталог даних для зберігання даних різних створених вами баз даних. Ну і врешті-решт, вони повинні зберігати їх у вигляді файлів з деякою доданою жонглерією у форматі програми та файлів, щоб гарантувати, що обіцянки бази даних, які ви дізналися в класах баз даних, є недоторканими.

Тепер ви хочете переконатися, що є достатньо місця для зберігання великих баз даних, які ви могли б створити в майбутньому, і тому ви подумали: Гей! Я хочу помістити його в інший привід, який має більше місця.

Отже, ви робите наступне.

Крок - 1 : Зупинення служби MySQL.

  Window Key + R - will open Run
  servies.msc    - will open services manager
  Locate MySQL80 (80 is for version 8.0, look for the one you've).
  Stop it.       (Right click, Stop)

Крок - 2 : Пошук поточного каталогу даних

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

За замовчуванням тут повинна бути папка з назвою Data, саме ця використовується MySQL у налаштуваннях за замовчуванням (за умови, що вони не знайшли іншого кращого місця), але давайте перевіримо це.

Знайдіть my.iniфайл, має бути саме там.

Відкрийте його в редакторі (можливо, Блокнот ++).

Зробіть CTRL + F, щоб дізнатися це datadirу файлі.

Що б тут не згадувалося - це фактичне місцезнаходження, яке зараз використовується MySQL для каталогу даних. Це те, що ви хочете змінити.

Крок - 3 : Заміна його на новий каталог даних.

Скажімо, ви хочете, щоб ваш новий каталог даних був W: __ MySQL_Data. Давайте змінимо datadirзначення у my.iniфайлі на це значення. Залиште коментувати попереднє значення, щоб не потрібно було його пам’ятати.

 # Path to the database root
 # datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
   datadir=W:/__MySQL_Data

Тепер xcopyскопіюйте за замовчуванням datadirна W:\. Командний рядок запуску (Window + R, cmd, Enter)

 >> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X

І перейменуйте скопійовану папку в нове datadirзначення, яке ви змінили. Тут:W:/__MySQL_Data

Чому б просто не скопіювати? Ну тому, що це не COOL !, це допомагає вам не втрачати дозволи на скопійовану папку, так що при перезапуску MySQL80це не призведе до дурної помилки: "Служба MySQL80 на локальному комп’ютері запустилася та зупинилася. Деякі сервіси автоматично зупиняються, якщо вони не використовуються іншими службами чи програмами ". - Надано: Microsoft

Крок - 4 : перезапуск послуги

 Well, go back to the Services Manager to Start again, 
 "MySQL80" that you stopped, to restart it again.

Крок - 5 : Готово! Тепер поверніться до роботи !!


1
Дякуємо, що було корисно, але застереження: звичайний користувач my.ini не може писати, якщо ви не зміните його дозволи. Ох і ProgramData - це прихована папка, тому вам доведеться змінити налаштування папки Explorer, щоб побачити її.
JonP

1

Мені часто потрібно це робити при оновленні машин, переході від коробки до коробки. Крім переміщення / var / lib / mysql до кращого місця, мені часто потрібно відновлювати старі таблиці БД зі старої установки MySQL. Аби це зробити ...

  1. Зупинити mysql. Дотримуйтесь вказівок вище, це необхідно.
  2. Скопіюйте каталоги бази даних - для кожної бази даних вашої старої установки буде один - у нове місце DATADIR. Але опустіть каталоги "mysql" та "performance_schema".
  3. Правильні дозволи серед скопійованих каталогів баз даних. Власність повинна бути mysql: mysql, каталоги повинні бути 700, а файли - 660.
  4. Перезапустіть mysql. Залежно від вашої установки, файли БД старої версії слід оновлювати.

Вибачте за голос за протилежне голосування, це рішення може бути правильним, його не пробували.
користувач3338098

1

Нам довелося перемістити MySQL в /homeкаталог, оскільки він був відображений з іншого фізичного диска. Для того, щоб зробити жити простіше, замість зміни каталогу в my.cnf, ми склали новий каталог /home/mysqlна місце вихідного каталогу/var/lib/mysql . Це працює для нас як шарм (перевірено на CentOS 7.1).

Створіть новий dir та встановіть правильні дозволи.

mkdir -p /home/mysql
chmod 755 /home/mysql
chown mysql:mysql /home/mysql

Зупиніть MySQL, якщо він працює.

systemctl stop mysql

Перемістіть дані реж.

mv -f /var/lib/mysql/* /home/mysql

Створіть постійне кріплення та виконайте його.

echo "/home/mysql /var/lib/mysql none    bind   0 0" >> /etc/fstab
mount -a

Перезавантажте сервер.

systemctl start mysql

1

Якщо ви хочете зробити це програмно (без введення тексту вручну за допомогою gedit), ось версія Dockerfile на основі відповіді user1341296 вище:

FROM spittet/ruby-mysql
MAINTAINER you@gmail.com

RUN cp -R -p /var/lib/mysql /dev/shm && \
    rm -rf /var/lib/mysql && \
    sed -i -e 's,/var/lib/mysql,/dev/shm/mysql,g' /etc/mysql/my.cnf && \
    /etc/init.d/mysql restart

Доступний на Docker hub тут: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/


0

По-перше, ви повинні знати, де знаходиться ваш конфігураційний файл? де ваш конфігураційний файл?

ЯКЩО ви встановили за допомогою apt-get або yum install。

Конфігураційний файл може з'явитися в

/etc/mysql/my.cnf

файл даних може з'явитися в

/ var / lib / mysql

і що вам слід зробити

  1. зупинити mysql
  2. змінити дані mysql на новий керівництво
  3. змінити конфігураційний файл
  4. перезавантажте конфігураційний файл
  5. перезапустити mysql

а потім виконані роботи.

Але якщо ви не встановили це з apt або yum, директорія може не сподобатися, і ви можете знайти файли mysql з

де mysql


вниз проголосував, тому що він не працює так детально на сервері defaultfault.com/a/733998/279553
user3338098

0

У SuSE 13.1 це добре працює, щоб перемістити каталог даних mysql в інше місце, наприклад, в / home / example_user /, і надати йому більш інформативну назву:

В / var / lib /:

# mv -T mysql /home/example_user/mysql_datadir
# ln -s /home/example_user/mysql_datadir ./mysql

Я перезапустив mysql:

# systemctl restart mysql.service

але підозрюйте, що навіть це було не потрібно.


0

Для одного з середовищ я змінив каталог даних mysql на нове місце, але під час перезавантаження сервера mysql знадобився час. Тож я перевірив порт і виявив, що інший процес прослуховує порт mysql. Тому я вбив процес і перезапустив сервер mysql, і він добре працював.

Нижче я дотримувався кроків щодо зміни каталогу даних, який працював на відмінно. змінити каталог даних mysql в Linux


Ласкаво просимо до переповнення стека! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Тім Дікманн

0

Наведені вище кроки є фундаментальними та основними. Я стежив за ними і досі отримав помилку "mysql не вдалося запустити".

Щоб нова папка зберігала дані mysql, вам потрібно переконатися, що папка має дозволи та права власності mysql: mysql.

Крім цього, йому потрібно перевірити дозволи та права власності на батьківський каталог mysql, якщо, скажімо, / data / mysql /. Тут / data / каталог має бути root: root. Я виправив помилку "mysql не вдалося запустити" після зміни власності на батьківський каталог / mysql. ОС у моєму VM - RHEL 7.6.


Я спробував selinux в RHEL7.6, змінивши SELINUX = примусовий на SELINUX = дозвільний, не працював для мене.
користувач3325137Вільям

0

Можна також символізувати з'єднання datadir. Принаймні в macOS, середовищі розробників.

(саморобний) напр

# make sure you're not overwriting anything important, backup existing data
mv /usr/local/var/mysql [your preferred data directory] 
ln -s [your preferred data directory] /usr/local/var/mysql

Перезапустіть mysql.


-1

Якщо ви використовуєте SE linux, встановіть його на дозвільний режим, відредагувавши / etc / selinux / config та змінивши SELINUX = примусовий на SELINUX = дозвільний


як детальніше тут serverfault.com/questions/503887/… selinux не винен, є ще одна проблема, яка перешкоджає зміні datadirвласності
user3338098
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.