So verschieben Sie ein MySQL-Datenverzeichnis unter Ubuntu 16.04 an einen neuen Speicherort

Einführung

Datenbanken werden im Laufe der Zeit immer größer und vergrößern manchmal den Speicherplatz im Dateisystem. Sie können auch auf E / A-Konflikte stoßen, wenn sich diese auf derselben Partition wie der Rest des Betriebssystems befinden. RAID, Netzwerkblockspeicher und andere Geräte können Redundanz und andere wünschenswerte Funktionen bieten. Unabhängig davon, ob Sie mehr Speicherplatz hinzufügen, Möglichkeiten zur Leistungsoptimierung evaluieren oder andere Speicherfunktionen nutzen möchten, führt Sie dieses Lernprogramm durch die Verlagerung des MySQL-Datenverzeichnisses.

Voraussetzungen

Um diesen Leitfaden zu vervollständigen, benötigen Sie:

In diesem Beispiel verschieben wir die Daten auf ein Blockspeichergerät, das mit/mnt/volume-nyc1-01 bereitgestellt wird. Wie Sie eine einrichten, erfahren Sie im HandbuchHow To Use Block Storage on DigitalOcean.

Unabhängig davon, welchen zugrunde liegenden Speicher Sie verwenden, können Sie mit diesem Handbuch das Datenverzeichnis an einen neuen Speicherort verschieben.

[[Schritt-1 - Verschieben des MySQL-Datenverzeichnisses]] == Schritt 1 - Verschieben des MySQL-Datenverzeichnisses

Um das Verschieben des Datenverzeichnisses von MySQL vorzubereiten, überprüfen wir den aktuellen Speicherort, indem wir eine interaktive MySQL-Sitzung mit den Administratoranmeldeinformationen starten.

mysql -u root -p

Wenn Sie dazu aufgefordert werden, geben Sie das MySQL-Root-Passwort ein. Wählen Sie dann an der MySQL-Eingabeaufforderung das Datenverzeichnis aus:

select @@datadir;
Output+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

Diese Ausgabe bestätigt, dass MySQL für die Verwendung des Standarddatenverzeichnisses/var/lib/mysql/, konfiguriert ist, sodass dies das Verzeichnis ist, das verschoben werden muss. Wenn Sie dies bestätigt haben, geben Sieexit ein, um den Monitor zu verlassen.

Um die Integrität der Daten sicherzustellen, werden wir MySQL herunterfahren, bevor wir das Datenverzeichnis tatsächlich ändern:

sudo systemctl stop mysql

systemctl zeigt nicht das Ergebnis aller Serviceverwaltungsbefehle an. Wenn Sie also sicher sein möchten, dass Sie erfolgreich waren, verwenden Sie den folgenden Befehl:

sudo systemctl status mysql

Sie können sicher sein, dass es heruntergefahren wird, wenn die letzte Zeile der Ausgabe anzeigt, dass der Server gestoppt ist:

Output. . .
Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.

Nachdem der Server heruntergefahren wurde, kopieren wir das vorhandene Datenbankverzeichnis mitrsync an den neuen Speicherort. Wenn Sie das Flag-a verwenden, bleiben die Berechtigungen und andere Verzeichniseigenschaften erhalten, während`-v` eine ausführliche Ausgabe bereitstellt, damit Sie den Fortschritt verfolgen können.

[.note] #Note: Stellen Sie sicher, dass das Verzeichnis keinen abschließenden Schrägstrich enthält, der hinzugefügt werden kann, wenn Sie die Tab-Vervollständigung verwenden. Bei einem abschließenden Schrägstrich speichertrsync den Inhalt des Verzeichnisses in den Mount-Punkt, anstatt ihn in ein Verzeichnis mitmysql zu übertragen:
#

sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

Wennrsync abgeschlossen ist, benennen Sie den aktuellen Ordner mit der Erweiterung .bak um und behalten Sie ihn bei, bis wir bestätigt haben, dass der Umzug erfolgreich war. Durch die Umbenennung vermeiden wir Verwechslungen, die durch Dateien am neuen und am alten Speicherort entstehen können:

sudo mv /var/lib/mysql /var/lib/mysql.bak

Jetzt können wir uns der Konfiguration widmen.

[[Schritt 2 - Zeigen auf den neuen Datenort]] == Schritt 2 - Zeigen auf den neuen Datenort

MySQL bietet verschiedene Möglichkeiten, Konfigurationswerte zu überschreiben. Standardmäßig istdatadir in der Datei/etc/mysql/mysql.conf.d/mysqld.cnf auf/var/lib/mysql eingestellt. Bearbeiten Sie diese Datei, um das neue Datenverzeichnis wiederzugeben:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Suchen Sie die Zeile, die mitdatadir= beginnt, und ändern Sie den folgenden Pfad, um die neue Position wiederzugeben.

In unserem Fall sieht die aktualisierte Datei folgendermaßen aus:

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .

Dies scheint der richtige Zeitpunkt zu sein, um MySQL erneut aufzurufen. Bevor wir dies erfolgreich durchführen können, müssen wir jedoch noch eine weitere Sache konfigurieren.

[[Schritt-3 - Konfigurieren von Apparmor-Zugriffssteuerungsregeln]] == Schritt 3 - Konfigurieren von AppArmor-Zugriffssteuerungsregeln

Wir müssen AppArmor anweisen, MySQL in das neue Verzeichnis schreiben zu lassen, indem Sie einen Alias ​​zwischen dem Standardverzeichnis und dem neuen Speicherort erstellen. Bearbeiten Sie dazu die Datei von AppArmoralias:

sudo nano /etc/apparmor.d/tunables/alias

Fügen Sie am Ende der Datei die folgende Alias-Regel hinzu:

/etc/apparmor.d/tunables/alias

. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .

Starten Sie AppArmor neu, damit die Änderungen wirksam werden:

sudo systemctl restart apparmor

[.Hinweis]##

Note: Wenn Sie den AppArmor-Konfigurationsschritt übersprungen haben, wird die folgende Fehlermeldung angezeigt:

OutputJob for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.

Die Ausgabe vonsystemctl undjournalctl endet mit:

OutputJul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]:
mysql.service: Main process exited, code=exited, status=1/FAILURE

Da die Nachrichten keine explizite Verbindung zwischen AppArmor und dem Datenverzeichnis herstellen, kann es einige Zeit dauern, bis dieser Fehler ermittelt ist.

[[Schritt-4 -—- Neustart von MySQL]] == Schritt 4 - Neustart von MySQL

Der nächste Schritt ist das Starten von MySQL. Andernfalls tritt jedoch ein anderer Fehler auf. Dieses Mal tritt der Fehler anstelle eines AppArmor-Problems auf, weil das Skriptmysql-systemd-start prüft, ob entweder ein Verzeichnis-d oder ein symbolischer Link-L vorhanden ist, der zwei Standardwerten entspricht Wege. Es schlägt fehl, wenn sie nicht gefunden werden:

/usr/share/mysql/mysql-systemd-start

. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
 exit 1
fi

if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
 echo "MySQL system database not found. Please run mysql_install_db tool."
 exit 1
fi

. . .

Da wir diese zum Starten des Servers benötigen, erstellen wir die minimale Verzeichnisstruktur, um die Umgebungsprüfung des Skripts zu bestehen.

sudo mkdir /var/lib/mysql/mysql -p

Now Wir sind bereit, MySQL zu starten.

sudo systemctl start mysql
sudo systemctl status mysql

Starten Sie den MySQL-Monitor, um sicherzustellen, dass das neue Datenverzeichnis tatsächlich verwendet wird.

mysql -u root -p

Schauen Sie sich den Wert für das Datenverzeichnis noch einmal an:

Output+----------------------------+
| @@datadir                  |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)

Nachdem Sie MySQL neu gestartet und bestätigt haben, dass es den neuen Speicherort verwendet, können Sie sicherstellen, dass Ihre Datenbank voll funktionsfähig ist. Nachdem Sie die Integrität vorhandener Daten überprüft haben, können Sie das Sicherungsdatenverzeichnis entfernen:

sudo rm -Rf /var/lib/mysql.bak

Starten Sie MySQL ein letztes Mal neu, um sicherzustellen, dass es wie erwartet funktioniert:

sudo systemctl restart mysql
sudo systemctl status mysql

Fazit

In diesem Tutorial haben wir das Datenverzeichnis von MySQL an einen neuen Speicherort verschoben und die AppArmor-ACLs von Ubuntu aktualisiert, um die Anpassung zu ermöglichen. Obwohl wir ein Blockspeichergerät verwendet haben, sollten die Anweisungen hier geeignet sein, den Speicherort des Datenverzeichnisses unabhängig von der zugrunde liegenden Technologie neu zu definieren.

Weitere Informationen zum Verwalten der Datenverzeichnisse von MySQL finden Sie in den folgenden Abschnitten der offiziellen MySQL-Dokumentation: