Jak zmienić katalog danych MySQL?

158

Czy można zmienić domyślny katalog danych MySQL na inną ścieżkę? Czy będę mógł uzyskać dostęp do baz danych ze starej lokalizacji?

MySQL DBA
źródło
3
Czy są dostępne odpowiedzi na to pytanie, jeśli system jest w Win8?
Jonathan M
1
W przypadku systemu Windows - spójrz tutaj: dba.stackexchange.com/questions/24403/…
Dr. Aaron Dishno
Dla użytkownika Maca potrzebujesz tylko tego i kroku 1-4 z odpowiedzi @ user1341296.
widzenia,

Odpowiedzi:

270
  1. Zatrzymaj MySQL za pomocą następującego polecenia:

    sudo /etc/init.d/mysql stop
  2. Skopiuj istniejący katalog danych (domyślnie zlokalizowany w /var/lib/mysql) za pomocą następującego polecenia:

    sudo cp -R -p /var/lib/mysql /newpath
  3. edytuj plik konfiguracyjny MySQL za pomocą następującego polecenia:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Poszukaj wpisu datadiri zmień ścieżkę (która powinna być /var/lib/mysql) do nowego katalogu danych.

  5. W terminalu wprowadź polecenie:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. Poszukaj linii zaczynających się od /var/lib/mysql. Zmień /var/lib/mysqllinie z nową ścieżką.

  7. Zapisz i zamknij plik.

  8. Zrestartuj profile AppArmor za pomocą polecenia:

    sudo /etc/init.d/apparmor reload
  9. Zrestartuj MySQL za pomocą polecenia:

    sudo /etc/init.d/mysql restart
  10. Teraz zaloguj się do MySQL i uzyskaj dostęp do tych samych baz danych, które miałeś wcześniej.

user1341296
źródło
33
Powyższe nie rozwiązało problemu na Ubuntu 12.04 (Precyzyjne). Dowiedziałem się, że trzeba edytować plik /etc/apparmor.d/tunables/alias, aby zawierał wiersz „alias / var / lib / mysql / -> / newpath /”, „Po wprowadzeniu tego nie potrzebowałem żadnego zmiany w innych plikach AppArmor. Zadziałało natychmiast po ponownym uruchomieniu AppArmor z „/etc/init.d/apparmor restart” i MySQL z „restart mysql”.
mak
2
Apparmor nie ma znaczenia w CentOS. Zamiast tego jest SELinux. Możesz przeczytać, jak wyłączyć lub zarządzać tutaj blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam
12
na edycji mak (co jest konieczne) nie zapomnij o przecinku na końcu liniialias /var/lib/mysql/ -> /newpath/,
Michael
4
Nie mogę wystarczająco podkreślić, jak ważny jest powyższy komentarz Michela: DODAJ PRZECIĄGNIĘCIE PRZECIĄGNIĘCIA i uratuj kilka neuronów. Przepraszam za czapki.
alx
2
Nie działa na mnie. Otrzymuję zadanie dla mysql.service nie powiodło się. Zobacz „systemctl status mysql.service” i „journalctl -xn”, aby uzyskać szczegółowe informacje dotyczące próby ponownego uruchomienia mysqld, a błąd polega na tym, że dysk jest pełny. Ma 500 GB wolnego miejsca ...
Frank H.
17

Szybko i łatwo:

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

Edytuj /etc/my.cnfplik i [mysqld]dodaj ten wiersz:

datadir=/new/dir/for/mysql/

Jeśli używasz CageFS (z lub bez CloudLinux) i chcesz zmienić katalog MySQL, MUSISZ dodać nowy katalog do tego pliku:

/etc/cagefs/cagefs.mp

A następnie uruchom to polecenie:

cagefsctl --remount-all
sMyles
źródło
1
Miło słyszeć: P
sMyles
Wielkie dzięki i aby dodać, jeśli chcesz całkowicie napisać skrypt, tak jak ja, możesz użyć tego: sed -i | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g '/ etc / my.cnf
berimbolo
To nie zadziałało dla mnie. Próbowałem tego i wielu innych alternatyw. Dochodzę do tego samego wniosku, co user3338098, kiedy mówi, że to jedyny sposób, który działa: serverfault.com/questions/503887/…
Volksman
@Volksman wszystko, co ten link mówi, to to, że musiał usunąć i ponownie zainstalować ... prawdopodobnie oboje macie jakiś inny problem związany z serwerem, ponieważ zarówno MySQL, jak i MariaDB obsługują konfigurację datadir, a ja niedawno to zrobiłem (6 miesięcy temu) na innym serwer bez problemów
sMyles
@sMyles tak, został usunięty i zainstalowany, ale po zamontowaniu / var / lib / mysql w innym miejscu, tj. mega partycja w przeciwieństwie do tej, na której / var był wcześniej zamontowany. Jeśli istnieje jakiś problem z naszymi systemami, byłoby wspaniale się dowiedzieć, że tak jest. Było to na nowej standardowej instalacji Centos 7 OS z RAID 10 z 8x HDD, ale zwykle takie szczegóły macierzy dyskowej są niewidoczne dla oprogramowania.
Volksman
15

musiałbyś skopiować aktualne dane do nowego katalogu i zmienić my.cnfswój MySQL.

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

Musisz skopiować bazę danych, gdy serwer nie działa .

RageZ
źródło
Cóż, tego nie mogę zrobić. Chcę zmienić katalog, ale chcę utworzyć nowe bazy danych w nowym katalogu. I chcesz uzyskać dostęp zarówno do starych, jak i nowych baz danych katalogów.
MySQL DBA,
1
@MySQL DBA: jeśli użyjesz ln -sstatycznego symbolicznego rysia, czy to nie zadziała?
RageZ
Cóż, jestem trochę zdezorientowany użyciem tego polecenia. Jak wyjaśniłem wcześniej, chcę utworzyć nowe bazy danych w nowym katalogu. Czy to możliwe za pomocą linku symbolicznego.
MySQL DBA
1
możesz utworzyć nowy katalog, użyć dowiązania symbolicznego, aby plik pojawił się w nowym katalogu i zmienić swójmy.cnf
RageZ
2
Głosowano w
14

Najpierw należy zatrzymać serwer mysql. na przykład

# /etc/init.d/mysql stop

Następnie należy skopiować stary katalog danych (np. / Var / lib / mysql) wł. uprawnienia do nowego katalogu za pośrednictwem

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

teraz możesz zmienić /etc/mysql/my.cnfdane na nowe i zrestartować serwer

# /etc/init.d/mysql restart
H6.
źródło
5
Głosowanie w
7

Jeśli tak jak ja jesteś na Debianie i chcesz przenieść katalog mysql do swojego domu lub ścieżkę na / home / ..., rozwiązaniem jest:

  • Zatrzymaj mysql przez „sudo service mysql stop”
  • zmień zmienną „datadir” na nową ścieżkę w „/etc/mysql/mariadb.conf.d/50-server.cnf”
  • Wykonaj kopię zapasową / var / lib / mysql: „cp -R -p / var / lib / mysql / path_to_my_backup”
  • usuń ten katalog: „sudo rm -R / var / lib / mysql”
  • Przenieś dane do nowego katalogu: „cp -R -p / path_to_my_backup / path_new_dir
  • Zmień dostęp przez „sudo chown -R mysql: mysql / path_new_dir”
  • Zmień zmienną „ProtectHome” na „false” w „/etc/systemd/system/mysqld.service”
  • Załaduj ponownie systemd przez „sudo systemctl daemon-reload”
  • Uruchom ponownie mysql przez „restart usługi mysql”

Pewnego dnia znajdę rozwiązanie dla mnie w dokumentacji mariadbu. Mam nadzieję, że to pomoże niektórym facetom!

Sirac
źródło
Pliku /etc/systemd/system/mysqld.service nie ma tutaj. Masz jakiś pomysł, gdzie mam szukać?
Ron Piggott,
1
Dla osób korzystających MariaDB serwis plik znajduje się na /lib/systemd/system/[email protected]
Ron Piggott
5

Chciałem zachować bazę danych na moim komputerze, ale także mieć dane na moim zewnętrznym dysku twardym i przełączać się między nimi.

Jeśli korzystasz z komputera Mac i zainstalowałeś MySQL za pomocą Homebrew, powinno to zadziałać. W przeciwnym razie wystarczy zastąpić odpowiednie lokalizacje MySQL datadirna swoim komputerze.

#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

Następnie, gdy chcesz wrócić, po prostu wykonaj:

mv mysql mysql.remote

mv mysql.local mysql

i ponownie używasz lokalnej bazy danych. Mam nadzieję, że to pomoże.

wfbarksdale
źródło
1
to nie jest dokładnie odpowiadające na pytanie, jak stwierdzono - jednak dokładnie tego szukałem - i jest to zgrabny sposób obsługi skrajnego przypadku / błędu, który my.cnf nie obsługuje dobrze spacji: bugs.mysql.com /bug.php?id=26033 . Podam link do tego obejścia w tym raporcie o błędzie.
gabe
Głosowanie w
5

Pierwszy przystanek mysqld

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

Następnie zmień datadir w swoim /etc/mysql/my.cnf
Start mysqld

Uwagi:
# 1: prawdopodobnie musisz dostosować ustawienia SELinuksa (wypróbuj z wyłączonym SELinuksem w przypadku problemów), problem może też stanowić Apparmor (Ubuntu).

# 2: zobacz Poradnik instalacji bazy danych MySQL

Murlo
źródło
4

Najpierw zatrzymaj mysql

sudo service mysql stop

skopiuj dane mysql do nowej lokalizacji.

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

jeśli używasz apparmor, edytuj następujący plik i wykonaj następujące czynności

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

Zastąp gdzie / var / lib / przez / yourdirectory /, a następnie dodaj następującą, jeśli nie istnieje w pliku

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

Zapisz plik za pomocą polecenia

:wq

Edytuj plik my.cnf

sudo vim /etc/mysql/my.cnf

Zastąp gdzie / var / lib / przez / yourdirectory /, a następnie zapisz za pomocą polecenia

:wq

wreszcie uruchom mysql

sudo service mysql start

@zobacz więcej o raid0, optymalizacji ici

naddame
źródło
Głosowano w
być może nie działa to w przypadku innej dystrybucji, ale jeśli używasz Ubuntu, działa to dobrze i zmieniam ścieżkę dla każdego nowego zainstalowanego serwera Ubuntu, aby włączyć raid0.
naddame
2
Wiem, że ludzie to odrzucają, ale chcę wam powiedzieć, że to uratowało mi dzień. Dzięki!
Daniel Loureiro
3

To rozwiązanie działa w systemie Windows 7 przy użyciu Workbencha. Aby to zrobić, będziesz potrzebować uprawnień administratora. Tworzy połączenie (jak skrót) do miejsca, w którym naprawdę chcesz przechowywać swoje dane

Otwórz Workbench i wybierz INSTANCJA - Uruchomienie / Wyłączenie Zatrzymaj serwer

Zainstaluj Junction Master z https://bitsum.com/junctionmaster.php

Przejdź do C: \ ProgramData \ MySQL \ MySQL Server 5.6

Kliknij prawym przyciskiem myszy Dane i wybierz "PRZENIEŚ, a następnie LINK folder do ..." Zaakceptuj ostrzeżenie Wskaż miejsce docelowe na "Twój nowy katalog danych tutaj bez cudzysłowów" Kliknij PRZENIEŚ I POŁĄCZ

Teraz przejdź do „Twój nowy katalog danych tutaj bez cudzysłowów”

Kliknij prawym przyciskiem myszy Dane Przejdź do zakładki zabezpieczeń Kliknij Edytuj Kliknij Dodaj Typ USŁUGA SIECIOWA następnie Sprawdź nazwy Kliknij OK Kliknij pole wyboru Zezwalaj na pełną kontrolę, a następnie OK

Wróć do Workbencha i uruchom serwer

Ta metoda zadziałała dla mnie przy użyciu MySQL Workbench 6.2 w systemie Windows 7 Enterprise.

Obrabować
źródło
2

Wszystko, co powiedział @ user1341296, plus ...

Lepiej nie zmieniać /etc/mysql/my.cnf Zamiast tego chcesz utworzyć nowy plik /etc/mysql/conf.d/ext.cnf(dowolna nazwa, ale rozszerzenie powinno być cnf)

I umieść w nim swoją zmianę:

[mysqld]
datadir=/vagrant/mq/mysql

W ten sposób

  • Nie musisz zmieniać istniejącego pliku (łatwiejsze w przypadku skryptów automatyzacji)
  • Żadnych problemów z aktualizacją wersji MySQL (i jego konfiguracji!).
Pavel
źródło
2

Jeśli jesteś użytkownikiem systemu Windows i wylądowałeś tutaj, aby dowiedzieć się, że wszystkie odpowiedzi są dla użytkowników systemu Linux, nie rozczaruj się! Nie pozwolę ci tracić czasu tak jak ja.

Trochę bzdur przed rozwiązaniem:

MySQL używa katalogu Data do przechowywania danych z różnych tworzonych przez Ciebie baz danych. Cóż, w końcu musi przechowywać je w postaci plików z dodatkiem żonglerki w aplikacji i formacie pliku, aby zapewnić, że obietnice bazy danych, których nauczyłeś się w klasach baz danych, są nienaruszone.

Teraz chcesz się upewnić, że jest wystarczająco dużo miejsca do przechowywania dużych baz danych, które możesz utworzyć w przyszłości, więc pomyślałeś: Hej! Chcę umieścić go na innym dysku, który ma więcej miejsca.

Więc wykonaj następujące czynności.

Krok - 1 : Zatrzymywanie usługi 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)

Krok - 2 : Znalezienie bieżącego katalogu danych

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

Domyślnie powinien być tutaj nazwany folder Data, to jest ten, który jest używany przez MySQL w ustawieniach domyślnych (pod warunkiem, że nie znaleźli innej lepszej lokalizacji), ale sprawdźmy to.

Odnaleźć my.ini plik, powinien tam być.

Otwórz go w edytorze (może Notepad ++).

Wykonaj CTRL + F, aby dowiedzieć się datadirw pliku.

Cokolwiek jest tutaj wymienione, to rzeczywista lokalizacja aktualnie używana przez MySQL dla katalogu danych. To właśnie chcesz zmienić.

Krok - 3 : Zastąpienie go nowym katalogiem danych.

Powiedzmy, że chcesz, aby Twój nowy katalog danych był W: __ MySQL_Data. Zmieńmy datadirwartość w my.inipliku na tę wartość. Zachowaj komentarz poprzedniej wartości, abyś nie musiał jej pamiętać.

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

Teraz użyj xcopyskopiować domyślne datadirdo W:\. Uruchom wiersz poleceń (Window + R, cmd, Enter)

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

I zmień nazwę skopiowanego folderu na nową datadirwartość, którą zmieniłeś. Tutaj:W:/__MySQL_Data

Dlaczego po prostu nie skopiować? Cóż, ponieważ to nie jest FAJNE !, pomaga to nie stracić uprawnień do skopiowanego folderu, więc po ponownym uruchomieniu MySQL80nie wystąpi głupi błąd: „Usługa MySQL80 na komputerze lokalnym została uruchomiona, a następnie zatrzymana. Niektóre usługi zatrzymują się automatycznie, jeśli nie są używane przez inne usługi lub programy. ” - Dzięki uprzejmości: Microsoft

Krok - 4 : Ponowne uruchomienie usługi

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

Krok - 5 : Gotowe! A teraz wracaj do pracy !!

Prem KTiw
źródło
1
Dzięki, że było pomocne, ale ostrzeżenie: zwykły użytkownik nie ma prawa zapisu do my.ini, chyba że zmienisz jego uprawnienia. Aha i ProgramData to ukryty folder, więc musisz zmienić ustawienia folderu Eksploratora, aby go zobaczyć.
JonP
1

Często muszę to robić podczas uaktualniania maszyn, przechodzenia z pudełka do pudełka. Oprócz przenoszenia / var / lib / mysql do lepszej lokalizacji, często muszę przywrócić stare tabele DB ze starej instalacji MySQL. Aby to zrobić ...

  1. Zatrzymaj mysql. Postępuj zgodnie z instrukcjami powyżej, to konieczne.
  2. Skopiuj katalogi bazy danych - będzie po jednym dla każdej bazy danych starej instalacji - do nowej lokalizacji DATADIR. Ale pomiń katalogi „mysql” i „performance_schema”.
  3. Popraw uprawnienia w skopiowanych katalogach bazy danych. Właścicielem powinien być mysql: mysql, katalogi powinny mieć 700, a pliki - 660.
  4. Uruchom ponownie mysql. W zależności od instalacji należy zaktualizować pliki DB starej wersji.
K Markey
źródło
przepraszam za głos w dół, to rozwiązanie może być poprawne, nie próbowałem go.
user3338098
1

Musieliśmy przenieść MySQL do /homekatalogu, ponieważ został zmapowany z innego dysku fizycznego. Aby ułatwić życie na żywo, zamiast zmieniać katalog w my.cnf, zamapowaliśmy nowy katalog /home/mysqlw miejsce pierwotnego katalogu /var/lib/mysql. Działa dla nas jak urok (testowane na CentOS 7.1).

Utwórz nowy katalog i ustaw odpowiednie uprawnienia.

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

Zatrzymaj MySQL, jeśli jest uruchomiony.

systemctl stop mysql

Przenieś katalog danych.

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

Utwórz stały montaż i wykonaj go.

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

Zrestartuj serwer.

systemctl start mysql
TomS
źródło
1

Jeśli chcesz to zrobić programowo (bez ręcznego wprowadzania tekstu za pomocą gedit), oto wersja dla pliku Dockerfile na podstawie odpowiedzi użytkownika1341296 powyżej:

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

Dostępne w centrum Docker tutaj: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/

Richard
źródło
0

Po pierwsze, powinieneś wiedzieć, gdzie jest twój plik konfiguracyjny? gdzie jest twój plik konfiguracyjny?

JEŚLI zainstalowałeś z apt-get lub yum install。

config może pojawić się w

/etc/mysql/my.cnf

plik danych może pojawić się w

/ var / lib / mysql

i co powinieneś zrobić, to

  1. zatrzymaj mysql
  2. zmień dane mysql na nowy katalog
  3. zmień plik konfiguracyjny
  4. załaduj ponownie plik konfiguracyjny
  5. zrestartuj mysql

a następnie wykonane prace.

Ale jeśli nie zainstalowałeś go za pomocą apt lub yum, direcotry może tego nie lubić i możesz znaleźć pliki mysql za pomocą

whereis mysql

42wolf
źródło
Głosowano w
0

W SuSE 13.1 działa to dobrze, aby przenieść katalog danych mysql w inne miejsce, np. Do / home / example_user /, i nadać mu bardziej pouczającą nazwę:

W / var / lib /:

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

Zrestartowałem mysql:

# systemctl restart mysql.service

ale podejrzewam, że nawet to nie było konieczne.

user3346151
źródło
0

W jednym ze środowisk zmieniłem katalog danych mysql na nową lokalizację, ale podczas restartu serwera mysql trwało to trochę. Sprawdziłem więc port i stwierdziłem, że inny proces nasłuchuje na porcie mysql. Więc zabiłem proces i zrestartowałem serwer mysql i działało dobrze.

Wykonałem poniższe kroki, aby zmienić katalog danych, który działał doskonale. zmień katalog danych mysql w systemie Linux

santosh tiwary
źródło
Witamy w Stack Overflow! Chociaż może to teoretycznie odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia.
Tim Diekmann
0

Powyższe kroki są fundamentalne i podstawowe. Śledziłem je i nadal otrzymywałem błąd „mysql nie uruchomił się”.

Aby nowy folder przechował dane mysql, musisz upewnić się, że folder ma uprawnienia i własność mysql: mysql.

Poza tym musi sprawdzić uprawnienia i własność katalogu nadrzędnego mysql, jeśli ma, powiedzmy, / data / mysql /. Tutaj / data / katalog powinien być root: root. Naprawiłem błąd „Nie udało się uruchomić mysql” po zmianie właściciela katalogu nadrzędnego / mysql. System operacyjny w mojej maszynie wirtualnej to RHEL 7.6.

user3325137William
źródło
Próbowałem selinux w RHEL7.6, zmieniając SELINUX = egzekwowanie na SELINUX = permissive, nie działało dla mnie.
user3325137William
0

Możliwe jest również dowiązanie symboliczne do datadir. Przynajmniej w macOS, środowisku deweloperskim.

(homebrew) np

# 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

Uruchom ponownie mysql.

Maciek Rek
źródło
-1

Jeśli używasz SE linux, ustaw go na tryb zezwalający, edytując / etc / selinux / config i zmieniając SELINUX = egzekwowanie na SELINUX = permissive

tanxiuguang
źródło
jak wyszczególniono tutaj serverfault.com/questions/503887/ ... selinux nie jest datadir
winny