MySQL unter Windows – Teil 3: Upgrade von 5.7 zu 8.0

My_SQL_unter_Windows_3

Upgrade mittels GUI?

Innerhalb eines MySQL Major Releases (z.B. 5.7.26 -> 5.7.29) lässt sich auch ein GUI (Graphical User Interface)-gestütztes Upgrade mit Hilfe des MySQL Installers durchführen. Wird allerdings von einem Major Release auf ein anderes upgegradet, so kommen wir um ein Upgrade mittels CLI (Command Line Interface) nicht vorbei.

Im folgenden Artikel wird ein Upgrade von 5.7.29 auf 8.0.18 anhand der Beispieldatenbank Sakila durchgeführt.

Viele Wege führen nach Rom

Seit MySQL 5.7 wird auch offiziell die Möglichkeit des Inplace-Upgrades (1) unterstützt. Seit der Version 8.0.16 funktioniert dies sogar vollständig automatisch (vergl. Upgrade im Automatik-Modus). Diese Variante ist zwar mit einer Downtime des MySQL-Servers verbunden, reduziert aber den Speicherplatzbedarf, den ein Outplace-Upgrade (2) erfordert. 

Bei Variante 1 wird das bereits vorhandene Datenverzeichnis mit einer neuen MySQL-Version gestartet, während bei Variante 2 zunächst die Daten via mysqldump (o.ä.) exportiert und anschließend im neuen MySQL Server importiert werden.

Sicherheit vs. Zeit

Wie so oft im Leben muss man sich bei den Varianten zwischen Geschwindigkeit (1) und Sicherheit (2) entscheiden.

Während das Outplace-Verfahren zu jeder Zeit die Möglichkeit eines Fallbacks zur alten Version bietet, verändert das Inplace-Verfahren bei Ausführung des mysql_upgrade-Tools das originale Datenverzeichnis. Eine Rückkehr zur alten Version kann sich hierbei unter Umständen schwieriger gestalten und bedarf in jedem Fall eines Restores. Auf der anderen Seite dauert ein Outplace-Upgrade in der Regel deutlich länger.

Die Ausgangssituation

Die Sakila-Datenbank ist auf unserem MySQL-Server 5.7.29 bereits installiert. Das Datenverzeichnis liegt wie bei einer standardmäßigen Installation (siehe Artikel MySQL unter Windows Teil 1) unter C:\ProgramData\MySQL\MySQL Server 5.7\Data\, die eigentlichen Binaries entsprechend unter C:\ProgramFiles\MySQL\MySQL Server 5.7\.

Durchführung des Inplace-Upgrades

Ich entscheide mich heute für ein Inplace-Upgrade, fahre den Server runter und stelle sicher, dass der alte MySQL-Server beendet ist. Dafür können wir sowohl die Kommandozeile als auch die Windows-Dienste nutzen:
cmd> net stop mysql.service 

Anschließend stellen wir die neue Software mit Hilfe eines ZIP-Archives, anstelle des MySQL-Installers (siehe auch hierzu Artikel MySQL unter Windows Teil 1), zur Verfügung.

Die entpackte Software legen wir unter C:\Program Files\MySQL\mysql-8.0.19-winx64 ab und kopieren die ursprüngliche my.ini-Datei aus C:\Program Files\MySQL\MySQL Server 5.7\my.ini  in das neue Verzeichnis. In dieser neuen Kopie muss nun noch das Installationsverzeichnis (basedir) auf den neuen Pfad referenzieren:
basedir=:C\Program Files\MySQL\mysql-8.0.19-winx64

In unserem Fall setzen wir noch zusätzlich das Datenbankverzeichnis (datadir) um, da dieses aktuell die alte Version im Pfad beinhaltet:
datadir=C:\ProgramData\MySQL\MySQL 

Für das Datenbankverzeichnis empfiehlt sich bei diesem Schritt dann ein Pfad unabhängig von der Versionsnummer. Parallel hierzu wird das ursprüngliche Datenbankverzeichnis mit OS-Mitteln umbenannt, bevor der neue MySQL-Server mit einem Aufruf des mysqld-Binary gestartet werden kann:

C:\Program Files\MySQL\mysql-8.0.19-winx64\bin>mysqld --console

2020-04-14T13:41:09.936877Z 0 [System] [MY-010116] [Server] C:\Program Files\MySQL\mysql-8.0.19-winx64\bin\mysqld.exe (mysqld 8.0.19) starting as process 4040

2020-04-14T13:41:13.117471Z 4 [System] [MY-013381] [Server] Server upgrade from '50700' to '80019' started.

2020-04-14T13:41:27.409577Z 4 [System] [MY-013381] [Server] Server upgrade from '50700' to '80019' completed.

2020-04-14T13:41:28.032553Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.

2020-04-14T13:41:28.226074Z 0 [System] [MY-010931] [Server] C:\Program Files\MySQL\mysql-8.0.19-winx64\bin\mysqld.exe: ready for connections. Version: '8.0.19'  socket: ''  port: 3306  MySQL Community Server - GPL.

2020-04-14T13:41:28.383479Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060 

Siehe da: Ein Auto-Upgrade

Durch die Option --console sehen wir zusätzliche Ausgaben beim Starten des Servers und können an dieser Stelle bei genauer Betrachtung feststellen, dass unsere MySQL-Datenbank durch den Start bereits upgegradet wurde:
2020-04-14T13:41:13.117471Z 4 [System] [MY-013381] [Server] Server upgrade from '50700' to '80019' started.

2020-04-14T13:41:27.409577Z 4 [System] [MY-013381] [Server] Server upgrade from '50700' to '80019' completed. 

Dies ist ein Feature seit Version 8.0.16, mit dem Oracle sogar die Ausführung von mysql_upgrade durch den DBA automatisiert hat (https://dev.mysql.com/downloads/mysql/).

In diesem Falle wurde sowohl das Data Dictionary (Performance-, Informations- und Teile des MySQL-Schemas) sowie die Systemtabellen, das SYS- und die Benutzer-Schemata aktualisiert. Soll ein solches Auto-Upgrade nicht beim Start des Servers durchgeführt werden, so muss die Option --upgrade=NONE übergeben werden. Zusätzlich gibt es die Möglichkeiten, mit --upgrade=MINIMAL nur das Data Dictionary, Performance- und Information-Schema upgraden zu lassen. Die Benutzer-Schemata bleiben in diesem Falle unberührt. 

Wir haben die Sakila-Datenbank nun durch die Bereitstellung einer neuen Software Inplace upgegradet und können wieder auf die Daten zugreifen:

mysql> select * from film where film_id = 1\G
*************************** 1. row ***************************
             film_id: 1
               title: ACADEMY DINOSAUR
         description: A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies
        release_year: 2006
         language_id: 1
original_language_id: NULL
     rental_duration: 6
         rental_rate: 0.99
              length: 86
    replacement_cost: 20.99
              rating: PG
    special_features: Deleted Scenes,Behind the Scenes
         last_update: 2006-02-15 05:03:42

1 row in set (0.00 sec) 

Service, bitte!

Zum Schluss empfehle ich noch die Konfiguration eines entsprechenden Windows-Dienstes zum Starten und Stoppen des Servers. Da wir in diesem Fall die Software via ZIP-Archive zur Verfügung gestellt und nicht den MySQL-Installer verwendet haben, muss dieser Dienst noch nachträglich eingerichtet werden.

Hierzu muss der MySQL Server zunächst gestoppt werden und anschließend zwingend ein Kommandozeilenfenster als Administrator geöffnet werden.

Aus diesem Fenster heraus kann mysqld mit der Option --install aufgerufen werden:
C:\Program Files\MySQL\mysql-8.0.19-winx64\bin>mysqld --install
Service successfully installed. 
Anschließend kann der Dienst wie gewohnt gestartet und gestoppt werden:
Zu guter Letzt sollte der alte Windows-Dienst entfernt bzw. deaktiviert werden:

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/