Как изменить каталог данных 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 (Precise). Я обнаружил, что нужно отредактировать файл /etc/apparmor.d/tunables/alias, включив в него строку "alias / var / lib / mysql / -> / newpath /," с этим на месте, мне не нужно было никаких изменения в любом из других файлов AppArmor. Он работал сразу после перезапуска AppArmor с помощью «/etc/init.d/apparmor restart» и MySQL с «restart mysql».
Мак

2
Apparmor не имеет отношения к CentOS. Вместо этого есть SELinux. Вы можете прочитать о том, как отключить или управлять здесь. Blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam

12
в издании Мак (что необходимо) не забывайте запятую в конце строки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' / etc / my.cnf
беримболо

Это не сработало для меня. Я попробовал это и много других альтернатив. Я прихожу к тому же выводу, что и user3338098, когда он говорит, что это единственный способ, который работает: serverfault.com/questions/503887/…
Volksman

@Volksman все, что говорит эта ссылка, он должен был удалить и переустановить ... скорее всего, у вас обоих есть какие-то другие проблемы, специфичные для сервера, так как MySQL и MariaDB поддерживают конфигурацию datadir, и я недавно сделал это (6 месяцев назад) на другом сервер без проблем
sMyles

@sMyles да, его удалили и установили, но после монтирования / var / lib / mysql в другом месте, то есть, в отличие от того, к которому был ранее / var был подключен мегасегмент. Если есть какая-то конкретная проблема с нашими системами, было бы здорово понять, что это так. Это была новая стандартная установка ОС Centos 7 с RAID 10 с 8-кратным жестким диском, но обычно такие детали дискового массива прозрачны для программного обеспечения.
Volksman

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
проголосовал за, потому что он не работает, как описано на serverfault.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"
  • удалите этот каталог: "sudo rm -R / var / lib / mysql"
  • Переместить данные в новый каталог: "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»
  • Перезагрузите systemd с помощью "sudo systemctl daemon-reload"
  • Перезапустите mysql с помощью "перезапуска службы mysql"

Однажды, чтобы найти решение для меня в документации 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 . Я свяжу этот обходной путь с этим сообщением об ошибке.
прогулка

проголосовал за, потому что он не работает, как описано на serverfault.com/a/733998/279553
user3338098

5

Первая остановка mysqld

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

Затем измените датадир в вашем /etc/mysql/my.cnf
Start mysqld

Ноты:
# 1: возможно, вам нужно изменить настройки SELinux (попробуйте отключить SELinux в случае проблем), Apparmor (Ubuntu) также может быть проблемой.

# 2: см. MySQL Install DB Reference


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 / на / yourdirectory /, затем добавьте следующее, если его нет в файле

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

Сохраните файл с помощью команды

:wq

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

sudo vim /etc/mysql/my.cnf

Замените где / var / lib / на / yourdirectory /, затем сохраните командой

:wq

наконец начать MySQL

sudo service mysql start

@ подробнее о raid0, оптимизации ici


проголосовал за, потому что он не работает, как описано на serverfault.com/a/733998/279553
user3338098

возможно, это не работает для другого дистрибутива, но если вы используете Ubuntu, это прекрасно работает для меня, и я меняю путь для каждого нового установленного сервера Ubuntu, чтобы включить raid0.
naddame

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

3

Это решение работает в Windows 7 с использованием Workbench. Для этого вам потребуются права администратора. Это создает соединение (как ярлык), где вы действительно хотите хранить свои данные

Откройте Workbench и выберите INSTANCE - Запуск / останов Останов сервера

Установите Junction Master с https://bitsum.com/junctionmaster.php

Перейдите к C: \ ProgramData \ MySQL \ MySQL Server 5.6.

Щелкните правой кнопкой мыши на Data и выберите «MOVE, а затем LINK folder to ...». Примите пункт назначения «Point» для «Ваш новый каталог данных здесь без кавычек». Нажмите MOVE AND LINK

Теперь перейдите в «Ваш новый каталог данных здесь без кавычек»

Щелкните правой кнопкой мыши на Data. Перейдите на вкладку безопасности. Нажмите Edit. Нажмите Add Type NETWORK SERVICE, затем Check Names. Нажмите OK. Установите флажок Allow Full Control, а затем нажмите OK.

Вернитесь в 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 использует каталог Data для хранения данных различных баз данных, которые вы создаете. Ну, в конце концов, он должен хранить их в виде файлов с некоторыми дополнительными фокусами в приложении и формате файлов, чтобы гарантировать, что обещания базы данных, которые вы изучили в классах баз данных, не повреждены.

Теперь вы хотите убедиться, что достаточно места для хранения больших баз данных, которые вы можете создать в будущем, и вы подумали: «Эй! Я хочу поместить это в другой двигатель, у которого есть больше места.

Итак, вы делаете следующее.

Шаг - 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 файл, должно быть прямо там.

Откройте его в редакторе (возможно, Notepad ++).

Сделайте 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. В зависимости от вашей установки, старые версии файлов БД должны быть обновлены.

извините за отрицательное голосование, это решение может быть правильным, не пробовал его.
user3338098

1

Нам пришлось переместить MySQL в /homeкаталог, потому что он был сопоставлен с другим физическим диском. Чтобы упростить работу, вместо изменения каталога в my.cnf мы сопоставили новый каталог /home/mysqlс местом исходного каталога./var/lib/mysql . У нас это работает как брелок (проверено на CentOS 7.1).

Создайте новый каталог и установите правильные разрешения.

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

Остановите MySQL, если работает.

systemctl stop mysql

Переместить данные dir.

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 / Библиотека / MySQL

и что вы должны сделать, это

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

и тогда работа сделана.

Но если вы не установили его с помощью apt или yum, direcotry может не понравиться, и вы можете найти файлы mysql с

где Mysql


проголосовал за, потому что он не работает, как описано на serverfault.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. ОС в моей виртуальной машине - RHEL 7.6.


Я попробовал selinux в RHEL7.6, изменив SELINUX = принудительно на SELINUX = permissive, у меня не получилось.
user3325137Вильям

0

Также возможно символическую ссылку на dadadir. По крайней мере, в среде macOS, dev.

(доморощенный) например

# 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.