Wie verschiebe ich das MySQL-Datenverzeichnis?

57

Ich versuche, das Datenverzeichnis meiner MySQL-Datenbank auf ein zweites Festplatten-Array zu verschieben, das ich als Mount-Punkt habe /array2/.

Das Problem, das ich habe, ist, dass ich alles ausprobiert habe und nachdem ich den Speicherort von datadir in my.cnf geändert habe, wird mysql nicht erneut gestartet.

Alles was ich bekomme ist:

start: Job failed to start
Jonny Flowers
quelle

Antworten:

62

App-Rüstung vergessen.

Für alle, die interessiert sind, habe ich Folgendes getan, um den Ordner zu verschieben.

Stoppen Sie den MySQL-Server:

stop mysql

Erstellen Sie das neue Verzeichnis:

mkdir /array2/mysql

Kopieren Sie NUR die Datenbankordner:

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

Sichern Sie die my.cnfDatei:

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

Bearbeiten Sie die my.cnfDatei:

nano /etc/mysql/my.cnf

Ändern Sie alle Erwähnungen des alten Datenverzeichnisses und Sockets in Ihren neuen Speicherort

Meins wurde:

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

Aktualisieren Sie die Verzeichnisberechtigungen:

chown -R mysql:mysql /array2/mysql

Benennen Sie das alte Verzeichnis um:

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

Erstellen Sie einen Symlink, nur für den Fall:

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

Informieren Sie AppArmor über den neuen Datadir:

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

Laden Sie die Apparmor-Profile neu

sudo /etc/init.d/apparmor reload

Dann starte mysql:

start mysql
Jonny Flowers
quelle
Dies ist eine gute Antwort, aber möglicherweise benötigen Sie noch einen Schritt, damit Clients eine Verbindung zu mysql herstellen können. Fügen Sie eine neue Gruppe mit einer Zeile darunter hinzu ... [clients] socket = / array2 / mysql / mysql.sock wobei der socket = Teil auf den neuen Speicherort Ihrer mysql.sock-Datei zeigt.
Nachteule
1
Wenn Sie nicht gestört werden wollen fusionieren /etc/apparmor.d/usr.sbin.mysqldjedes Mal mysql ein Update erhält, können Sie hinzufügen , /array2/mysql/** rwk,um /etc/apparmor.d/local/usr.sbin.mysqldstatt. Mysql hat weiterhin Zugriff auf das alte Datenverzeichnis, aber das ist wahrscheinlich kein Problem.
Drevicko
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Warum nur die Datenbankordner?
int_ua
Stellen Sie sicher, dass alle Benutzer, die ihre Daten auf ZFS verschieben (wie ich), Folgendes hinzufügen: innodb_use_native_aio=0im [mysqld]Abschnitt Ihrer my.cnfDatei, da ZFS unter Linux AIO nicht unterstützt. dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley
23

Ich fand heraus, dass AppArmor der Schuldige bei der Untersuchung des syslogwar und dass es mysqldurch Befolgung dieses Prozesses möglich war, den Speicherort der Daten erfolgreich zu ändern .

Beachten Sie, dass in den unten bearbeiteten Dateien Zeilen +hinzugefügt wurden, die mit beginnen, und Zeilen -entfernt wurden, die mit beginnen . Sie sollten die +Zeichen nicht eingeben / einfügen , wenn Sie diesen Dateien Zeilen hinzufügen.

Ich habe das mysqlVerzeichnis an den neuen Speicherort geklont :

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

Dann habe ich die datadirZeile bearbeitet in /etc/mysql/my.cnf:

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

Dann habe ich bearbeitet /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,

Dann habe ich neu gestartet mysql.

Brian Moore
quelle
13

Sei vorsichtig.

Wenn Sie InnoDB-Tabellen haben, MÜSSEN Sie die ibdata*und ib_logfile*-Dateien kopieren, sonst können Sie die Tabellen nicht verwenden. Sie erhalten:

'Tabelle' databaseName.tableName 'existiert nicht'

fehler.

Führen Sie diesen Kopierbefehl aus, um die Dateien ibdata*und zu kopieren ib_logfile*.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
Dave
quelle
Dies sollte ein Kommentar sein, es ist keine vollständige Antwort
Postadelmaga
4

Ich habe gerade einen anderen Weg ausprobiert, den einige vielleicht nützlich finden:

Kopieren mit intakten Berechtigungen:

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

sichern (falls etwas schief geht):

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

Erstelle ein neues leeres Verzeichnis anstelle des alten:

mkdir /var/lib/mysql

binde mount the new location an den alten:

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

Hoffe, das hilft jemandem, denn Symlinking hat bei mir nicht funktioniert, und das war der einfachste Weg

snapfractalpop
quelle
3

Wenn Sie Ihren Datadir verschieben, müssen Sie nicht nur die neuen Datadir-Berechtigungen erteilen, sondern auch sicherstellen, dass alle übergeordneten Verzeichnisse über Berechtigungen verfügen.

Ich habe mein Datenverzeichnis auf eine Festplatte verschoben, die in Ubuntu als:

/media/*user*/Data/

und mein datadir war Datenbanken .

Ich musste die Berechtigungen für jedes der Medien-, Benutzer- und Datenverzeichnisse auf 771 setzen :

sudo chmod 771 *DIR*

Wenn dies nicht funktioniert, können Sie mysql auch zum Laufen bringen, indem Sie den Benutzer in /etc/mysql/my.cnf in root ändern. obwohl es zweifellos einige Probleme gibt, wenn man das aus der Sicherheitsperspektive macht.

Kohjah Breese
quelle
2

Ich bevorzuge die Verwendung der Option mount with bind, um weitere Änderungen in der Apparmor- und MySQL-Konfiguration zu vermeiden.


Zum Beispiel:

Angenommen, ich möchte alles einziehen /var/www. Nehmen wir an, dieses Verzeichnis ist meine Entwicklungsumgebung und befindet sich in einer anderen Partition

  1. Zuerst müssen wir mysql stoppen :

    sudo systemctl stop mysql.service
    
  2. Wir verschieben Dateien (Erlaubnis behalten)

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

    Dadurch wird ein Verzeichnis /var/www/mysql/mit dem gesamten Inhalt erstellt.

  3. Wir entfernen alles im alten Verzeichnis:

    sudo rm -r /var/lib/mysql/*
    
  4. Wir mounten das neue Verzeichnis mit der bindOption im alten.
    editiere /etc/fstabund füge diese Zeile hinzu:

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

    Dies wird das /var/www/mysqlin unser leeres Verzeichnis mounten. /var/lib/mysql
    Die bindOption hier erledigt die Magie, es wird /var/lib/mysqlmit dem Inhalt von /var/www/mysqlgefüllt, also für MySQL und AppArMor wird es so sein, als hätte sich nichts geändert.

  5. Nun machen wir den Mount:

    sudo mount -a
    

    und starten Sie MySQL neu.

Postadelmaga
quelle
0

Ist Ihnen klar, dass es fehlschlagen wird, wenn Sie die Befehle der akzeptierten Antwort wörtlich befolgen?

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

Kopiert / var / lib / mysql nach / array2 / mysql / mysql.

Wenn Sie Ihre Konfigurationsdatei festlegen, sollten Sie / array2 / mysql / mysql als Verzeichnis angeben, da sonst Ihre mysqld nicht startet.

Die besseren Kopierbefehle wären:

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

Nur meine 2 Cent wert.

Ellison Chan
quelle