Jak przenieść katalog danych MySQL?

57

Próbuję przenieść katalog danych mojej bazy danych MySQL do drugiej macierzy dyskowej, którą mam jako punkt podłączenia /array2/.

Problem, który mam, polega na tym, że próbowałem wszystkiego i po zmodyfikowaniu lokalizacji datadir w pliku my.cnf mysql nie uruchomi się ponownie.

Wszystko, co dostaję to:

start: Job failed to start
Jonny Flowers
źródło

Odpowiedzi:

62

Zapomniałem o zbroi aplikacji.

Dla każdego, kto jest zainteresowany, wykonałem następujące czynności, aby przenieść folder.

Zatrzymaj serwer mysql:

stop mysql

Utwórz nowy katalog:

mkdir /array2/mysql

Skopiuj TYLKO foldery bazy danych:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

Utwórz kopię zapasową my.cnfpliku:

cp /etc/mysql/my.cnf /root/my.cnf.backup

Edytuj my.cnfplik:

nano /etc/mysql/my.cnf

Zmień wszystkie wzmianki o starym katalogu danych i gnieździe na nową lokalizację

Mój stał się:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

Zaktualizuj uprawnienia do katalogu:

chown -R mysql:mysql /array2/mysql

Zmień nazwę starego katalogu:

mv /var/lib/mysql /var/lib/mysql-old

Utwórz dowiązanie symboliczne, na wszelki wypadek:

ln -s /array2/mysql /var/lib/mysql 

Poinformuj AppArmor o nowym katalogu danych:

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

Załaduj ponownie profile Apparmor

sudo /etc/init.d/apparmor reload

Następnie uruchom mysql:

start mysql
Jonny Flowers
źródło
To dobra odpowiedź, ale może być potrzebny jeszcze jeden krok, aby umożliwić klientom połączenie z mysql. Dodaj nową grupę z jednym wierszem pod nią ... [klienci] socket = / array2 / mysql / mysql.sock, gdzie część socket = wskazuje nowe położenie pliku mysql.sock.
Night Owl
1
Jeśli nie chcesz być jedno, aby połączyć /etc/apparmor.d/usr.sbin.mysqldkażdorazowo mysql odbiera aktualizacji, można dodać /array2/mysql/** rwk,do /etc/apparmor.d/local/usr.sbin.mysqldzamiast. MySQL nadal będzie mieć dostęp do starego katalogu danych, ale prawdopodobnie nie stanowi to problemu.
drevicko
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Dlaczego tylko foldery bazy danych?
int_ua
Dla każdego, kto przenosi swój katalog danych do ZFS (tak jak ja), upewnij się, że dodajesz również: innodb_use_native_aio=0w [mysqld]sekcji swojego my.cnfpliku, ponieważ ZFS na Linuksie nie obsługuje AIO. dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley
23

Odkryłem, że winowajcą był AppArmor, sprawdzając syslogi udało mi się zmienić mysqllokalizację danych, wykonując ten proces.

Pamiętaj, że w plikach edytowanych poniżej +dodano linie zaczynające się od i linie zaczynające się od -zostały usunięte. W rzeczywistości nie należy wpisywać / wklejać +znaków podczas dodawania wierszy do tych plików.

Sklonowałem mysqlkatalog do nowej lokalizacji:

sudo rsync -av /var/lib/mysql /new_dir

Następnie zredagowałem datadirwiersz w /etc/mysql/my.cnf:

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

Następnie zredagowałem /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,

Potem zrestartowałem mysql.

Brian Moore
źródło
13

Być świadomym.

Jeśli masz tabele InnoDB, MUSISZ skopiować pliki ibdata*i ib_logfile*, w przeciwnym razie nie będziesz mógł ich używać. Dostaniesz:

„Table” databaseName.tableName „nie istnieje”

błędy.

Uruchom to polecenie kopiowania, aby skopiować pliki ibdata*i ib_logfile*.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
Dave
źródło
powinien to być komentarz, nie jest to kompletna odpowiedź
Postadelmaga,
4

Właśnie wypróbowałem inny sposób, który może okazać się przydatny:

kopiuj z nienaruszonymi uprawnieniami:

rsync -avzh /var/lib/mysql /path/to/new/place

wykonaj kopię zapasową (na wypadek, gdyby coś poszło nie tak):

mv /var/lib/mysql /var/lib/_mysql

utwórz nowy pusty katalog zamiast starego:

mkdir /var/lib/mysql

bind podłącz nową lokalizację do starego:

mount -B /path/to/new/place /var/lib/mysql

Mam nadzieję, że to komuś pomaga, ponieważ symlinkowanie nie działało dla mnie, a to był najprostszy sposób

snapfractalpop
źródło
3

Jeśli przenosisz swój datadir, musisz nie tylko dać nowe uprawnienia do datadiru, ale także upewnić się, że wszystkie katalogi nadrzędne mają uprawnienia.

Przeniosłem mój katalog danych na dysk twardy, zamontowany w Ubuntu jako:

/media/*user*/Data/

a moim datadirem były bazy danych .

Musiałem ustawić uprawnienia na 771 dla każdego katalogu multimediów, użytkownika i danych:

sudo chmod 771 *DIR*

Jeśli to nie zadziała, innym sposobem na uruchomienie mysql jest zmiana użytkownika w /etc/mysql/my.cnf na root; chociaż z pewnością istnieją pewne problemy z tym związane.

Kohjah Breese
źródło
2

Wolę używać mount z opcją bind, więc unikam dalszych zmian w konfiguracji Apparmor i Mysql.


Na przykład:

Załóżmy, że chcę wszystko przenieść /var/www. Powiedzmy, że ten katalog jest moim środowiskiem programistycznym i jest zamontowany na innej partycji

  1. Najpierw musimy zatrzymać mysql :

    sudo systemctl stop mysql.service
    
  2. Przenosimy pliki (zachowując uprawnienia)

    sudo rsync -av /var/lib/mysql /var/www
    

    Spowoduje to wygenerowanie katalogu /var/www/mysql/z całą zawartością.

  3. Usuwamy wszystko ze starego katalogu:

    sudo rm -r /var/lib/mysql/*
    
  4. Montujemy nowy katalog z bindopcją w starym.
    edytuj /etc/fstabi dodaj ten wiersz:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    Spowoduje to zamontowanie /var/www/mysqlw naszym pustym katalogu /var/lib/mysql
    . bindOpcja tutaj robi magię, zapełni /var/lib/mysqlsię zawartością, /var/www/mysqlwięc dla mysql i apparmor będzie tak, jakby nic się nie zmieniło.

  5. Teraz wykonujemy montaż:

    sudo mount -a
    

    i zrestartuj mysql.

Postadelmaga
źródło
0

Czy zdajesz sobie sprawę, że jeśli wykonasz polecenia dosłownie z przyjętej odpowiedzi, to się nie powiedzie?

cp -R / var / lib / mysql / array2 / mysql

Skopiuje / var / lib / mysql do / array2 / mysql / mysql.

Po ustawieniu pliku konfiguracyjnego lepiej umieścić katalog / array2 / mysql / mysql jako katalog, bo inaczej mysqld nie uruchomi się.

Lepsze polecenia kopiowania to:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql

Tylko moje 2 centy warte.

Ellison Chan
źródło